Các từ trong bảng tuần hoàn các yếu tố [đóng]


9

Quay lại khi tôi còn là học sinh năm nhất ở trường trung học chuyên ngành hóa học, tôi sẽ nhìn vào bảng tuần hoàn các nguyên tố và đánh vần các từ bẩn với số lượng các nguyên tố (HeCK sẽ là 2619, 2-6-19).

Tôi đã suy nghĩ về điều này vào một ngày khác khi tôi thấy một chiếc áo tuyệt vời đánh vần BeEr (4-68)

Vì vậy, thách thức codegolf của tôi là chương trình ngắn nhất để đưa ra danh sách các từ bạn có thể đánh vần với bảng các phần tử định kỳ VÀ mã số sẽ đại diện cho từ đó.

/ usr / share / dict / words hoặc bất kỳ từ điển nào bạn muốn sử dụng cho danh sách từ. Nếu bạn đang sử dụng danh sách từ "không chuẩn", hãy cho chúng tôi biết đó là gì!


'Mã số'? Còn những trường hợp có nhiều hơn một thì sao? Ví dụ: CO vs Co.
Peter Taylor

3
Khi tôi đọc các câu trả lời dưới đây, tôi nhận thấy một nơi mà mọi người có thể cắt ra một vài ký tự. Họ có thể loại bỏ Co, Si, Sc, Os, Hs, Po, Pb, Np, No, Yb, Cs và có thể những người khác khỏi danh sách các yếu tố của họ, vì tất cả đều có thể được xây dựng từ các yếu tố khác.
PhiNotPi

1
Không phải Ytterbium, đó là yếu tố yêu thích của tôi!
Cướp

2
Chỉ cần làm rõ, các yếu tố mà tôi liệt kê luôn có thể được gỡ bỏ một cách an toàn. Ví dụ: Ytterbium luôn có thể được thay thế bằng Yttri và Boron, bất kể danh sách từ đó thuộc ngôn ngữ nào.
PhiNotPi

1
Tôi không chắc chắn liệu tôi có hiểu hoàn toàn nhiệm vụ hay không: Chúng ta sẽ tìm các từ phù hợp cho các phần tử cho đến khi mọi phần tử được in, hoặc chúng ta sẽ in mọi từ từ dict, có thể được kết hợp từ bảng phần tử không? Hay cái gì khác?
người dùng không xác định

Câu trả lời:


6

GolfScript ( 339 303 302 301 294 ký tự)

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

Với khoản tín dụng cho PhiNotPi có quan sát về các yếu tố không cần thiết cho phép tôi lưu 33 ký tự.

Đây là IMO GolfScript thành ngữ hơn nhiều so với cách tiếp cận đệ quy trước đó.

Lưu ý rằng tôi cho phép các từ trong từ điển được trộn lẫn ( Llà một chức năng cho văn bản chữ thường với giả định rằng nó không thành vấn đề nếu các ký tự không phải alpha bị hỏng) nhưng từ chối bất kỳ dấu nháy hoặc dấu.

Vì đây là môn đánh gôn, tôi đã tối ưu hóa độ dài mã hơn là tốc độ. Đây là chậm khủng khiếp. Nó hy vọng danh sách từ sẽ được cung cấp tại stdin và xuất ra stdout ở định dạng:

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

(viết tắt bất kỳ từ đầu vào trường hợp hỗn hợp nào mà nó tìm thấy khớp).

Nếu bạn quan tâm đến các yếu tố hơn các con số mỗi lần, với mức giá thấp thấp là 261 253 ký tự bạn có thể sử dụng

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

cung cấp đầu ra như

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

Lấy nhân vật phụ ra, "không làm phiền tôi chút nào. Và dĩ nhiên, peter taylor bước vào và thổi bay mọi người bằng golf.
Cướp

3

Hồng ngọc - 547 393

Phiên bản mới, cảm ơn những lời đề nghị:

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
}

sử dụng biểu thức. chậm và nhiều chỗ để cải thiện nhưng tôi phải đi ngay bây giờ :-)


1
1) Bạn có thể lưu trữ dự phòng bằng cách sử dụng thủ thuật của Peter Taylor (như trong mã gốc của anh ấy) : e='HHeLiBe...LvUusUuo'.scan(/[A-Z][a-z]*/).map &:downcase. 2) regex biến không bao giờ được sử dụng. 3) Đọc các từ từ đầu vào tiêu chuẩn : $<.each{|w|.... Với những sửa đổi này, mã đã giảm xuống còn 410 ký tự.
manatwork

Tôi nghĩ rằng bạn cũng có thể áp dụng cách tiếp cận tiết kiệm không gian tương tự cho các yếu tố không cần thiết, với chi phí thêm hai ký tự vào biểu thức quét. Sử dụng không gian nếu bạn không thích dòng mới - Tôi chủ yếu sử dụng dòng mới để không cần phải cuộn để xem vòng lặp chính.
Peter Taylor

2

Con trăn 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()

Chắc chắn sẽ có chỗ để cải thiện ở đâu đó. Cũng đáng lưu ý rằng mức độ thụt thứ hai sử dụng ký tự tab.

Chỉ mất hơn 5 giây (trên máy tính của tôi) để đi qua toàn bộ từ điển, tạo ra kết quả như thế này:

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

Bằng cách thêm 18 ký tự khác, bạn có thể nhận được đầu ra với viết hoa đúng:

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

Bạn cũng có thể kiểm tra từng từ riêng lẻ:

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

Bạn có thể thêm cái đầu ra viết hoa đúng không? Tôi nghĩ rằng nó khá gọn gàng và tôi khá mới với python.
Cướp

0

Python - 1328 (975 + 285 ký tự mã + 68 mã từ điển)

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)

Đối với phần từ điển:

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

Nó thực sự ngắn hơn để sử dụng một khởi tạo băm rõ ràng hơn là sử dụng một khởi tạo mảng rõ ràng và biến nó thành một chỉ mục của hàm băm?
Peter Taylor

Tôi chỉ sử dụng một từ điển để dễ sử dụng. Có một loạt các bộ dữ liệu sẽ tốn kém hơn một chút về nhân vật. Mặc dù đặt hàng các yếu tố sẽ là một ý tưởng tốt ...
beary605

0

C, 775 771 ký tự

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

Đầu vào : Word trên mỗi dòng, phải là chữ thường. usr/share/dict/wordsỔn.
Đầu ra : Word và số, vd:acceptances,89,58,15,73,7,6,99

Logic :
c(w,o,l)kiểm tra từ w, bắt đầu bằng phần tử l.
Đệ quy hai chiều được sử dụng - nếu phần tử đầu tiên khớp với phần đầu của danh sách phần tử, hãy kiểm tra phần còn wlại so với danh sách phần tử đầy đủ. Nếu trận đấu này thất bại, hãy kiểm tra từ so với đuôi của danh sách.
Bộ đệm otích lũy các số phần tử dọc theo đường dẫn thành công. Sau một trận đấu, nó sẽ chứa danh sách các số và được in.

Vấn đề :
Danh sách không được mã hóa hiệu quả - quá nhiều ",". Nhưng cách này dễ sử dụng. Tôi chắc chắn rằng nó có thể được cải thiện nhiều, mà không mất quá nhiều chi phí trong mã.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.