Слова з періодичної таблиці елементів [закрито]


9

Ще коли я був першокурсником середньої школи, що займався хімією, я переглядав періодичну таблицю елементів і виписував брудні слова з кількістю елементів (HeCK було б 2619, 2-6-19).

Я думав про це днями, коли побачив дивовижну сорочку, на якій написано BeEr (4-68)

Тож мій виклик codegolf - це найкоротша програма для виведення списку слів, які ви можете написати за допомогою періодичної таблиці елементів І числового коду, який би представляв це слово.

/ usr / share / dict / words або будь-який словник, який ви хочете використовувати для списку слів. Якщо ви використовуєте "нестандартний" список слів, повідомте нам, що це таке!


'Код' номера? А як щодо випадків, коли їх більше? Наприклад, CO - Co.
Пітер Тейлор

3
Читаючи відповіді нижче, я помітив одне місце, в якому кожен міг вирізати кілька персонажів. Вони можуть видалити Co, Si, Sc, Os, Hs, Po, Pb, Np, No, Yb, Cs і, можливо, інші зі свого списку елементів, оскільки всі вони можуть бути побудовані з інших елементів.
PhiNotPi

1
Не іттербій, це мій улюблений елемент!
Роб

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 символи.

Це IMO набагато ідіоматичніший 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"
...

Вийміть зайвого персонажа, "мене це зовсім не турбує. І звичайно, Пітер Тейлор заходить і роздуває всіх гольфскриптом.
Роб

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) Ви можете заощадити пам'ять, використовуючи трюк Пітера Тейлора (як в його вихідному коді) e='HHeLiBe...LvUusUuo'.scan(/[A-Z][a-z]*/).map &:downcase. 2) Змінний регулярний вираз ніколи не використовується. 3) Прочитайте слова зі стандартного вводу: $<.each{|w|.... За допомогою цих модифікацій код зменшився до 410 символів.
манатура

Я думаю, що ви можете застосувати той самий підхід до економії простору і для зайвих елементів, ціною додавання двох символів до регексу сканування. Використовуйте пробіл, якщо вам не подобаються нові рядки - я використовую нові рядки в основному так, що не потрібно прокручувати, щоб побачити основний цикл.
Пітер Тейлор

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

Чи можете ви додати ту, яка дає належну велику літери? Я думаю, що це дуже акуратно, і я досить новачок у пітоні.
Роб

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()

Це справді коротше використовувати явну ініціалізацію хешу, ніж використовувати явну ініціалізацію масиву і перетворити її в індекс хеша?
Пітер Тейлор

Я просто використав словник для зручності використання. Набір масиву кортежів було би трохи дорожчим для персонажа. Хоча замовлення елементів було б гарною ідеєю ...
beary605

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)перевіряє слово w, починаючи з елемента l.
Застосовується двостороння рекурсія - якщо перший елемент відповідає заголовку списку елементів, перевірте залишок wна повний список елементів. Якщо цей збіг не вдається, перевірте слово проти хвоста списку.
Буфер oнакопичує номери елементів уздовж успішного шляху. Після збігу він буде містити список номерів і надрукується.

Проблеми :
Список не кодується ефективно - занадто багато "і ,". Але цей спосіб легкий у використанні. Я впевнений, що його можна значно покращити, не надто багато кодуючи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.