Golf nguyên tử của người Viking - xác định số lượng neutron trong một đồng vị


9

Nhiệm vụ của bạn là lấy một chuỗi chứa đồng vị của một nguyên tố làm đầu vào, được mã hóa như ví dụ sau với số nguyên tử theo sau là khoảng trắng và ký hiệu hóa học IUPAC cho phần tử:

162 Dy

và trả về số lượng neutron trong một nguyên tử của đồng vị đó.

Trong ví dụ trên, dysprosium-162 có 96 neutron (tổng số 162 nucleon, trừ 66 proton vì đó là dysprosium), do đó, đầu ra phải là 96.

Bạn có thể giả định rằng phần tử được cung cấp sẽ là một trong số 114 phần tử hiện được đặt tên vĩnh viễn bởi IUPAC (bao gồm flerovium và hepmorium) và không phải là một tên chung như Uus"ununseptium". Bạn cũng có thể cho rằng số nguyên tử của đồng vị sẽ không vượt quá 1000, hoặc nhỏ hơn số lượng proton trong nguyên tố.

Bạn không được sử dụng các phần tử tích hợp để truy xuất dữ liệu về số phần tử proton hoặc neutron hoặc sử dụng bất kỳ chức năng nào trong mã của bạn để tự đánh giá một chuỗi hoặc mã thông báo số dưới dạng mã.

Chương trình sử dụng ít mã thông báo nhất để thực hiện điều này bằng bất kỳ ngôn ngữ nào sẽ giành chiến thắng. Tuy nhiên, với mục đích của thử thách này, mỗi ký tự trong chuỗi hoặc tên biến được chuyển đổi thành chuỗi, được tính là mã thông báo.

Danh sách các nguyên tố và số nguyên tử của chúng để tham khảo:


Ahaha đúng, chỉ cần đọc thẻ wiki. Có vẻ như tôi đã hiểu nhầm những gì thẻ bao gồm.
Sp3000

1
Nói chung, golf mã nguyên tử tốt hơn golf mã về mặt công bằng giữa các ngôn ngữ vì nó không thiên về các ngôn ngữ dành riêng cho golf như CJam hoặc Golfscript.
Joe Z.

2
Các số được coi là mã thông báo duy nhất? Giống như trong câu trả lời của tôi, là 65một mã thông báo duy nhất hoặc 2 mã thông báo?
Tối ưu hóa

4
"Nói chung, golf mã nguyên tử tốt hơn golf mã về mặt công bằng giữa các ngôn ngữ vì nó không thiên về các ngôn ngữ dành riêng cho golf như CJam hoặc Golfscript." Hay không? ;)
Martin Ender

1
Nếu các phần dựng sẵn được cho phép, hàm sau, được viết bằng Mathicala, có thể được sử dụng:f[i_] := {n = ElementData[#[[2]], ToString@"StandardName"] <> ToString[#[[1]]], IsotopeData[n, "NeutronNumber"]} &[i]
DavidC

Câu trả lời:


5

CJam, 120 6 hoặc 116 mã thông báo

Nếu số là mã thông báo duy nhất, thì chúng tôi có toàn bộ mã là 6 mã thông báo:

212065132249371573644124577121541653292994215804249878509033804566332949723850494006885998432589817663973272353884582668784347806472090795216938149345570424681103578762377771127645936569136562173556524971260383556793671988140498193154122873972644190003488894117491373991987567199279175132071186860926217964652052981868515510731685503564515183920386542420190587555479397630718313762477968862282786518176572529906744217608955037610524188966159703528812103601771438848515748286560373093942224945233978303729665751831532717 128b:c~

mã thông báo ở đâu

212065132249371573644124577121541653292994215804249878509033804566332949723850494006885998432589817663973272353884582668784347806472090795216938149345570424681103578762377771127645936569136562173556524971260383556793671988140498193154122873972644190003488894117491373991987567199279175132071186860926217964652052981868515510731685503564515183920386542420190587555479397630718313762477968862282786518176572529906744217608955037610524188966159703528812103601771438848515748286560373093942224945233978303729665751831532717
128
b
:
c
~

Mã này tương đương với mã dưới đây có chứa phiên bản chuỗi của số lớn trong mã trên. Nhưng do một chuỗi, đoạn mã dưới đây có tới 116 mã thông báo:

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

Mã thông báo (có giải thích) là

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

Để chạy chuỗi trên, sao chép mã từ liên kết này vì SE sẽ xóa một số ký tự trong khi tải lên câu trả lời.

Điều này cũng có thể được giảm xuống còn 109 mã thông báo, nhưng sau đó SE sẽ không cho phép tôi tải lên câu trả lời của mình, ném ngoại lệ URI không đúng định dạng.

Đầu vào đi như

162 Dy

đầu ra giống như

96

Chuỗi kỳ lạ chỉ là một chuỗi được mã hóa cơ sở chứa tất cả các tên IUPAC tại Atomic number * 2 - 1chỉ mục của chúng .

Dùng thử trực tuyến tại đây


Tại sao số không phải là một mã thông báo duy nhất?
Martin Ender

@ MartinBüttner Vâng, nếu vì mục đích của câu hỏi này, các chuỗi không phải là mã thông báo duy nhất, thì các số có thể không quá :)
Trình tối ưu hóa

1
Điều này mang lại kết quả sai cho Boron và Indium, bởi vì các chữ cái hai yếu tố bắt đầu BIxuất hiện trước chúng.
Martin Ender

^ Bạn có nghĩa là boron và iốt. Ấn là In.
Joe Z.

Ngoài ra, các bạn. Đó là lỗi cho B và tôi đã được sửa.
Tối ưu hóa

1

Python 3 với exec, 17 mã thông báo

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

Python 3 không có exec, 35 token

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

Ruby với eval, 17 mã thông báo

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

Javascript, 49 mã thông báo

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

Chỉ để minh họa Đếm số lượng lớn / ký hiệu / biến là N mã thông báo trong mã nguyên tử-golf :)


Có bất tuân evalexeclàm việc chống lại điều đó?
Joe Z.

@JoeZ. Vẫn dễ bị tấn công "bảng tra cứu số nguyên lớn", xem cập nhật.
kennytm

Có vẻ như vấn đề này đã được hình thành ngay từ đầu.
Joe Z.

0

Javascript, 42 mã thông báo (?)

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: Nơi tôi có thể tìm thấy một số tập lệnh để đếm mã thông báo?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.