元素の周期表からの単語[終了]


9

私が高校で化学を専攻している新入生のとき、私は元素の周期表を見て、元素の数で汚い言葉を綴っていました(HeCKは2619、2-6-19)。

先日、BeEr(4-68)と書かれた素晴らしいシャツを見たとき、これについて考えていました。

したがって、私のcodegolfチャレンジは、要素の周期表とその単語を表す数字コードで綴ることができる単語のリストを出力するための最短のプログラムです。

/ usr / share / dict / wordsまたは単語リストに使用したい辞書。「非標準」の単語リストを使用している場合は、それを教えてください。


「The」番号コード?複数ある場合はどうですか?例:CO vs Co.
— ピーターテイラー

3
以下の回答を読んでいると、誰もがいくつかのキャラクターを切り取れる場所が1つあることに気づきました。これらはすべてCo、Si、Sc、Os、Hs、Po、Pb、Np、No、Yb、Csなどを要素リストから削除する可能性があります。これらはすべて他の要素から構築できるためです。
— PhiNotPi

1
イッテルビウムではなく、それが私のお気に入りの要素です!
— Rob

2
明確にするために、リストした要素はいつでも安全に削除できます。例えば、イッテルビウムは常にイットリウムとホウ素、単語リストが入っているどの言語にかかわらずに置き換えることができます。
— PhiNotPi

1
タスクを完全に理解しているかどうかはわかりません。すべての要素が印刷されるまで、要素に一致する単語を見つけますか、それとも、要素テーブルから組み合わせることができる辞書からすべての単語を印刷しますか?または、他の何か?
— ユーザー不明

回答:


6

GolfScript(339 303 302 301 294文字)

n/{{{32|}%}:L~['']{{`{\+}+'HHeLiBeBCNOFNeNaMgAl
PSClArKCa TiVCrMnFe


ZnGaGeAsSeBrKrRbSrYZr
MoTcRuRhPdAgCd


TeIXe
BaLaCePrNdPmSmEuGdTbDy
ErTm
Lu
TaWRe
IrPtAuHgTl


AtRnFrRaAcThPaU

AmCm

EsFmMd
LrRfDbSg

MtDsRg
UutFl
Lv'{[1/{.0=96>{+}*}/]}:S~:^/}%.{L}%2$?.){=S{^?}%`+p 0}{;{L.,2$<=},.}if}do}%;

クレジット付きのPhiNotPiその観測不要な要素に私が33個の文字を保存することができました。

これは、以前の再帰的なアプローチよりもはるかに慣用的なGolfScriptです。

辞書の単語は大文字と小文字を混在させることができますが(L非英字が壊れても問題ないと想定して小文字のテキストを処理する関数です)、アポストロフィまたはアクセントを使用して拒否します。

これはコードゴルフなので、速度ではなくコード長を最適化しました。これはひどく遅いです。単語リストがstdinで提供され、次の形式でstdoutに出力されることを想定しています。

"ac[89]"
"accra[89 6 88]"
"achebe[89 2 4]"
...

(一致が見つかった大文字と小文字が混在する入力ワードはすべて小文字)。

数値自体よりも要素に関心がある場合は、261 253文字という低価格で使用できます

n/{{{32|}%}:L~['']{{`{\+}+'HHeLiBeBCNOFNeNaMgAlPSClArKCaTiVCrMnFeZnGaGeAsSeBrKrRbSrYZrMoTcRuRhPdAgCdTeIXeBaLaCePrNdPmSmEuGdTbDyErTmLuTaWReIrPtAuHgTlAtRnFrRaAcThPaUAmCmEsFmMdLrRfDbSgMtDsRgUutFlLv'[1/{.0=96>{+}*}/]/}%.{L}%2$?.){=p 0}{;{L.,2$<=},.}if}do}%;

次のような出力が得られます

"Ac"
"AcCRa"
"AcHeBe"
...

余分なキャラクターを取り出して、"まったく気になりません。そしてもちろん、ピーター・テイラーがやって来て、golfscriptでみんなを吹き飛ばします。
— Rob

3

ルビー-547 393

新しいバージョン、提案をありがとう:

e='HHeLiBeBCNOFNeNaMgAlSiPSClArKaCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCnUutFlUupLvUusUuo'.scan(/[A-Z][a-z]*/).map &:upcase
r="(#{e.join ?|})"
$<.each{|w|(i=0;i+=1 until w=~/^#{r*i}$/i
$><<w;p$~.to_a[1..-1].map{|m|e.index(m.upcase)+1})if w=~/^#{r}+$/i}

e=%w{h he li be b c n o f ne na mg al si p s cl ar ka ca sc ti v cr mn fe co ni cu zn ga ge as se br kr rb sr y zr nb mo tc ru rh pd ag cd in sn sb te i xe cs ba la ce pr nd pm sm eu gd tb dy ho er tm yb lu hf ta w re os ir pt au hg tl pb bi po at rn fr ra ac th pa u np pu am cm bk cf es fm md no lr rf db sg bh hs mt ds rg cn uut fl uup lv uus uuo}
x = "(#{e.join(?|)})"
regex = /^#{x}+$/i
File.foreach('/usr/share/dict/words'){|w|
if w=~/^#{x}+$/i
puts w
i=1
i+=1 until w=~/^#{x*i}$/i 
puts $~[1..-1].map{|m|e.index(m.downcase)+1}.join ?-
end
}

正規表現を使用します。遅く、そして改善の余地はたくさんありますが、私は今行かなければなりません:-)


1
1)Peter Taylorのトリック(元のコードと同様)を使用して、ストレージを節約できますe='HHeLiBe...LvUusUuo'.scan(/[A-Z][a-z]*/).map &:downcase。2)可変正規表現は使用されません。3)標準入力から単語を読み取ります$<.each{|w|...。これらの変更により、コードは410文字に削減されました。
— manatwork 2012年

スキャン正規表現に2文字追加することを犠牲にして、不要な要素にも同じスペース節約アプローチを適用できると思います。改行が気に入らない場合はスペースを使用してください。メインループを表示するためにスクロールする必要がないように、私は主に改行を使用しています。
— Peter Taylor

2

Python 710(357 + 261 + 92)

e=". h he li be b c n o f ne na mg al si p s cl ar k ca sc ti v cr mn fe co ni cu zn ga ge as se br kr rb sr y zr nb mo tc ru rh pd ag cd in sn sb te i xe cs ba la ce pr nd pm sm eu gd tb dy ho er tm yb lu hf ta w re os ir pt au hg tl pb bi po at rn fr ra ac th pa u np pu am cm bk cf es fm md no lr rf db sg bh hs mt ds rg cn uut fl uup lv uus uuo".split()

i=e.index
def m(w,p=("",[])):
 if not w:return p
 x,y,z=w[0],w[:2],w[:3]
 if x!=y and y in e:
    a=m(w[2:],(p[0]+y,p[1]+[i(y)]))
    if a:return a
 if x in e:
    b=m(w[1:],(p[0]+x,p[1]+[i(x)]))
    if b:return b
 if z in e:
    c=m(w[3:],(p[0]+z,p[1]+[i(z)]))
    if c:return c

f=open('/usr/share/dict/words','r')
for l in f:
 x=m(l[:-1])
 if x:print x[0],x[1]
f.close()

どこかに改善の余地があるはずです。また、インデントの第2レベルではタブ文字を使用していることにも注意してください。

ディクショナリー全体を処理するのに(私のコンピューターでは)5秒強かかり、次のような出力が生成されます。

acaciin [89, 89, 53, 49]
acacin [89, 89, 49]
acalycal [89, 13, 39, 6, 13]
...

さらに18文字を追加すると、適切な大文字で出力を取得できます。

e=". H He Li Be B C N O F Ne Na Mg Al Si P S Cl Ar K Ca Sc Ti V Cr Mn Fe Co Ni Cu Zn Ga Ge As Se Br Kr Rb Sr Y Zr Nb Mo Tc Ru Rh Pd Ag Cd In Sn Sb Te I Xe Cs Ba La Ce Pr Nd Pm Sm Eu Gd Tb Dy Ho Er Tm Yb Lu Hf Ta W Re Os Ir Pt Au Hg Tl Pb Bi Po At Rn Fr Ra Ac Th Pa U Np Pu Am Cm Bk Cf Es Fm Md No Lr Rf Db Sg Bh Hs Mt Ds Rg Cn Uut Fl Uup Lv Uus Uuo".split()

i=e.index
def m(w,p=("",[])):
 if not w:return p
 w=w.capitalize()
 x,y,z=w[0],w[:2],w[:3]
 if x!=y and y in e:
    a=m(w[2:],(p[0]+y,p[1]+[i(y)]))
    if a:return a
 if x in e:
    b=m(w[1:],(p[0]+x,p[1]+[i(x)]))
    if b:return b
 if z in e:
    c=m(w[3:],(p[0]+z,p[1]+[i(z)]))
    if c:return c

OUTPUT:

AcAcIIn [89, 89, 53, 49]
AcAcIn [89, 89, 49]
AcAlYCAl [89, 13, 39, 6, 13]
...

個々の単語をチェックすることもできます:

>>> m("beer")
('beer', [4, 68])

適切な大文字を出力するものを追加できますか?私はそれがかなりきちんとしていると私はpythonにかなり新しいと思います。
— Rob

0

Python-1328(975 + 285文字のコード+ 68辞書コード)

t1={'c':6,'b':5,'f':9,'i':53,'h':1,'k':19,'o':8,'n':7,'p':15,
's':16,'u':92,'w':74,'v':23,'y':39}
t2={'ru':44,'re':75,'rf':104,'rg':111,'ra':88,'rb':37,
'rn':86,'rh':45,'be':4,'ba':56,'bh':107,'bi':83,
'bk':97,'br':35,'os':76,'ge':32,'gd':64,'ga':31,
'pr':59,'pt':78,'pu':94,'pb':82,'pa':91,'pd':46,
'cd':48,'po':84,'pm':61,'hs':108,'ho':67,'hf':72,
'hg':80,'he':2,'md':101,'mg':12,'mo':42,'mn':25,
'mt':109,'zn':30,'eu':63,'es':99,'er':68,'ni':28,
'no':102,'na':11,'nb':41,'nd':60,'ne':10,'np':93,
'fr':87,'fe':26,'fl':114,'fm':100,'sr':38,'kr':36,
'si':14,'sn':50,'sm':62,'sc':21,'sb':51,'sg':106,
'se':34,'co':27,'cn':112,'cm':96,'cl':17,'ca':20,
'cf':98,'ce':58,'xe':54,'lu':71,'cs':55,'cr':24,
'cu':29,'la':57,'li':3,'lv':116,'tl':81,'tm':69,
'lr':103,'th':90,'ti':22,'te':52,'tb':65,'tc':43,
'ta':73,'yb':70,'db':105,'dy':66,'ds':110,'at':85,
'ac':89,'ag':47,'ir':77,'am':95,'al':13,'as':33,
'ar':18,'au':79,'zr':40,'in':49}
t3={'uut':113,'uuo':118,'uup':115,'uus':117}
def p(s):
 o=0;b=0;a=[];S=str;l=S.lower;h=dict.has_key;L=len
 while o<L(s):
  D=0
  for i in 1,2,3:exec('if h(t%d,l(s[o:o+%d])) and b<%d:a+=[S(t%d[s[o:o+%d]])];o+=%d;b=0;D=1'%(i,i,i,i,i,i))
  if D==0:
   if b==3 or L(a)==0:return
   else:b=L(S(a[-1]));o-=b;a.pop()
 return '-'.join(a)

辞書部分の場合:

f=open(input(),'r')
for i in f.readlines():print p(i[:-1])
f.close()

明示的な配列の初期化を使用してそれをインデックスのハッシュに変換するよりも、明示的なハッシュの初期化を使用する方が本当に短いですか?
— Peter Taylor

私は使いやすさのために辞書を使いました。タプルの配列を持つと、少しコストが高くなります。要素を
— 順序付けるの

0

C、775 771文字

char*e[]={"h","he","li","be","b","c","n","o","f","ne","na","mg","al","si","p","s","cl","ar","k","ca","sc","ti","v","cr","mn","fe","co","ni","cu","zn","ga","ge","as","se","br","kr","rb","sr","y","zr","nb","mo","tc","ru","rh","pd","ag","cd","in","sn","sb","te","i","xe","cs","ba","la","ce","pr","nd","pm","sm","eu","gd","tb","dy","ho","er","tm","yb","lu","hf","ta","w","re","os","ir","pt","au","hg","tl","pb","bi","po","at","rn","fr","ra","ac","th","pa","u","np","pu","am","cm","bk","cf","es","fm","md","no","lr","rf","db","sg","bh","hs","mt","ds","rg","cn","uut","fl","uup","lv","uus","uu",0};
b[99],n;
c(w,o,l)char*w,*o,**l;{
    return!*w||!strncmp(*l,w,n=strlen(*l))&&c(w+n,o+sprintf(o,",%d",l-e+1),e)||*++l&&c(w,o,l);
}
main(){
    while(gets(b))c(b,b+9,e)&&printf("%s%s\n",b,b+9);
}

入力:1行あたりの単語。小文字でなければなりません。usr/share/dict/words結構です。
出力:単語と数字、例:acceptances,89,58,15,73,7,6,99

ロジック:elementで始まる
c(w,o,l)単語をチェックwしますl。
双方向の再帰が使用されます。最初の要素が要素リストの先頭と一致する場合は、残りのw要素を完全な要素リストと照合してください。この一致が失敗した場合は、単語をリストの末尾と照合します。
バッファoは、成功したパスに沿って要素番号を蓄積します。一致すると、番号のリストが含まれ、印刷されます。

問題:
-あまりにも多くのリストを効率的に符号化されていない"と,、」しかし、この方法は、それを使用するのは簡単だ、私は確信して、それは多くのコードではあまりコストをかけずに、改善することができるんです。。。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.