Golf „atomowy” golf - określ liczbę neutronów w izotopie

9

Twoim zadaniem jest pobranie ciągu zawierającego izotop pierwiastka jako danych wejściowych, kodowanego jak w poniższym przykładzie z liczbą atomową, po której następuje spacja i symbol chemiczny IUPAC dla elementu:

162 Dy

i zwraca liczbę neutronów w atomie tego izotopu.

W powyższym przykładzie dysprosium-162 ma 96 neutronów (162 nukleonów ogółem, minus 66 protonów, ponieważ jest to dysprosium), więc wynik powinien być 96.

Możesz założyć, że podany element będzie jednym ze 114 elementów, którym IUPAC nadał obecnie stałe nazwy (w tym flerovium i livermorium), a nie nazwą ogólną, taką jak Uus„ununseptium”. Możesz również założyć, że liczba atomowa izotopu nie przekroczy 1000 lub będzie mniejsza niż liczba protonów w elemencie.

Nie możesz używać wbudowanych funkcji do pobierania danych o liczbie protonów lub neutronów, ani też korzystać z dowolnej funkcji w kodzie, która ocenia łańcuch lub token liczbowy jako kod samodzielnie.

Wygrywa program używający najmniejszej liczby tokenów w dowolnym języku. Jednak na potrzeby tego wyzwania każdy znak w ciągu lub nazwa zmiennej przekonwertowana na ciąg liczy się jako token.

Lista pierwiastków i ich liczba atomowa w celach informacyjnych:

Joe Z.
źródło
Ahaha racja, po prostu przeczytaj tag wiki. Wygląda na to, że źle zrozumiałem, co obejmuje tag.
Sp3000,
1
Ogólnie rzecz biorąc, golf z kodem atomowym jest lepszy od golfa kodowego pod względem uczciwości między językami, ponieważ nie faworyzuje języków specyficznych dla golfa, takich jak CJam lub Golfscript.
Joe Z.,
2
Czy liczby są traktowane jako pojedynczy token? Jak w mojej odpowiedzi, czy jest 65to pojedynczy token, czy 2 tokeny?
Optymalizator
4
„Ogólnie rzecz biorąc, golf atomowy jest lepszy od golfa kodowego pod względem uczciwości między językami, ponieważ nie faworyzuje języków specyficznych dla golfa, takich jak CJam lub Golfscript”. A może to? ;)
Martin Ender,
1
Jeśli wbudowane są dozwolone, można użyć następującej funkcji, napisanej w Mathematica:f[i_] := {n = ElementData[#[[2]], ToString@"StandardName"] <> ToString[#[[1]]], IsotopeData[n, "NeutronNumber"]} &[i]
DavidC

Odpowiedzi:

5

CJam, 120 6 lub 116 żetonów

Jeśli liczby są jednym tokenem, mamy cały kod jako 6 tokenów:

212065132249371573644124577121541653292994215804249878509033804566332949723850494006885998432589817663973272353884582668784347806472090795216938149345570424681103578762377771127645936569136562173556524971260383556793671988140498193154122873972644190003488894117491373991987567199279175132071186860926217964652052981868515510731685503564515183920386542420190587555479397630718313762477968862282786518176572529906744217608955037610524188966159703528812103601771438848515748286560373093942224945233978303729665751831532717 128b:c~

gdzie są tokeny

212065132249371573644124577121541653292994215804249878509033804566332949723850494006885998432589817663973272353884582668784347806472090795216938149345570424681103578762377771127645936569136562173556524971260383556793671988140498193154122873972644190003488894117491373991987567199279175132071186860926217964652052981868515510731685503564515183920386542420190587555479397630718313762477968862282786518176572529906744217608955037610524188966159703528812103601771438848515748286560373093942224945233978303729665751831532717
128
b
:
c
~

Ten kod jest równoważny poniższemu kodowi zawierającemu łańcuchową wersję dużej liczby w powyższym kodzie. Ale z powodu ciągu poniższy kod ma 116 tokenów:

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

Tokeny (z wyjaśnieniem) są

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";

Aby uruchomić powyższy ciąg, skopiuj kod z tego linku, ponieważ SE usuwa niektóre znaki podczas przesyłania odpowiedzi.

Można to również zredukować do 109 tokenów, ale wtedy SE nie pozwoli mi przesłać mojej odpowiedzi, wyrzucając zniekształcony wyjątek URI.

Wejście idzie jak

162 Dy

wyjście jest jak

96

Dziwny ciąg jest po prostu zakodowanym ciągiem zawierającym wszystkie nazwy IUPAC w Atomic number * 2 - 1indeksie.

Wypróbuj online tutaj

Optymalizator
źródło
Dlaczego liczby nie byłyby pojedynczym tokenem?
Martin Ender,
@ MartinBüttner Cóż, jeśli dla celów tego pytania ciągi nie są pojedynczymi tokenami, wówczas liczby mogą nie być zbyt :)
Optymalizator
1
To źle podaje wyniki dla boru i indu, ponieważ dwuelementowe litery zaczynające się od Bi Ipojawiają się przed nimi.
Martin Ender,
^ Masz na myśli bor i jod. Ind jest In.
Joe Z.,
Także chłopaki. Ten błąd dla B i I został naprawiony.
Optymalizator
1

Python 3 z exec, 17 tokenów

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

Python 3 bez exec, 35 tokenów

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

Rubinowy z eval, 17 żetonów

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

JavaScript, 49 tokenów

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

Tylko dla zilustrowania Policz big-ints / symbole / zmienne jako tokenów N w atomowym kodzie golfowym :)

kennytm
źródło
Czy odrzucanie evali execdziała przeciwko temu?
Joe Z.,
@JoeZ. Nadal podatny na atak typu „tabela liczb całkowitych”, patrz aktualizacja.
kennytm,
Wygląda na to, że ten problem od początku był źle sformułowany.
Joe Z.,
0

JavaScript, 42 tokeny (?)

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: Gdzie mogę znaleźć skrypt do liczenia tokenów?

Qwertiy
źródło