Pesan Rahasia Bagian 1, Elemen


8

Anda dan teman Anda ingin saling mengirim pesan rahasia. Namun, karena Anda adalah ahli teori konspirasi dan berpikir bahwa pemerintah memiliki komputer kuantum yang dapat memecahkan semua enkripsi standar. Karena itu, Anda menciptakan salah satu dari Anda sendiri. Langkah pertama ini adalah sebagai berikut: mengambil string input, Anda memeriksa apakah semua huruf dapat diwakili oleh simbol untuk elemen-elemen tabel periodik (tidak sensitif huruf). Jika bisa, Anda mengganti setiap bagian dengan nama elemen yang dilambangkan simbol. Jika semua huruf tidak dapat diganti dengan cara ini, Anda cukup menggunakan string asli.

Tugas Anda:

Anda harus menulis program atau fungsi yang menyandikan pesan, seperti yang diuraikan sebelumnya. Ingat bahwa jika program Anda mengambil data dari sumber luar, ukuran sumber luar harus ditambahkan ke jumlah byte ( celah ini ). Elemen dan simbol yang digunakan ada di sini:

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

Memasukkan:

String yang akan dikodekan. Anda dapat mengambil ini dalam semua huruf besar atau huruf kecil jika Anda mau, selama Anda menentukan persyaratan itu dalam jawaban Anda.

Keluaran:

String, dikodekan seperti yang dijelaskan sebelumnya jika memungkinkan.

Contoh:

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

Mencetak:

Ini adalah , kode terpendek dalam byte yang menang!


Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Dennis

Bisakah semua orang hanya mengambil elemen dan simbol sebagai kamus sebagai input karena sampai sekarang, tantangan ini pada dasarnya adalah tentang mengompresi itu?
Daniel

@Dappapp, tidak, karena itu akan membuat jawaban yang telah dikirimkan, dan bahwa orang-orang telah bekerja sangat keras, sama sekali tidak kompetitif. Memampatkan elemen selalu menjadi sebagian besar tantangan.
Gryphon

Jawaban:


2

Mathematica, 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]

Menggunakan basis data bawaan Mathematica untuk mengambil nama elemen dan singkatannya. Input dapat dicampur huruf besar dan kecil dan disimpan dalam variabel S. Outputnya adalah hasil ekspresi, tidak dicetak secara eksplisit.

Pada saat ini kode yang berfungsi penuh memakan 404 byte, karena basis data kimia Mathematica sedikit tertinggal. ElementData[118, "Name"]mengembalikan ununoctiumbukan oganesson(elemen super-berat di mana hanya baru-baru ini dinamai dengan benar, ununoctium adalah nama pengganti untuk elemen 118).
Untuk memperbarui ElementData, saya membuka proteksi dan memperbaiki nilai untuk elemen Nihonium (113), Moscovium (115), Tennessine (118) dan Oganesson (118).

Jika basis data Mathematica terkini, saya hanya akan membutuhkan 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

Mengambil string input dalam semua huruf besar.

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

Kasus uji yang diperpanjang

Karena tantangan ini juga merupakan varian dari masalah set penutup yang tepat, saya telah menambahkan kasus uji berikut:

  • "NA" → "Sodium"
  • "NAG" → "N" + "AG" → "NitrogenSilver"
  • "NAP" → "NA" + "P" → "SodiumPhosphorus"

Bagaimana?

Optimasi awal

Kami mengabaikan 26 elemen berikut ini sepenuhnya, karena mereka dapat dengan aman diganti dengan dua simbol satu karakter di antara 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

Pengkodean dan penguraian elemen

Kami menggunakan daftar simbol elemen yang bertautan dalam huruf besar dan nama elemen dalam huruf kecil. Simbol selalu disimpan apa adanya, sedangkan nama dipersingkat sesuai dengan aturan berikut:

  1. Jika huruf pertama dari nama tersebut cocok dengan huruf pertama dari simbol, kami menghilangkannya.
  2. Jika elemen melewati aturan # 1 dan namanya berakhir dengan "ium", kami menghilangkan akhiran ini.

Contoh:

  • Ag / Perak: "AGsilver"
  • K / Potassium: "Kpotassium"
  • Zn / Seng: "ZNinc"
  • He / Helium: "HEel"

58 elemen yang memicu kedua aturan disimpan di awal daftar, diikuti oleh 27 elemen yang memicu aturan # 1 saja, diikuti oleh 7 elemen yang tidak memicu aturan apa pun.

Kami mendekode daftar ini untuk mengisi tabel pencarian o , di mana kuncinya adalah simbol dan nilainya adalah nama elemen yang diterjemahkan:

"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()

Menutupi string input

Kami mencoba mengganti semua huruf besar dalam string input dengan simbol elemen, menggunakan fungsi rekursif g () yang akhirnya mengembalikan string pengganti atau tidak terdefinisi jika tidak ditemukan sampul yang tepat:

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

disimpan 234 byte berkat @ musicman523

disimpan 174 byte berkat @ovs

disimpan 7 byte berkat @Shaggy

menambahkan 75 byte untuk membuatnya berfungsi untuk elemen 2 huruf

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

(Lebih sedikit) versi yang dapat dibaca:

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

"versi yang dapat dibaca", yeah, benar-benar dapat dibaca. Pekerjaan yang bagus. Ini akan menjadi tantangan byte-intensif untuk bahasa apa pun yang tidak memiliki elemen bawaan (apa pun yang bukan Mathematica).
Gryphon

1
Bisakah Anda memfaktorkan "ium" untuk menyimpan byte?
musicman523

Itu ide yang bagus, @ musicman523
Gryphon

@Gryphon Anda juga bisa mencoba memfaktorkan on. Juga, jika Anda ingin membuatnya lebih mudah dibaca manusia, gunakan lebih banyak delineator yang bisa dibaca daripada 0dan 1. Misalnya ada ,;.!/-_:~ *|=+'".
DanTheMan

1
Ini gagal mengidentifikasi elemen 2 karakter dalam string input.
Arnauld
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.