Golf kode "Atom" - tentukan jumlah neutron dalam isotop

9

Tugas Anda adalah mengambil string yang mengandung isotop elemen sebagai input, dikodekan seperti contoh berikut dengan nomor atom diikuti oleh spasi dan simbol kimia IUPAC untuk elemen:

162 Dy

dan mengembalikan jumlah neutron dalam atom isotop itu.

Dalam contoh di atas, dysprosium-162 memiliki 96 neutron (162 total nukleon, minus 66 proton karena itu dysprosium), jadi hasilnya seharusnya 96.

Anda dapat mengasumsikan bahwa elemen yang diberikan akan menjadi salah satu dari 114 elemen yang saat ini diberikan nama permanen oleh IUPAC (termasuk flerovium dan livermorium) dan bukan nama generik seperti Uusuntuk "ununseptium". Anda juga dapat mengasumsikan bahwa jumlah atom isotop tidak akan melebihi 1000, atau kurang dari jumlah proton dalam elemen.

Anda tidak boleh menggunakan built-in untuk mengambil data tentang jumlah elemen proton atau neutron, atau menggunakan fungsi apa pun dalam kode Anda yang mengevaluasi sendiri string atau nomor token sebagai kode.

Program untuk menggunakan token paling sedikit untuk melakukan ini dalam bahasa apa pun menang. Namun, untuk tujuan tantangan ini, setiap karakter dalam string, atau nama variabel yang dikonversi menjadi string, dihitung sebagai token.

Daftar elemen dan nomor atomnya untuk referensi:

Joe Z.
sumber
Ahaha benar, baca saja tag wiki. Sepertinya saya salah mengerti apa yang dicakup tag tersebut.
Sp3000
1
Secara umum, golf kode atom lebih baik daripada golf kode dalam hal keadilan antar bahasa karena tidak mendukung bahasa khusus golf seperti CJam atau Golfscript.
Joe Z.
2
Apakah angka dianggap sebagai token tunggal? Seperti dalam jawaban saya, apakah 65satu token atau 2 token?
Pengoptimal
4
"Secara umum, golf kode atom lebih baik daripada golf kode dalam hal keadilan antar bahasa karena tidak mendukung bahasa khusus golf seperti CJam atau Golfscript." Atau apakah itu? ;)
Martin Ender
1
Jika built-in diizinkan, fungsi berikut, yang ditulis dalam Mathematica, dapat digunakan:f[i_] := {n = ElementData[#[[2]], ToString@"StandardName"] <> ToString[#[[1]]], IsotopeData[n, "NeutronNumber"]} &[i]
DavidC

Jawaban:

5

CJam, 120 6 atau 116 token

Jika angka adalah token tunggal, maka kami memiliki seluruh kode sebagai 6 token:

212065132249371573644124577121541653292994215804249878509033804566332949723850494006885998432589817663973272353884582668784347806472090795216938149345570424681103578762377771127645936569136562173556524971260383556793671988140498193154122873972644190003488894117491373991987567199279175132071186860926217964652052981868515510731685503564515183920386542420190587555479397630718313762477968862282786518176572529906744217608955037610524188966159703528812103601771438848515748286560373093942224945233978303729665751831532717 128b:c~

dimana token berada

212065132249371573644124577121541653292994215804249878509033804566332949723850494006885998432589817663973272353884582668784347806472090795216938149345570424681103578762377771127645936569136562173556524971260383556793671988140498193154122873972644190003488894117491373991987567199279175132071186860926217964652052981868515510731685503564515183920386542420190587555479397630718313762477968862282786518176572529906744217608955037610524188966159703528812103601771438848515748286560373093942224945233978303729665751831532717
128
b
:
c
~

Kode ini setara dengan kode di bawah ini yang berisi versi string dari angka besar dalam kode di atas. Tetapi karena sebuah string, kode di bawah ini memiliki 116 token:

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

Token (dengan penjelasan) adalah

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

Untuk menjalankan string di atas, salin kode dari tautan ini saat SE menghapus beberapa karakter saat mengunggah jawabannya.

Ini dapat dikurangi menjadi 109 token juga, tetapi kemudian SE tidak akan membiarkan saya mengunggah jawaban saya, melempar pengecualian URI cacat.

Inputnya seperti

162 Dy

Outputnya seperti

96

String aneh hanyalah string dasar yang berisi semua nama IUPAC di Atomic number * 2 - 1indeks mereka .

Cobalah online di sini

Pengoptimal
sumber
Mengapa angka tidak menjadi token tunggal?
Martin Ender
@ MartinBüttner Nah, jika untuk keperluan pertanyaan ini, string bukan token tunggal, maka angka mungkin tidak terlalu :)
Pengoptimal
1
Ini memberikan hasil yang salah untuk Boron dan Indium, karena huruf dua elemen dimulai dengan Bdan Imuncul sebelum mereka.
Martin Ender
^ Maksudmu boron dan yodium. Indium adalah In.
Joe Z.
Juga, teman-teman. Bug untuk B dan saya sudah diperbaiki.
Pengoptimal
1

Python 3 dengan exec, 17 token

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

Python 3 tanpa exec, 35 token

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

Ruby dengan eval, 17 token

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

Hanya untuk mengilustrasikan Hitung int-besar / simbol / variabel sebagai N token di atomic-code-golf :)

kennytm
sumber
Apakah mengingkari evaldan execmenentangnya?
Joe Z.
@ Joz. Masih rentan terhadap serangan "tabel pencarian bilangan bulat besar", lihat pembaruan.
kennytm
Sepertinya masalah ini buruk sejak awal.
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: Di mana saya dapat menemukan beberapa skrip untuk menghitung token?

Qwertiy
sumber