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

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 Ну, если для целей этого вопроса строки не являются одним токеном, то числа могут быть и не слишком :)
Optimizer
1
Это дает неверные результаты для бора и индия, потому что двухэлементные буквы начинаются с Bи Iпоявляются перед ними.
Мартин Эндер
^ Вы имеете в виду бор и йод. Индий есть In.
Джо З.
Также, ребята. Эта ошибка для B и я исправлена.
Оптимизатор
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))

Рубин с eval, 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]))

Просто чтобы проиллюстрировать подсчет больших ints / символов / переменных как N токенов в atomic-code-golf :)

kennytm
источник
Есть ли запрет 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: Где я могу найти скрипт для подсчета токенов?

Qwertiy
источник