Kata-kata dari tabel elemen periodik [ditutup]

9

Kembali ketika saya masih mahasiswa baru di sekolah menengah mengambil kimia, saya akan melihat tabel periodik elemen dan mengeja kata-kata kotor dengan jumlah elemen (HeCK akan menjadi 2619, 2-6-19).

Saya sedang memikirkan hal ini beberapa hari yang lalu ketika saya melihat kemeja luar biasa yang bertuliskan BeEr (4-68)

Jadi tantangan codegolf saya adalah program terpendek untuk menampilkan daftar kata yang dapat Anda eja dengan tabel periodik elemen DAN kode angka yang akan mewakili kata itu.

/ usr / share / dikt / kata atau kamus apa pun yang ingin Anda gunakan untuk daftar kata. Jika Anda menggunakan daftar kata "non-standar", beri tahu kami apa itu!

rampok
sumber
Kode angka 'The'? Bagaimana dengan kasus di mana ada lebih dari satu? Misalnya CO vs Co.
Peter Taylor
3
Ketika saya membaca tanggapan di bawah, saya perhatikan satu tempat yang semua orang bisa hilangkan beberapa karakter. Mereka mungkin menghapus Co, Si, Sc, Os, Hs, Po, Pb, Np, Tidak, Yb, Cs, dan mungkin yang lain dari daftar elemen mereka, karena mereka semua dapat dibangun dari elemen lain.
PhiNotPi
1
Bukan Ytterbium, itu elemen favorit saya!
Rob
2
Hanya untuk memperjelas, elemen yang saya daftarkan selalu dapat dihapus dengan aman. Misalnya, Ytterbium selalu dapat diganti dengan Yttrium dan Boron, tidak peduli bahasa apa daftar kata itu.
PhiNotPi
1
Saya tidak yakin apakah saya memahami tugas sepenuhnya: Apakah kita akan menemukan kata yang cocok untuk elemen sampai setiap elemen dicetak, atau akankah kita mencetak setiap kata dari dikt, yang dapat digabungkan dari tabel elemen? Atau sesuatu yang lain?
pengguna tidak diketahui

Jawaban:

6

GolfScript ( 339 303 302 301 294 karakter)

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}%;

Dengan kredit ke PhiNotPi yang pengamatannya pada elemen yang tidak perlu memungkinkan saya untuk menyimpan 33 karakter.

Ini adalah IMO GolfScript jauh lebih idiomatik daripada pendekatan rekursif sebelumnya.

Perhatikan bahwa saya membiarkan kata-kata dalam kamus menjadi huruf besar ( Ladalah fungsi untuk huruf kecil dengan asumsi bahwa tidak masalah jika karakter non-alpha rusak) tetapi tolak dengan apostrof atau aksen.

Karena ini adalah kode golf, saya telah dioptimalkan untuk panjang kode daripada kecepatan. Ini sangat lambat. Itu mengharapkan daftar kata yang akan disediakan di stdin dan output ke stdout dalam format:

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

(huruf kecil kata-kata masukan kasus campuran yang ditemukannya cocok).

Jika Anda lebih tertarik pada elemen daripada angka per se, untuk harga rendah rendah 261 253 karakter yang dapat Anda gunakan

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

yang memberikan output seperti

"Ac"
"AcCRa"
"AcHeBe"
...
Peter Taylor
sumber
Keluarkan karakter ekstra, "tidak mengganggu saya sama sekali. Dan tentu saja peter taylor masuk dan meniup semua orang dengan skrip golf.
Rob
3

Ruby - 547 393

Versi baru, terima kasih atas sarannya:

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
}

menggunakan regex. lambat, dan banyak ruang untuk perbaikan tetapi saya harus pergi sekarang :-)

Patrick Oscity
sumber
1
1) Anda bisa meluangkan penyimpanan dengan menggunakan trik Peter Taylor (seperti dalam kode aslinya): e='HHeLiBe...LvUusUuo'.scan(/[A-Z][a-z]*/).map &:downcase. 2) Regex variabel tidak pernah digunakan. 3) Bacalah kata-kata dari input standar: $<.each{|w|.... Dengan modifikasi ini kode dikurangi menjadi 410 karakter.
manatwork
Saya pikir Anda dapat menerapkan pendekatan hemat-ruang yang sama untuk elemen yang tidak perlu juga, dengan biaya menambahkan dua karakter ke regex pindai. Gunakan ruang jika Anda tidak suka baris baru - Saya menggunakan baris baru terutama sehingga tidak perlu menggulir untuk melihat loop utama.
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()

Pasti ada ruang untuk perbaikan di sana di suatu tempat. Perlu juga dicatat bahwa indentasi tingkat kedua menggunakan karakter tab.

Hanya butuh lebih dari 5 detik (di komputer saya) untuk menelusuri seluruh kamus, menghasilkan keluaran seperti ini:

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

Dengan menambahkan 18 karakter lain, Anda bisa mendapatkan output dengan huruf besar yang tepat:

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]
...

Anda juga dapat memeriksa setiap kata:

>>> m("beer")
('beer', [4, 68])
grc
sumber
Bisakah Anda menambahkan yang menghasilkan kapitalisasi yang tepat? Saya pikir itu cukup rapi dan saya cukup baru untuk python.
Rob
0

Python - 1328 (975 + 285 karakter kode + 68 kode kamus)

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)

Untuk bagian kamus:

f=open(input(),'r')
for i in f.readlines():print p(i[:-1])
f.close()
beary605
sumber
Ini benar-benar lebih pendek untuk menggunakan inisialisasi hash eksplisit daripada menggunakan inisialisasi array eksplisit dan mengubahnya menjadi indeks-hash?
Peter Taylor
Saya hanya menggunakan kamus untuk kemudahan penggunaan. Memiliki serangkaian tupel akan sedikit lebih mahal karakter. Meskipun memesan elemen akan menjadi ide yang baik ...
beary605
0

C, 775 771 karakter

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);
}

Input : Kata per baris, harus huruf kecil. usr/share/dict/wordsbaik-baik saja.
Output : Word dan angka, mis .:acceptances,89,58,15,73,7,6,99

Logika :
c(w,o,l)memeriksa kata w, dimulai dengan elemen l.
Rekursi dua arah digunakan - jika elemen pertama cocok dengan kepala daftar elemen, periksa sisa-sisa dari wdaftar elemen lengkap. Jika kecocokan ini gagal, periksa kata di bagian ujung daftar.
Buffer omengakumulasi nomor elemen di sepanjang jalur yang berhasil. Setelah pertandingan, itu akan berisi daftar angka, dan dicetak.

Masalah :
Daftar ini tidak dikodekan secara efisien - terlalu banyak "dan ,". Tapi dengan cara ini mudah digunakan. Saya yakin itu bisa lebih ditingkatkan, tanpa terlalu banyak biaya dalam kode.

ugoren
sumber