"원자"코드 골프-동위 원소의 중성자 수 결정


9

당신의 임무는 원소의 동위 원소를 입력으로 포함하는 문자열을 가져 오는 것입니다. 다음 예제와 같이 원자 번호와 공백 및 요소의 IUPAC 화학 기호로 인코딩됩니다.

162 Dy

동위 원소의 원자에있는 중성자 수를 반환합니다 .

위의 예에서 디스프로슘 -162는 96 개의 중성자 (디스프로슘이기 때문에 총 핵 162 개, 마이너스 66 양성자)가 96 개이므로 출력은이어야합니다 96.

주어진 요소가 IUPAC에 의해 현재 영구 명칭이 부여 된 114 개의 요소 중 하나 (flerovium 및 livermorium 포함)이고 Uus"ununseptium" 과 같은 일반적인 이름이 아니라고 가정 할 수 있습니다. 또한 동위 원소의 원자 번호가 1000을 초과하지 않거나 요소의 양성자 수보다 작을 것이라고 가정 할 수 있습니다.

내장 함수를 사용하여 양성자 또는 중성자 수의 요소에 대한 데이터를 검색하거나 코드 내에서 문자열 또는 숫자 토큰을 자체 코드로 평가하는 함수를 사용할 수 없습니다.

모든 언어에서이 작업을 수행하기 위해 가장 적은 토큰을 사용하는 프로그램이 승리합니다. 그러나이 문제를 해결하기 위해 문자열의 모든 문자 또는 문자열로 변환 된 변수 이름은 토큰으로 계산됩니다.

참조 할 요소 및 원자 번호 목록 :


아하 바로 태그 위키를 읽으십시오. 태그에 포함 된 내용을 잘못 이해 한 것 같습니다.
Sp3000

1
일반적으로 원자 코드 골프는 CJam이나 Golfscript와 같은 골프 관련 언어를 선호하지 않기 때문에 언어 간의 공정성 측면에서 코드 골프보다 낫습니다.
Joe Z.

2
숫자가 단일 토큰으로 간주됩니까? 내 대답에서와 같이 65단일 토큰 또는 2 개의 토큰입니까?
Optimizer

4
"일반적으로 원자 코드 골프는 CJam이나 Golfscript와 같은 골프 관련 언어를 선호하지 않기 때문에 언어 간의 공정성 측면에서 코드 골프보다 낫습니다." 아니면? ;)
Martin Ender

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

이상한 문자열은 Atomic number * 2 - 1인덱스에 모든 IUPAC 이름이 포함 된 기본 인코딩 된 문자열 입니다.

여기에서 온라인으로 사용해보십시오


숫자가 단일 토큰이 아닌 이유는 무엇입니까?
Martin Ender

@ MartinBüttner 글쎄,이 질문의 목적으로 문자열이 단일 토큰이 아니라면 숫자가 너무 아닐 수도 있습니다 :)
Optimizer

1
2 요소의 문자로 시작하기 때문에, 잘못된에게 붕소 및 인듐에 대한 결과를 제공 B하고 I그들 앞에 나타납니다.
Martin Ender

^ 당신은 붕소와 요오드를 의미한다. 인듐은 In입니다.
Joe Z.

또한 여러분. B와 나는 그 버그가 수정되었습니다.
Optimizer

1

exec가 포함 된 Python 3, 17 개의 토큰

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

exec가없는 Python 3, 35 개의 토큰

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

eval, 17 개의 토큰이있는 루비

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

자바 스크립트, 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]))

원자 코드 골프에서 N 개의 토큰으로 Big-ints / symbols / variables 을 설명하기 위해 :)


그것을 금지 eval하고 exec반대 하는가?
Joe Z.

@JoeZ. "큰 정수 조회 테이블"공격에 여전히 취약합니다 (업데이트 참조).
kennytm

이 문제는 처음부터 잘못된 것으로 보입니다.
Joe Z.

0

자바 스크립트, 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)

추신 : 토큰을 계산할 스크립트를 어디서 찾을 수 있습니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.