“Atomik” kod golf - bir izotoptaki nötron sayısını belirleyin


9

Göreviniz, bir elemanın izotopunu giriş olarak içeren, aşağıdaki örnekte olduğu gibi atom numarası ve ardından bir boşluk ve elemanın IUPAC kimyasal sembolü ile kodlanan bir dize almaktır:

162 Dy

ve o izotopun bir atomundaki nötron sayısını döndürür .

Yukarıdaki örnekte, disprosyum-162 96 nötrona sahiptir (162 toplam nükleon, eksi 66 proton çünkü disprosyum), bu nedenle çıktı olmalıdır 96.

Verilen öğenin Uus, "ununseptium" gibi genel bir ad değil, IUPAC tarafından (flerovium ve livermorium dahil) şu anda kalıcı adlar verilen 114 öğeden biri olacağını varsayabilirsiniz . İzotopun atom numarasının 1000'i aşmayacağını veya elementteki proton sayısından daha az olmayacağını varsayabilirsiniz.

Proton veya nötron eleman sayısı hakkında veri almak için yerleşik kodları kullanamaz veya kodunuzda kendi başına kod olarak bir dize veya sayı jetonunu değerlendiren herhangi bir işlev kullanamazsınız.

Herhangi bir dilde bunu yapmak için en az jeton kullanmak için program kazanır. Ancak, bu sınama amacıyla, bir dizedeki her karakter veya bir dizeye dönüştürülen değişken adı bir jeton olarak sayılır.

Referans için elementlerin listesi ve atom numaraları:


Ahaha, sadece wiki etiketini okuyun. Etiketin kapsamını yanlış anladım.
Sp3000

1
Genel olarak, atomik kod golfü, diller arasında adalet açısından kod golfünden daha iyidir, çünkü CJam veya Golfscript gibi golf oynamaya özgü dilleri desteklemez.
Joe Z.

2
Sayılar tek jeton olarak mı değerlendirilir? Cevabımda olduğu gibi 65, tek bir jeton mu yoksa 2 jeton mu?
Doktor

4
"Genel olarak, atomik kod golfü, diller arasında adalet açısından kod golfünden daha iyidir, çünkü CJam veya Golfscript gibi golf oynamaya özgü dilleri desteklemez." Yoksa öyle mi? ;)
Martin Ender

1
Yerleşik yapılara izin verildiyse, Mathematica'da yazılmış aşağıdaki işlev kullanılabilir:f[i_] := {n = ElementData[#[[2]], ToString@"StandardName"] <> ToString[#[[1]]], IsotopeData[n, "NeutronNumber"]} &[i]
DavidC

Yanıtlar:


5

CJam, 120 6 veya 116 jeton

Sayılar tek jetonsa, tüm kodu 6 jeton olarak alırız:

212065132249371573644124577121541653292994215804249878509033804566332949723850494006885998432589817663973272353884582668784347806472090795216938149345570424681103578762377771127645936569136562173556524971260383556793671988140498193154122873972644190003488894117491373991987567199279175132071186860926217964652052981868515510731685503564515183920386542420190587555479397630718313762477968862282786518176572529906744217608955037610524188966159703528812103601771438848515748286560373093942224945233978303729665751831532717 128b:c~

jetonlar nerede

212065132249371573644124577121541653292994215804249878509033804566332949723850494006885998432589817663973272353884582668784347806472090795216938149345570424681103578762377771127645936569136562173556524971260383556793671988140498193154122873972644190003488894117491373991987567199279175132071186860926217964652052981868515510731685503564515183920386542420190587555479397630718313762477968862282786518176572529906744217608955037610524188966159703528812103601771438848515748286560373093942224945233978303729665751831532717
128
b
:
c
~

Bu kod, yukarıdaki koddaki büyük sayının dize sürümünü içeren aşağıdaki koda eşdeğerdir. Ancak bir dize nedeniyle, aşağıdaki kod 116 jetonuna sahiptir:

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

Jetonlar (açıklama ile birlikte)

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

Yukarıdaki dizeyi çalıştırmak için kodu SE yanıt yanıtı yüklerken bazı karakterleri kaldırdığından bu bağlantıdan .

Bu da 109 jetona indirgenebilir, ancak SE, cevabımı yüklememe izin vermeyecek ve hatalı biçimlendirilmiş URI istisnası atacaktır.

Girdi şöyle gidiyor

162 Dy

çıktı gibi

96

Garip dize, tüm IUPAC adlarını içeren temel kodlu bir dizedir. Atomic number * 2 - 1 dizinlerindeki .

Buradan çevrimiçi deneyin


Sayılar neden tek bir belirteç olmasın?
Martin Ender

@ MartinBüttner Peki, bu sorunun amacı için, dizeler tek jeton değilse, sayılar da olmayabilir :)
Optimizer

1
Bu, Bor ve İndiyum için yanlış sonuçlar verir, çünkü iki elementli harfler onlarla başlar Bve Ionlardan önce görünür.
Martin Ender

^ Bor ve iyot demek istediniz. İndiyum olduğunu In.
Joe Z.

Ayrıca çocuklar. B ve ben için bu hata düzeltildi.
Doktor

1

Exec ile Python 3, 17 jeton

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

Exec olmadan Python 3, 35 jeton

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

Eval ile Ruby, 17 jeton

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

Javascript, 49 jeton

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

Sadece göstermek için Büyük harfleri / sembolleri / değişkenleri atomik kod-golf'de N jetonu olarak say :)


Yasaklama evalve buna execkarşı çalışıyor mu?
Joe Z.

@JoeZ. Hala "büyük tamsayı arama tablosu" saldırısına karşı savunmasız, bkz. Güncelleme.
kennytm

Görünüşe göre bu sorun en başından beri kötü şekillenmişti.
Joe Z.

0

Javascript, 42 jeton (?)

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: Jetonları saymak için bazı scriptleri nerede bulabilirim?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.