Tin nhắn bí mật Phần 1, Các yếu tố


8

Bạn và bạn của bạn muốn gửi cho nhau những tin nhắn bí mật. Tuy nhiên, bởi vì bạn là những người theo thuyết âm mưu và nghĩ rằng chính phủ có một máy tính lượng tử có thể phá vỡ mọi mã hóa tiêu chuẩn. Do đó, bạn đang phát minh ra một trong những của riêng bạn. Bước đầu tiên của việc này là như sau: lấy một chuỗi đầu vào, bạn kiểm tra xem tất cả các chữ cái có thể được biểu thị bằng các ký hiệu cho các thành phần của bảng tuần hoàn (không phân biệt chữ hoa chữ thường). Nếu có thể, bạn thay thế từng phần bằng tên của phần tử mà biểu tượng đại diện. Nếu tất cả các chữ cái không thể được thay thế theo cách này, bạn chỉ cần sử dụng chuỗi gốc.

Nhiệm vụ của bạn:

Bạn phải viết một chương trình hoặc chức năng mã hóa tin nhắn, như đã nêu trước đó. Hãy nhớ rằng nếu chương trình của bạn lấy dữ liệu từ nguồn bên ngoài, kích thước của nguồn bên ngoài phải được thêm vào số byte ( lỗ hổng này ). Các yếu tố và biểu tượng được sử dụng ở đây:

H   Hydrogen
He  Helium
Li  Lithium
Be  Beryllium
B   Boron
C   Carbon
N   Nitrogen
O   Oxygen
F   Fluorine
Ne  Neon
Na  Sodium
Mg  Magnesium
Al  Aluminum
Si  Silicon
P   Phosphorus
S   Sulfur
Cl  Chlorine
Ar  Argon
K   Potassium
Ca  Calcium
Sc  Scandium
Ti  Titanium
V   Vanadium
Cr  Chromium
Mn  Manganese
Fe  Iron
Co  Cobalt
Ni  Nickel
Cu  Copper
Zn  Zinc
Ga  Gallium
Ge  Germanium
As  Arsenic
Se  Selenium
Br  Bromine
Kr  Krypton
Rb  Rubidium
Sr  Strontium
Y   Yttrium
Zr  Zirconium
Nb  Niobium
Mo  Molybdenum
Tc  Technetium
Ru  Ruthenium
Rh  Rhodium
Pd  Palladium
Ag  Silver
Cd  Cadmium
In  Indium
Sn  Tin
Sb  Antimony
Te  Tellurium
I   Iodine
Xe  Xenon
Cs  Cesium
Ba  Barium
La  Lanthanum
Ce  Cerium
Pr  Praseodymium
Nd  Neodymium
Pm  Promethium
Sm  Samarium
Eu  Europium
Gd  Gadolinium
Tb  Terbium
Dy  Dysprosium
Ho  Holmium
Er  Erbium
Tm  Thulium
Yb  Ytterbium
Lu  Lutetium
Hf  Hafnium
Ta  Tantalum
W   Tungsten
Re  Rhenium
Os  Osmium
Ir  Iridium
Pt  Platinum
Au  Gold
Hg  Mercury
Tl  Thallium
Pb  Lead
Bi  Bismuth
Po  Polonium
At  Astatine
Rn  Radon
Fr  Francium
Ra  Radium
Ac  Actinium
Th  Thorium
Pa  Protactinium
U   Uranium
Np  Neptunium
Pu  Plutonium
Am  Americium
Cm  Curium
Bk  Berkelium
Cf  Californium
Es  Einsteinium
Fm  Fermium
Md  Mendelevium
No  Nobelium
Lr  Lawrencium
Rf  Rutherfordium
Db  Dubnium
Sg  Seaborgium
Bh  Bohrium
Hs  Hassium
Mt  Meitnerium
Ds  Darmstadtium
Rg  Roentgenium
Cn  Copernicium
Nh  Nihonium
Fl  Flerovium
Mc  Moscovium
Lv  Livermorium
Ts  Tennessine
Og  Oganesson

Đầu vào:

Một chuỗi được mã hóa. Bạn có thể thực hiện điều này trong tất cả các chữ hoa hoặc chữ thường nếu bạn muốn, miễn là bạn chỉ định yêu cầu đó trong câu trả lời của mình.

Đầu ra:

Chuỗi, được mã hóa như đã phác thảo trước đó nếu có thể.

Ví dụ:

Hi!                --> HydrogenIodine!
This is an example --> This is an example
Neon               --> NeonOxygenNitrogen
Snip               --> SulfurNitrogenIodinePhosphorus OR TinIodinePhosphorus
Nag                --> NitrogenSilver

Ghi điểm:

Đây là , mã ngắn nhất tính bằng byte thắng!


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Dennis

Mọi người có thể chỉ lấy các yếu tố và biểu tượng làm từ điển làm đầu vào vì cho đến nay, thách thức này về cơ bản là tất cả về việc nén nó?
Daniel

@Dopapp, không, vì điều đó sẽ làm cho các câu trả lời đã được gửi, và mọi người đã làm việc rất chăm chỉ, hoàn toàn không bị cạnh tranh. Nén các yếu tố luôn luôn là một thách thức lớn nhất.
Gryphon

Câu trả lời:


2

Mathicala, 404 (239) byte

S="";l=ToLowerCase;e=ElementData;Unprotect[e];a="Abbreviation";n="Name";e[113,a]="Nh";e["Nh",n]="Nihonium";e[115,a]="Mc";e["Mc",n]="Moscovium";e[117,a]="Ts";e["Ts",n]="Tennessine";e[118,a]="Og";e["Og",n]="Oganesson";r=StringReplace;A=Reverse@SortBy[Table[e[j,a],{j,118}],StringLength];If[StringFreeQ[r[l@S,Table[l@A[[j]]->"",{j,118}]],Alphabet[]],r[l@S,Table[l@A[[j]]->Capitalize@e[A[[j]],n],{j,118}]],S]

Sử dụng cơ sở dữ liệu tích hợp của Mathematica để tìm nạp các tên thành phần và tên viết tắt của chúng. Đầu vào có thể được trộn lẫn chữ thường và chữ hoa và được lưu trong biến S. Đầu ra là kết quả của biểu thức, nó không được in rõ ràng.

Tại thời điểm này, mã hoạt động đầy đủ chiếm 404 byte, vì cơ sở dữ liệu hóa học tích hợp của Mathicala chậm hơn một chút. ElementData[118, "Name"]trả về ununoctiumthay vì oganesson(các phần tử siêu nặng chỉ được đặt tên gần đây, ununoctium là tên giữ chỗ cho phần tử 118).
Để cập nhật ElementData, tôi bỏ bảo vệ nó và sửa các giá trị cho các yếu tố Nihonium (113), Moscovium (115), Tennessine (118) và Oganesson (118).

Nếu cơ sở dữ liệu của Mathicala được cập nhật, tôi sẽ chỉ yêu cầu 239 byte.

S="";l=ToLowerCase;e=ElementData;r=StringReplace;A=Reverse@SortBy[Table[e[j,"Abbreviation"],{j,118}],StringLength];If[StringFreeQ[r[l@S,Table[l@A[[j]]->"",{j,118}]],Alphabet[]],r[l@S,Table[l@A[[j]]->Capitalize@e[A[[j]],"Name"],{j,118}]],S]

6

JavaScript (ES6), 881 871 byte

Lấy chuỗi đầu vào trong tất cả các mũ.

s=>(o={},'HEelLIithBEeryllMGagnesCAalcTIitanVanadCRhromGAallGEermanSEelenRBubidSRtrontYttrZRirconTCechnetRUuthenRHhodPDalladCDadmTEellurBAarCEerPRraseodymNDeodymPMromethSMamarEUuropGDadolinTBerbDYysprosERrbTMhulLUutetREhenIRridTLhallFRrancRAadACctinTHhorPArotactinUranAMmericCMurESinsteinFMermMDendelevLRawrencRFutherfordDBubnSGeaborgMTeitnerDSarmstadtRGoentgenFLlerovMCoscovLVivermorHydrogenBoronCarbonNitrogenOxygenFluorineNEeonALluminumPhosphorusSulfurCLhlorineARrgonMNanganeseZNincASrsenicBRromineKRryptonMOolybdenumIodineXEenonLAanthanumTAantalumPTlatinumATstatineRNadonTSennessineOGganessonNAsodiumKpotassiumFEironAGsilverWtungstenAUgoldHGmercury'.split(/([A-Z]+|[a-z]+)/).map((r,i,a)=>i%4-3?0:o[e=a[i-2]]=i>339?r[0].toUpperCase()+r.slice(1):e[0]+r+(i<235?'ium':'')),g=([c,...s],r)=>c?c<'A'|c>'Z'?g(s,r+c):o[c]&&g(s,r+o[c])||o[c+=s.shift()]&&g(s,r+o[c]):r)(s,'')||s

Các trường hợp thử nghiệm mở rộng

Vì thử thách này cũng là một biến thể của vấn đề tập hợp chính xác, tôi đã thêm các trường hợp kiểm tra sau:

  • "NA" → "Natri"
  • "NAG" → "N" + "AG" → "NitrogenSilver"
  • "NAP" → "NA" + "P" → "NatriPhospho"

Làm sao?

Tối ưu hóa sơ bộ

Chúng tôi hoàn toàn bỏ qua 26 yếu tố sau, bởi vì chúng có thể được thay thế một cách an toàn bằng hai biểu tượng của một ký tự trong số BCFHIKNOPSUVWY:

Bh, Bi, Bk, Cf, Cn, Co, Cs, Cu, Hf, Ho, Hs, In, Nb,
Nh, Ni, No, Np, Os, Pb, Po, Pu, Sb, Sc, Si, Sn, Yb

Mã hóa và giải mã các yếu tố

Chúng tôi sử dụng một danh sách xen kẽ các ký hiệu phần tử trong chữ hoa và tên phần tử trong chữ thường. Các biểu tượng luôn được lưu trữ nguyên trạng, trong khi các tên được rút ngắn theo các quy tắc sau:

  1. Nếu chữ cái đầu tiên của tên khớp với chữ cái đầu tiên của biểu tượng, chúng ta bỏ qua nó.
  2. Nếu phần tử vượt qua quy tắc số 1 và tên của nó kết thúc bằng "ium", chúng ta sẽ bỏ qua hậu tố này.

Ví dụ:

  • Ag / Bạc: "AGsilver"
  • K / Kali: "Kali"
  • Zn / Kẽm: "ZNinc"
  • Anh ấy / Helium: "HEel"

58 phần tử kích hoạt cả hai quy tắc được lưu trữ ở đầu danh sách, theo sau là 27 phần tử chỉ kích hoạt quy tắc số 1, theo sau là 7 phần tử không kích hoạt bất kỳ quy tắc nào.

Chúng tôi giải mã danh sách này để điền vào bảng tra cứu o , trong đó các khóa là ký hiệu và các giá trị là tên thành phần được giải mã:

"HEelLIith[...]HGmercury"       // encoded list
.split(/([A-Z]+|[a-z]+)/)       // split it by character case, which gives:
                                // [ '', 'HE', '', 'el', '', 'LI', '', 'ith', etc. ]
.map((r, i, a) =>               // for each item 'r' at position 'i' in this array 'a':
  i % 4 - 3 ?                   //   if we're not currently pointing to an element name:
    0                           //     do nothing
  :                             //   else:
    o[e = a[i - 2]] =           //     save o[e], where e = element symbol
      i > 339 ?                 //     if symbol/name first letters do not match:
        r[0].toUpperCase() +    //       we need to capitalize the first letter of the name
        r.slice(1)              //       and keep the rest unchanged
      :                         //     else:
        e[0] +                  //       we use the first letter of the symbol,
        r +                     //       followed by the name,
        (i < 235 ? 'ium' : '')  //       followed by the 'ium' suffix when appropriate
)                               // end of map()

Bao gồm chuỗi đầu vào

Chúng tôi cố gắng thay thế tất cả các chữ cái viết hoa trong chuỗi đầu vào bằng các ký hiệu phần tử, sử dụng hàm đệ quy g () cuối cùng trả về một chuỗi thay thế hoặc không xác định nếu không tìm thấy bìa chính xác:

g = ([c,                                  // c = next character
         ...s],                           // s = array of remaining characters
                r) =>                     // r = replacement string
  c ?                                     // if there's still at least one character:
    c < 'A' | c > 'Z' ?                   //   if it's not an upper-case letter:
      g(s, r + c)                         //     just append it to 'r'
    :                                     //   else:
      o[c] && g(s, r + o[c]) ||           //     try to find a symbol matching 'c'
      o[c += s.shift()] && g(s, r + o[c]) //     or a symbol matching 'c' + the next char.
  :                                       // else:
    r                                     //   success: return 'r'

2

Javascript, 1487 1351 1246 1170 1243 1245 byte

đã lưu được 234 byte nhờ @ musicman523

đã lưu được 174 byte nhờ @ovs

đã lưu 7 byte nhờ @Shaggy

đã thêm 75 byte để làm cho nó hoạt động cho 2 phần tử chữ cái

b=>~((o=0,d=Array.from([...b].map((u,i,a)=>(h=e=>("he0Hel2h0Hydrogen1li0Lith2be0Beryll2b0Boron1c0Carbon1n0Nitrogen1o0Oxygen1f0Fluorine1ne0Neon1na0Sod2mg0Magnes2al0Aluminum1p0Phosphorus1s0Sulfur1cl0Chlorine1ar0Argon1k0Potass2ca0Calc2ti0Titan2v0Vanad2cr0Chrom2mn0Manganese1fe0Iron1ni0Nickel1cu0Copper1zn0Zinc1ga0Gall2ge0German2as0Arsenic1se0Selen2br0Bromine1kr0Krypton1rb0Rubid2sr0Stront2y0Yttr2zr0Zircon2nb0Niob2mo0Molybdenum1tc0Technet2ru0Ruthen2rh0Rhod2pd0Pallad2ag0Silver1cd0Cadm2in0Ind2te0Tellur2i0Iodine1xe0Xenon1cs0Ces2ba0Bar2la0Lanthanum1ce0Cer2pr0Praseodym2nd0Neodym2pm0Prometh2sm0Samar2eu0Europ2gd0Gadolin2tb0Terb2dy0Dyspros2ho0Holm2er0Erb2tm0Thul2lu0Lutet2hf0Hafn2ta0Tantalum1w0Tungsten1re0Rhen2ir0Irid2pt0Platinum1au0Gold1hg0Mercury1tl0Thall2at0Astatine1rn0Radon1fr0Franc2ra0Rad2ac0Actin2th0Thor2pa0Protactin2u0Uran2np0Neptun2pu0Pluton2am0Americ2cm0Cur2bk0Berkel2cf0Californ2es0Einstein2fm0Ferm2md0Mendelev2no0Nobel2lr0Lawrenc2rf0Rutherford2db0Dubn2sg0Seaborg2bh0Bohr2hs0Hass2mt0Meitner2ds0Darmstadt2rg0Roentgen2nh0Nihon2fl0Flerov2mc0Moscov2lv0Livermor2ts0Tennessine1og0Oganesson".replace(/2/g,'ium1').split(1).map(a=>a.split(0)).find(a=>a[0]==e)||[,0])[1],o?(o=0,''):((p=a[i+1])&&(o=1,h(u+p))||(o=0,h(u)))))).join``).search(0))?b:d

(Hơi nhiều) phiên bản dễ đọc:

b=>~((o=0,d=Array.from([...b].map((u,i,a)=>(h=e=>(
"he0Hel2h0Hydrogen1li0Lith2be0Beryll2b0Boron1c0Carbon1n0Nitrogen1o0Oxygen1f0Flu            
orine1ne0Neon1na0Sod2mg0Magnes2al0Aluminum1p0Phosphorus1s0Sulfur1cl0Chlorine1ar0
Argon1k0Potass2ca0Calc2ti0Titan2v0Vanad2cr0Chrom2mn0Manganese1fe0Iron1ni0Nickel1
cu0Copper1zn0Zinc1ga0Gall2ge0German2as0Arsenic1se0Selen2br0Bromine1kr0Krypton1rb
0Rubid2sr0Stront2y0Yttr2zr0Zircon2nb0Niob2mo0Molybdenum1tc0Technet2ru0Ruthen2rh0
Rhod2pd0Pallad2ag0Silver1cd0Cadm2in0Ind2te0Tellur2i0Iodine1xe0Xenon1cs0Ces2ba0Ba
r2la0Lanthanum1ce0Cer2pr0Praseodym2nd0Neodym2pm0Prometh2sm0Samar2eu0Europ2gd0Gad
olin2tb0Terb2dy0Dyspros2ho0Holm2er0Erb2tm0Thul2lu0Lutet2hf0Hafn2ta0Tantalum1w0Tu
ngsten1re0Rhen2ir0Irid2pt0Platinum1au0Gold1hg0Mercury1tl0Thall2at0Astatine1rn0Ra
don1fr0Franc2ra0Rad2ac0Actin2th0Thor2pa0Protactin2u0Uran2np0Neptun2pu0Pluton2am0
Americ2cm0Cur2bk0Berkel2cf0Californ2es0Einstein2fm0Ferm2md0Mendelev2no0Nobel2lr0
Lawrenc2rf0Rutherford2db0Dubn2sg0Seaborg2bh0Bohr2hs0Hass2mt0Meitner2ds0Darmstadt
2rg0Roentgen2nh0Nihon2fl0Flerov2mc0Moscov2lv0Livermor2ts0Tennessine1og0Oganesson
".replace(/2/g,'ium1').split(1).map(a=>a.split(0)).find(a=>a[0]==e)||[,0])[1],o?
(o=0,''):((p=a[i+1])&&(o=1,h(u+p))||(o=0,h(u)))))).join``).search(0))?b:d

"phiên bản có thể đọc được", yeah, hoàn toàn có thể đọc được. Công việc tốt mặc dù. Đây sẽ là một thách thức chuyên sâu về byte đối với bất kỳ lang nào không tích hợp sẵn các phần tử (bất cứ thứ gì không phải là Mathicala).
Gryphon

1
Bạn có thể tính ra "ium" để lưu byte không?
sĩ523

Đó là một ý tưởng hay, @ musicman523
Gryphon

@Gryphon Bạn cũng có thể thử bao thanh toán on. Ngoài ra, nếu bạn muốn làm cho nó dễ đọc hơn, hãy sử dụng các phân định dễ đọc hơn 01. Ví dụ như bất kỳ ,;.!/-_:~ *|=+'".
DanTheMan

1
Điều này không xác định được các phần tử 2 ký tự trong chuỗi đầu vào.
Arnauld
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.