«Атомний» код гольфу - визначте кількість нейтронів в ізотопі


9

Ваше завдання - взяти рядок, що містить ізотоп елемента, кодований як наступний приклад з атомним номером з подальшим пробілом та хімічним символом IUPAC для елемента:

162 Dy

і повернути кількість нейтронів в атомі цього ізотопу.

У наведеному вище прикладі диспрозіум-162 має 96 нейтронів (162 загальних нуклонів, мінус 66 протонів, оскільки це диспрозіум), тому вихід повинен бути 96.

Ви можете припустити, що даний елемент буде одним із 114 елементів, на даний час IUPAC має постійні імена (включаючи флеровіум та печінкорію), а не загальну назву, наприклад, Uusдля "ununseptium". Ви також можете припустити, що атомне число ізотопу не буде перевищувати 1000 або бути меншим за кількість протонів у елементі.

Ви не можете використовувати вбудовані модулі для отримання даних про кількість протонів чи нейтронів, або використовувати будь-яку функцію у вашому коді, яка самостійно оцінює маркер рядка чи числа як код.

Виграє програма, яка використовує найменше лексем для будь-якої мови. Однак для цього завдання кожен символ у рядку або ім'я змінної, перетвореної у рядок, вважається лексемою.

Список елементів та їх атомний номер для довідки:


Ага, правильно, просто прочитай вікі з тегами. Здається, я неправильно зрозумів, що охоплює тег.
Sp3000

1
Взагалі гольф з атомним кодом краще, ніж кодовий гольф, з точки зору справедливості між мовами, оскільки він не надає переваги специфічним для гольфу мовам, таким як CJam або Golfscript.
Джо З.

2
Чи розглядаються числа як один маркер? Як у моїй відповіді, чи 65є один маркер або 2 жетони?
Оптимізатор

4
"Взагалі гольф з атомним кодом краще, ніж кодовий гольф, з точки зору справедливості між мовами, оскільки він не надає переваги специфічним для гольфу мовам, таким як CJam або Golfscript." Або це? ;)
Мартін Ендер

1
Якщо вбудовані дозволені, може використовуватися наступна функція, написана в Mathematica:f[i_] := {n = ElementData[#[[2]], ToString@"StandardName"] <> ToString[#[[1]]], IsotopeData[n, "NeutronNumber"]} &[i]
DavidC

Відповіді:


5

CJam, 120 6 або 116 лексем

Якщо числа є одинаковими, тоді у нас весь код є 6 лексемами:

212065132249371573644124577121541653292994215804249878509033804566332949723850494006885998432589817663973272353884582668784347806472090795216938149345570424681103578762377771127645936569136562173556524971260383556793671988140498193154122873972644190003488894117491373991987567199279175132071186860926217964652052981868515510731685503564515183920386542420190587555479397630718313762477968862282786518176572529906744217608955037610524188966159703528812103601771438848515748286560373093942224945233978303729665751831532717 128b:c~

де лексеми

212065132249371573644124577121541653292994215804249878509033804566332949723850494006885998432589817663973272353884582668784347806472090795216938149345570424681103578762377771127645936569136562173556524971260383556793671988140498193154122873972644190003488894117491373991987567199279175132071186860926217964652052981868515510731685503564515183920386542420190587555479397630718313762477968862282786518176572529906744217608955037610524188966159703528812103601771438848515748286560373093942224945233978303729665751831532717
128
b
:
c
~

Цей код еквівалентний наведеному нижче коду, що містить рядкову версію великого числа у наведеному вище коді. Але через рядок, у наведеному нижче коді є 116 лексем:

ri"ᘭ᛭绊ڏ晍嬨塐弶⛡ᠸ庐ᖩે槑湘ࡊ㚋䊌栕ᄂỗ∘抁埵ໂČ槩唹ᘇ穗≧ṷ㴛勤烓≿Ⲳ㇭Ȋ嬅͙獚簜䱡数㍉㉦䩛爈拴矍㚴燌㾄䱮⃜⢴ⶏ㯗႒ݘ੡䅄瞟⮘㢧⳻⮵∼䚽珯ほֹ㳰櫣ݰ牜᫦殙ᆌ穟䖻ᄭⓚ獙஧༧撒咛啺"2F#b57b65f+:cr2*2<#2/)-

Токени (з поясненням) є

r                           "Read the first input";
i                           "and convert it to integer";
"
91 character string         "Then this base converted string";
"
2
F
#                           "'s ASCII representation of each character gets converted";
b                           "to base 2**15";
57                          "which gets converted to";
b                           "base 57";
65                          "and we add 65 to each element in the base 57 array";
f
+
:
c                           "and convert each array element to character.";
r                           "Then read the next input string, which is atom's IUPAC";
2                           "double it";
*
2                           "and take only first 2 characters";
<
#                           "Find the occurrence of these 2 characters in the big string";
2                           "and divide the index by 2";
/
)                           "increment the index to counter 0 offset";
-                           "and subtract this number, which is the atomic number from"
                            "the input number of nucleons";

Щоб виконати вищезазначений рядок, скопіюйте код із цього посилання, оскільки SE видаляє деякі символи під час завантаження відповіді.

Це також може бути зменшено до 109 лексем, але тоді SE не дозволить мені завантажити свою відповідь, викинувши виняток з неправильним URI.

Введення іде як

162 Dy

вихід як

96

Дивна рядок - це просто кодована рядок, що містить усі імена IUPAC у їх Atomic number * 2 - 1індексі.

Спробуйте його онлайн тут


Чому числа не були б одним знаком?
Мартін Ендер

@ MartinBüttner Ну, якщо для цього питання рядки не є однозначними, то цифри можуть бути не надто :)
Оптимізатор

1
Це дає неправильні результати для бору та індію, оскільки двоелементні літери, що починаються з них Bі Iз’являються перед ними.
Мартін Ендер

^ Ви маєте на увазі бор і йод. Індій є In.
Джо З.

Також хлопці. Ця помилка для B і I виправлена.
Оптимізатор

1

Python 3 з exec, 17 лексемами

exec(int.to_bytes(42580960806925240587487231677747050990110980939298529158008049507419456038066480774222358994792932281429500848123044123619998194774734911333011516763318834841258668032468977581617546825403043048781904307873076644287421190283925612029151422009703963147720234582458918676020358978146687598642493196719470433413287097024943497230356536978257362073205770196031226838532057690859535911353521203287284228407660035870497366713816359382867026152168356178620422021081074864815228071041303891869741111572003521808946355179139580269537828514345177247630946236685801543450404664783011350766913659964138280312012942354586269107632396118108534925651704031851802293836135007879834261627022944650861299698061444211422731907625,295,'big'))

Python 3 без exec, 35 лексем

m,n=input().split()
print(int(m)-(0x50000003c00000000000000000000000000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000d80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000116880005ad0000d002b832400000000000000000000000000000004c0000064f8000003806a0088015660000000000000000000000000000b00000000000ac0000000016efd12c0004b60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017a700760005400f400000000000001700a56c000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000000002ee6000000000700000029e00522c0000000000000000000000000003680000002a3200000000000c00032800000000000000000000000000000e91c000ce000000000000000c000000000000e400000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a000006200000000000000000000000000000000000000000000000000006c0000043000000000000509008000000000000000000000000000000000000000000000000000000000000082000007c0000000000000000000000000000000ae00000019390000000000068000000000000000000000000000000000fc06388000000000000000000000000000000000000000000000000108000000006e0000000000000000000000000000d2000000000000000000000000000074037300001be1808800000000c4e98000050000000000000000000000000000000046000000000061014f580001000000e0000000000000000000000000013eaa12400000017c680000002f0000059000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c04a2f7001000007880e0001300d408012000060a0000000000000000000>>7*int(n,36)&127))

Рубін з еваль, 17 лексем

eval [22146635005300445083784033446026580324048447941091204274213253110537099437818224958820496527991920943430421799402248351995854377736142191462062582991150146209770141259010870255095388946677505144127700666745571877848513432112199556183753919673308110291261587736766001750331575554182707626697924148465335917814388410868486650419909619279250674754531982074694183257024218097391705830277480110741636037821082572926228904583257826932150641336017429157246896262085081972165351023141358378905645164343005169041637147077645200273099823888392038731180787177889720531999846231330677441270444855911286469030157575699579420898896870179419644019549285098577609138033580761786048462145007410.to_s(16)].pack('H*')

Javascript, 49 лексем

m=prompt().split(/ /);
alert(m[0]-(function(){
_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_
}).toString().split(/_/).indexOf(m[1]))

Просто для того, щоб проілюструвати кількість великих входів / символів / змінних як N лексем в атомному коді-гольфі :)


Чи забороняє evalчи execпрацює проти цього?
Джо З.

@JoeZ. Ще вразливий до атаки "великої цілої таблиці пошуку", див. Оновлення
kennytm

Здається, ця проблема тоді була погано сформована.
Джо З.

0

Javascript, 42 лексеми (?)

alert(parseInt(x=prompt().split(" "))-Object.getOwnPropertyNames({__H_HeLiBeB_C_N_O_F_NeNaMgAlSiP_S_ClArK_CaScTiV_CrMnFeCoNiCuZnGaGeAsSeBrKrRbSrY_ZrNbMoTcRuRhPdAgCdInSnSbTeI_XeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaW_ReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaU_NpPuAmCmBkCfEsFmMdNoLrRfDbSgBhHsMtDsRgCn__Fl__Lv:0})[0].indexOf(x[1])/2)

PS: Де я можу знайти якийсь сценарій для підрахунку жетонів?

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