Golf "atomico": determina il numero di neutroni in un isotopo


9

Il tuo compito è prendere una stringa contenente un isotopo di un elemento come input, codificato come nell'esempio seguente con il numero atomico seguito da uno spazio e dal simbolo chimico IUPAC per l'elemento:

162 Dy

e restituisce il numero di neutroni in un atomo di quell'isotopo.

Nell'esempio sopra, il disprosio-162 ha 96 neutroni (162 nucleoni totali, meno 66 protoni perché è disprosio), quindi l'output dovrebbe essere 96.

Si può presumere che l'elemento indicato sarà uno dei 114 elementi attualmente indicati dall'IUPAC (compresi flerovium e livermorium) e non un nome generico come Uus"ununseptium". Puoi anche supporre che il numero atomico dell'isotopo non superi 1000 o sia inferiore al numero di protoni nell'elemento.

Non è possibile utilizzare gli incorporati per recuperare dati sul numero di elementi protoni o neutroni o utilizzare qualsiasi funzione all'interno del proprio codice che valuti una stringa o un token numerico come codice a sé stante.

Vince il programma che utilizza il minor numero di token per farlo in qualsiasi lingua. Tuttavia, ai fini di questa sfida, ogni personaggio in una stringa, o un nome di variabile convertito in una stringa, conta come token.

Elenco di elementi e il loro numero atomico per riferimento:


Ahaha giusto, basta leggere il tag wiki. Sembra che ho capito male cosa racchiudesse il tag.
Sp3000,

1
In generale, il golf del codice atomico è migliore del golf del codice in termini di equità tra le lingue perché non favorisce linguaggi specifici del golf come CJam o Golfscript.
Joe Z.

2
I numeri sono considerati come token singolo? Come nella mia risposta, è 65un singolo token o 2 token?
Ottimizzatore

4
"In generale, il golf del codice atomico è migliore del golf del codice in termini di equità tra le lingue perché non favorisce linguaggi specifici del golf come CJam o Golfscript." O lo fa? ;)
Martin Ender il

1
Se gli incorporamenti fossero consentiti, si potrebbe usare la seguente funzione, scritta in Mathematica:f[i_] := {n = ElementData[#[[2]], ToString@"StandardName"] <> ToString[#[[1]]], IsotopeData[n, "NeutronNumber"]} &[i]
DavidC

Risposte:


5

CJam, 120 token 6 o 116

Se i numeri sono token singoli, allora abbiamo l'intero codice come 6 token:

212065132249371573644124577121541653292994215804249878509033804566332949723850494006885998432589817663973272353884582668784347806472090795216938149345570424681103578762377771127645936569136562173556524971260383556793671988140498193154122873972644190003488894117491373991987567199279175132071186860926217964652052981868515510731685503564515183920386542420190587555479397630718313762477968862282786518176572529906744217608955037610524188966159703528812103601771438848515748286560373093942224945233978303729665751831532717 128b:c~

dove sono i token

212065132249371573644124577121541653292994215804249878509033804566332949723850494006885998432589817663973272353884582668784347806472090795216938149345570424681103578762377771127645936569136562173556524971260383556793671988140498193154122873972644190003488894117491373991987567199279175132071186860926217964652052981868515510731685503564515183920386542420190587555479397630718313762477968862282786518176572529906744217608955037610524188966159703528812103601771438848515748286560373093942224945233978303729665751831532717
128
b
:
c
~

Questo codice è equivalente al codice seguente contenente la versione stringa del numero grande nel codice sopra. Ma a causa di una stringa, il codice seguente ha 116 token:

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

I token (con spiegazione) sono

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

Per eseguire la stringa sopra, copia il codice da questo link mentre SE rimuove alcuni caratteri durante il caricamento della risposta.

Anche questo può essere ridotto a 109 token, ma SE non mi consente di caricare la mia risposta, generando un'eccezione URI non valida.

L'input va come

162 Dy

l'output è simile

96

La strana stringa è solo una stringa codificata di base contenente tutti i nomi IUPAC nel loro Atomic number * 2 - 1indice.

Provalo online qui


Perché i numeri non dovrebbero essere un singolo token?
Martin Ender,

@ MartinBüttner Bene, se ai fini di questa domanda, le stringhe non sono un singolo token, i numeri potrebbero non essere troppo :)
Ottimizzatore

1
Questo dà risultati errati per boro e indio, perché le lettere a due elementi iniziano con Be Iappaiono prima di esse.
Martin Ender,

^ Intendi boro e iodio. L'indio è In.
Joe Z.

Inoltre, ragazzi. Il bug per B e I è stato corretto.
Ottimizzatore

1

Python 3 con exec, 17 token

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

Python 3 senza exec, 35 token

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

Rubino con eval, 17 gettoni

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

Javascript, 49 token

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

Giusto per illustrare Count big -ts / simboli / variabili come token N in atomic-code-golf :)


Non consentire evale execlavorare contro questo?
Joe Z.

@JoeZ. Ancora vulnerabile all'attacco della "tabella di ricerca per numeri interi", consultare l'aggiornamento.
Kennytm,

Sembra che questo problema sia stato mal formato sin dall'inizio, quindi.
Joe Z.

0

Javascript, 42 token (?)

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: Dove posso trovare alcuni script per contare i token?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.