주기율표의 단어 [닫기]


9

내가 고등학교에서 화학을 복용하는 신입생이었을 때, 나는 원소 주기율표를보고 원소의 수로 더러운 단어를 철자했습니다 (HeCK는 2619, 2-6-19 일 것입니다).

나는 다른 날 BeEr을 철자하는 놀라운 셔츠를 보았을 때 이것에 대해 생각하고있었습니다 (4-68).

그래서 내 코드 골프 도전은 원소 주기율표와 해당 단어를 나타내는 숫자 코드로 철자 할 수있는 단어 목록을 출력하는 가장 짧은 프로그램입니다.

/ usr / share / dict / words 또는 단어 목록에 사용하려는 사전. "비표준"단어 목록을 사용하는 경우 그 단어가 무엇인지 알려주십시오!


'번호'? 둘 이상인 경우는 어떻습니까? 예 : CO vs Co.
Peter Taylor

3
아래의 답변을 읽으면서 모두가 몇 글자를 잘라낼 수있는 곳을 발견했습니다. Co, Si, Sc, Os, Hs, Po, Pb, Np, No, Yb, Cs 및 기타 요소를 다른 요소로 구성 할 수 있으므로 요소 목록에서 제거 할 수 있습니다.
PhiNotPi

1
이테르븀이 아니라, 그것이 내가 가장 좋아하는 요소입니다!
Rob

2
명확히하기 위해 내가 나열된 요소는 항상 안전하게 제거 할 수 있습니다. 예를 들어, 단어 목록이 어떤 언어에 있든지 이테르븀은 항상 이트륨과 붕소로 대체 ​​될 수 있습니다.
PhiNotPi

1
작업을 완전히 이해했는지 확실하지 않습니다. 모든 요소가 인쇄 될 때까지 요소에 일치하는 단어를 찾거나 요소 테이블에서 결합 할 수있는 dict의 모든 단어를 인쇄해야합니까? 또는 다른 것?
사용자가 알 수 없음

답변:


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

불필요한 요소에 대한 관찰로 33자를 절약 할 수있는 PhiNotPi에 대한 신용으로 .

이것은 이전 재귀 접근법보다 훨씬 관용적 인 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"
...

여분의 캐릭터를 꺼내어 "전혀 귀찮게하지 않습니다. 물론 피터 테일러가 와서 골프 스크립트로 모두를 날려 버립니다.
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

스캔 정규 표현식에 두 문자를 추가하는 대신 불필요한 요소에 대해서도 동일한 공간 절약 방식을 적용 할 수 있다고 생각합니다. 줄 바꿈이 마음에 들지 않으면 공간을 사용하십시오. 주로 줄 바꿈을 사용하기 위해 스크롤을 할 필요가 없도록 줄 바꿈을 주로 사용하고 있습니다.
피터 테일러

2

파이썬 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()

어딘가에 개선의 여지가있을 것입니다. 들여 쓰기의 두 번째 수준이 탭 문자를 사용한다는 점도 주목할 가치가 있습니다.

내 사전에서 전체 사전을 처리하는 데 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])

적절한 대문자를 출력하는 것을 추가 할 수 있습니까? 나는 그것이 꽤 깔끔하다고 생각하고 파이썬에 익숙하지 않다.
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()

명시 적 배열 초기화를 사용하여 해시 색인으로 전환하는 것보다 명시 적 해시 초기화를 사용하는 것이 실제로 더 짧은가요?
피터 테일러

방금 사용 편의성을 위해 사전을 사용했습니다. 튜플 배열을 갖는 것은 약간 더 많은 비용이들 것입니다. 요소를 주문하는 것이 좋은 생각
이지만

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

입력 : 줄당 단어는 소문자 여야합니다. usr/share/dict/words괜찮습니다.
출력 : 단어 및 숫자, 예 :acceptances,89,58,15,73,7,6,99

논리 : 요소로 시작
c(w,o,l)하여 단어를 확인합니다 . 양방향 재귀가 사용됩니다. 첫 번째 요소가 요소 목록의 헤드와 일치하면 나머지를 전체 요소 목록 과 비교하십시오. 일치하지 않으면 목록의 꼬리와 단어를 비교하십시오. 버퍼 는 성공적인 경로를 따라 요소 번호를 누적합니다. 일치 후 숫자 목록이 포함되어 인쇄됩니다.wl
w
o

문제 :
- 너무 많은 목록을 효율적으로 인코딩되지 않은 ","그러나이 방법은 사용하기 쉽고 확실 훨씬 코드에 너무 많은 비용을 들이지 않고, 개선 될 수 있어요...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.