Elementlerin periyodik tablosundan kelimeler [kapalı]


9

Lise kimyasında birinci sınıftayken, elementlerin periyodik tablosuna bakar ve elementlerin sayısı ile kirli kelimeleri söylerdim (HeCK 2619, 2-6-19 olurdu).

Geçen gün BeEr'i heceleyecek inanılmaz bir gömlek gördüğümde bunu düşünüyordum

Bu yüzden benim codegolf meydan okuma elementlerin periyodik tablosu VE bu kelimeyi temsil edecek sayı kodu ile heceleyebilirsiniz kelimelerin bir listesini çıkarmak için en kısa programdır.

/ usr / share / dict / words veya kelime listesi için kullanmak istediğiniz herhangi bir sözlük. "Standart olmayan" bir kelime listesi kullanıyorsanız bunun ne olduğunu bize bildirin!


'Numara' kodu mu? Birden fazla vaka olduğunda ne olur? Eg CO vs Co.
Peter Taylor

3
Aşağıdaki yanıtları okurken herkesin birkaç karakter kesebileceği bir yer fark ettim. Co, Si, Sc, Os, Hs, Po, Pb, Np, No, Yb, Cs ve belki de başkalarını eleman listelerinden çıkarabilirler, çünkü hepsi diğer elemanlardan inşa edilebilir.
PhiNotPi

1
Ytterbium değil, bu benim en sevdiğim unsur!
Rob

2
Açıklığa kavuşturmak için, listelediğim öğeler her zaman güvenli bir şekilde kaldırılabilir. Örneğin, kelime listesinin dili ne olursa olsun
Ytterbium

1
Görevi tamamen anladığımdan emin değilim: Her öğe yazdırılana kadar öğeler için eşleşen sözcükler bulalım mı, yoksa öge tablosundan birleştirilebilen her kelimeyi dikte yazalım mı? Veya başka bir şey?
kullanıcı bilinmiyor

Yanıtlar:


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

Gereksiz unsurlarla ilgili gözlemleri 33 karakterden tasarruf etmeme izin veren PhiNotPi'ye teşekkür ederim .

Bu IMO önceki özyinelemeli yaklaşımdan çok daha deyimsel GolfScript.

Sözlükteki kelimelerin karışık duruma ( Lalfa olmayan karakterlerin kırılıp kırılmayacağı önemli olmadığı varsayımıyla küçük harfli bir işlevdir) izin verdiğimi, ancak kesme işareti veya aksanla reddettiğimi unutmayın.

Bu kod golf olduğundan, hız yerine kod uzunluğu için optimize ettik. Bu çok yavaş. Sözcük listesinin stdin'de sağlanmasını ve çıktıların stdout biçiminde olmasını bekler:

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

(eşleştiği karışık harf giriş kelimelerini küçük harflerle yazılır).

Elemanlara daha çok ilgi duyuyorsanız, 261 253 karakterlik düşük fiyat için kullanabilirsiniz

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

hangi gibi çıktı verir

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

Ekstra karakteri çıkar, "beni hiç rahatsız etmiyor. Ve elbette peter taylor içeri girer ve golfscript ile herkesi havaya uçurur.
Rob

3

Yakut - 547 393

Yeni sürüm, öneriler için teşekkürler:

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
}

regexes kullanır. yavaş ve iyileştirilmesi için çok yer ama şimdi gitmek gerekir :-)


1
1) () yaptığı kodda olduğu gibi Peter Taylor'ın hile kullanarak depolamayı ayırabiliyorum: e='HHeLiBe...LvUusUuo'.scan(/[A-Z][a-z]*/).map &:downcase. 2) Değişken normal ifade asla kullanılmaz. 3) standart girdiden kelimeleri oku: $<.each{|w|.... Bu değişiklikle kod 410 karaktere indirildi.
manatwork

Tarama regex'e iki karakter eklemek pahasına, gereksiz öğeler için de aynı yerden tasarruf yaklaşımını uygulayabileceğinizi düşünüyorum. Yeni satırları sevmiyorsanız alan kullanın - Ana satırları görmek için kaydırmaya gerek kalmaması için yeni satırları kullanıyorum.
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()

Orada bir yerde iyileştirme için yer olduğundan emin olabilirsiniz. Ayrıca ikinci girintinin sekme karakterini kullandığını da belirtmek gerekir.

Sözlüğün tamamının üzerinden geçerek (bilgisayarımda) sadece 5 saniyeden fazla sürüyor ve şöyle çıktı üretiliyor:

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

Başka 18 karakter daha ekleyerek , doğru büyük / küçük harfle çıktı alabilirsiniz:

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

Ayrıca kelimeleri tek tek de kontrol edebilirsiniz:

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

Uygun büyük harf kullanımı sağlayanı ekleyebilir misiniz? Bence bu oldukça düzenli ve python için oldukça yeniyim.
Rob

0

Python - 1328 (975 + 285 kod kodu + 68 sözlük kodu)

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)

Sözlük bölümü için:

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

Açık bir karma başlatma kullanmak, açık bir dizi başlatma kullanmak ve onu bir karma indeksine dönüştürmekten daha mı kısadır?
Peter Taylor

Kullanım kolaylığı için sadece sözlük kullandım. Bir dizi tuple sahip olmak biraz daha karakterli olacaktır. Her ne kadar öğeleri sipariş iyi bir fikir olurdu ...
beary605 09

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

Girdi : Satır başına sözcük, küçük harf olmalıdır. usr/share/dict/wordsiyi.
Çıktı : Kelime ve sayılar, örneğin:acceptances,89,58,15,73,7,6,99

Mantık : öğeden başlayarak
c(w,o,l)kelimeyi kontrol eder . İki yönlü özyineleme kullanılır - ilk öğe, öğe listesinin başıyla eşleşiyorsa, kalan öğeyi tam öğe listesine göre kontrol edin . Bu eşleşme başarısız olursa, listenin kuyruğundaki kelimeyi kontrol edin. Arabellek , başarılı yol boyunca eleman numaralarını biriktirir. Bir eşleşmeden sonra, numaraların listesini içerir ve yazdırılır.wl
w
o

Sorunlar :
Liste verimli bir şekilde kodlanmadı - çok fazla "ve ,". Ama bu şekilde kullanımı kolaydır. Eminim, kodda çok fazla maliyet olmadan çok daha geliştirilebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.