Geheime Botschaft Teil 1, Elemente


8

Sie und Ihr Freund möchten sich gegenseitig geheime Nachrichten senden. Sie sind jedoch Verschwörungstheoretiker und glauben, dass die Regierung über einen Quantencomputer verfügt, der jede Standardverschlüsselung knacken kann. Deshalb erfinden Sie eine eigene. Der erste Schritt lautet wie folgt: Mit einer Eingabezeichenfolge prüfen Sie, ob alle Buchstaben durch die Symbole für die Elemente des Periodensystems dargestellt werden können (ohne Berücksichtigung der Groß- und Kleinschreibung). Wenn dies möglich ist, ersetzen Sie jeden Abschnitt durch den Namen des Elements, das das Symbol darstellt. Wenn nicht alle Buchstaben auf diese Weise ersetzt werden können, verwenden Sie einfach die ursprüngliche Zeichenfolge.

Deine Aufgabe:

Sie müssen ein Programm oder eine Funktion schreiben, die eine Nachricht codiert, wie zuvor beschrieben. Denken Sie daran, dass beim Abrufen von Daten von einer externen Quelle die Größe der externen Quelle zur Anzahl der Bytes hinzugefügt werden muss ( diese Lücke ). Die verwendeten Elemente und Symbole sind hier:

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

Eingang:

Eine zu codierende Zeichenfolge. Sie können dies in Groß- oder Kleinbuchstaben schreiben, wenn Sie dies wünschen, solange Sie diese Anforderung in Ihrer Antwort angeben.

Ausgabe:

Die Zeichenfolge, die nach Möglichkeit wie zuvor beschrieben codiert wurde.

Beispiele:

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

Wertung:

Dies ist , kürzester Code in Bytes gewinnt!


Kommentare sind nicht für eine ausführliche Diskussion gedacht. Dieses Gespräch wurde in den Chat verschoben .
Dennis

Kann jeder die Elemente und Symbole einfach als Wörterbuch als Eingabe nehmen, da es bei dieser Herausforderung ab sofort im Wesentlichen darum geht, dies zu komprimieren?
Daniel

@Dopapp, nein, da dies die Antworten, die bereits eingereicht wurden und an denen die Leute sehr hart gearbeitet haben, völlig wettbewerbsunfähig machen würde. Das Komprimieren der Elemente war ohnehin immer die größte Herausforderung.
Gryphon

Antworten:


2

Mathematica, 404 (239) Bytes

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]

Verwenden der in Mathematica integrierten Datenbank zum Abrufen von Elementnamen und deren Abkürzung. Die Eingabe kann in Klein- und Großbuchstaben gemischt werden und wird in der Variablen gespeichert S. Die Ausgabe ist das Ergebnis des Ausdrucks und wird nicht explizit gedruckt.

Der derzeit voll funktionsfähige Code nimmt 404 Bytes ein, da die in Mathematica integrierte chemische Datenbank etwas zurückliegt. ElementData[118, "Name"]gibt ununoctiumstatt oganesson(die superschweren Elemente, bei denen Ununoctium erst kürzlich richtig benannt wurde, war ein Platzhaltername für Element 118).
Zum Aktualisieren ElementDatahebe ich den Schutz auf und korrigiere die Werte für die Elemente Nihonium (113), Moscovium (115), Tennessine (118) und Oganesson (118).

Wenn die Datenbank von Mathematica auf dem neuesten Stand wäre, würde ich nur 239 Bytes benötigen.

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

Nimmt die Eingabezeichenfolge in Großbuchstaben.

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

Erweiterte Testfälle

Da diese Herausforderung auch eine Variante des genauen Deckungssatzproblems ist, habe ich die folgenden Testfälle hinzugefügt:

  • "NA" → "Natrium"
  • "NAG" → "N" + "AG" → "NitrogenSilver"
  • "NAP" → "NA" + "P" → "Natriumphosphor"

Wie?

Vorläufige Optimierung

Wir ignorieren die folgenden 26 Elemente vollständig, da sie sicher durch zwei Symbole eines Zeichens ersetzt werden können 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

Kodierung und Dekodierung der Elemente

Wir verwenden eine Interlaced-Liste von Elementsymbolen in Großbuchstaben und Elementnamen in Kleinbuchstaben. Symbole werden immer unverändert gespeichert, während Namen nach folgenden Regeln gekürzt werden:

  1. Wenn der erste Buchstabe des Namens mit dem ersten Buchstaben des Symbols übereinstimmt, lassen wir ihn weg.
  2. Wenn das Element Regel 1 besteht und sein Name mit "ium" endet, wird dieses Suffix weggelassen.

Beispiele:

  • Ag / Silber: "AGsilver"
  • K / Kalium: "Kkalium"
  • Zn / Zink: "ZNinc"
  • Er / Helium: "HEel"

Die 58 Elemente, die beide Regeln auslösen, werden am Anfang der Liste gespeichert, gefolgt von den 27 Elementen, die nur Regel 1 auslösen, gefolgt von den 7 Elementen, die keine Regel auslösen.

Wir dekodieren diese Liste, um die Nachschlagetabelle o zu füllen , wobei die Schlüssel die Symbole und die Werte die dekodierten Elementnamen sind:

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

Abdeckung der Eingabezeichenfolge

Wir versuchen, alle Großbuchstaben in der Eingabezeichenfolge durch Elementsymbole zu ersetzen, indem wir die rekursive Funktion g () verwenden, die schließlich eine Ersatzzeichenfolge zurückgibt oder undefiniert ist, wenn keine genaue Abdeckung gefunden wird:

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 Bytes

234 Bytes dank @ musicman523 gespart

174 Bytes dank @ovs gespeichert

7 Bytes dank @Shaggy gespart

75 Bytes hinzugefügt, damit es für 2 Buchstabenelemente funktioniert

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

(Etwas mehr) lesbare Version:

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

"lesbare Version", ja, vollständig lesbar. Gute Arbeit. Dies wird eine byteintensive Herausforderung für jede Sprache sein, in der keine Elemente integriert sind (alles, was nicht Mathematica ist).
Gryphon

1
Können Sie "ium" herausrechnen, um Bytes zu sparen?
musicman523

Das ist eine gute Idee, @ musicman523
Gryphon

@Gryphon Sie könnten auch versuchen, herauszufiltern on. Wenn Sie die Lesbarkeit verbessern möchten, verwenden Sie auch besser lesbare Begrenzungslinien als 0und 1. ZB einer von ,;.!/-_:~ *|=+'".
DanTheMan

1
Dadurch werden 2-stellige Elemente in der Eingabezeichenfolge nicht identifiziert.
Arnauld
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.