Eine elementare Herausforderung

16

Diese Herausforderung ist inspiriert von diesem Zitat von Oliver Sacks:

„Mit 11 könnte ich sagen, dass ich Natrium bin (Element 11), und jetzt mit 79 bin ich Gold.“ - Oliver Sacks

Ich möchte, dass Sie Zahlen in einer Zeichenfolge finden und durch die Symbole der entsprechenden Elemente ersetzen. (1 ist H, 2 ist He, 3 ist Li usw.) Es gibt einige Regeln, die befolgt werden müssen:

  • Einzelne und zweistellige Ziffern werden wie gewohnt durch die entsprechenden Elemente ersetzt. Ignorieren Sie Nullen am Anfang von Zahlen. Wenn eine Zahl nur Nullen enthält, ignorieren Sie sie. ZB 1 01 10 0 00wirdH H Ne 0 00
  • Mehr als 2 Ziffern werden zusammen in 2er-Gruppen aufgeteilt. Bei einer ungeraden Anzahl von Ziffern sollte die zusätzliche einzelne Ziffer am Ende stehen. Zum Beispiel 0153 5301 153würde HI IH PLiAufgrund dieser Regel werden nur die Elemente 1-99 wissen müssen
  • Zahlen werden gleich behandelt, unabhängig davon, welche Zeichen sie umgeben, und Kommas und Dezimalstellen sind keine Teile von Zahlen. P90X 42,800 3.14159würde werdenPThX Mo,Hg0 Li.SiPF

Beispiel Ein- / Ausgänge (E / A):

I: 32289216
O: GeNiUS

I: J08017 5811
O: JOHN CeNa

I: M18227 0592tt10r
O: MArTiN BUttNer

I: De072816
O: DeNNiS

I: D088r1907085
O: DOOrKNOB

I: 13ex A.
O: Alex A.

Die Eingabe erfolgt im Format, das der Zeichenfolge Ihrer Sprache am nächsten kommt.

Ein Periodensystem als Referenz:

Dies ist , daher wird Ihr Programm in Bytes gewertet.

DanTheMan
quelle
17
John Cena ist Moderator bei PPCG? ;-)
Level River St
5
Bitte heißen Sie unseren neuen Moderator, JOHN CENA, herzlich willkommen. Die Musik und die Hörner beginnen zu läuten
ein Spaghetto
instantcena.com
DanTheMan

Antworten:

7

Mathematica, 96 94 89 Bytes

StringReplace[#,n:DigitCharacter~Repeated~2/;(d=FromDigits@n)>0:>d~ElementData~"Symbol"]&

Mma hat mehrere Datensätze ...

LegionMammal978
quelle
Natürlich schlägt ein eingebauter Datensatz eine komprimierte 139-Byte-Zeichenfolge. ;)
ETHproductions
@ETHproductions Ich bin nur überrascht, dass dies die kürzeste Antwort seit 9 Stunden war. Normalerweise ist dieser Ort für CJam und Pyth reserviert: D
LegionMammal978
Nun, mal sehen: Um 89 Bytes zu schlagen, müsste man entweder die 184 notwendigen alphabetischen Zeichen überkomprimieren - UND ein Programm erstellen, um sie zu dekodieren - in weniger als 89 Bytes (sehr, sehr unwahrscheinlich), ODER eine andere Sprache finden, die eine eingebaute hat -in Datensatz der richtigen Elemente (weder CJam noch Pyth). Dies wird wahrscheinlich der Gewinner sein.
ETHproductions
3

JavaScript (ES6), 202 Byte

x=>x.replace(/\d\d?/g,y=>+y?btoa`(139 bytes; see hexdump below)`.match(/[A-Z][a-z]?/g)[+y]:y)

Die ausgelassene Zeichenfolge enthält nicht druckbare Zeichen, daher hier ein (hoffentlich umkehrbarer) Hexdump:

00000000: 0071 de2e 205e 0423 4e14 d78d 68c8 0095 288f  .qÞ. ^.#N.×.hÈ..(.
00000012: 4829 40ac a09a 49c4 e254 2acc 9c57 82a0 d882  H)@¬ .IÄâT*Ì.W. Ø.
00000024: b999 c668 6780 b127 81ac aad1 6d2a d866 b35b  ¹.Æhg.±'.¬ªÑm*Øf³[
00000036: 3284 dc46 e461 3dd0 2009 d227 4a74 9b4d e217  2.ÜFäa=Ð .Ò'Jt.Mâ.
00000048: 782b 0168 b682 78fa cd74 f992 984b 8675 36c3  x+.h¶.xúÍtù..K.u6Ã
0000005a: c87a 04ad 3998 6cbb 877d 3696 45e3 ac22 b3ed  Èz..­9.l».}6.Eã¬"³í
0000006c: 02e1 e04e 53db 0623 e802 d467 16b4 5a01 c4e1  .áàNSÛ.#è.Ôg.´Z.Äá
0000007e: 3da5 0da4 fb80 9829 8190 27c4 b0              =¥.¤û..)..'Ä°

Die Technik hier bestand darin, alle Elementabkürzungen in eine durch nichts getrennte Zeichenfolge zu setzen - das ist, wofür die zweite Regex /[A-Z][a-z]?/gist; Es entspricht jedem Großbuchstaben, optional gefolgt von einem Kleinbuchstaben. Der erste reguläre Ausdruck /\d\d?/gstimmt mit jedem Satz von 2 (oder 1) Ziffern in der Eingabe überein, sodass jeder Satz von Ziffern N durch das Element am Index N in der dekomprimierten, übereinstimmenden Zeichenfolge ersetzt wird.

Hier ist die ursprüngliche Zeichenfolge, falls jemand anderes sie verwenden möchte: ( ADie Enden sind Füllzeichen.)

AHHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsA

Fragen und Anregungen willkommen!

ETHproductions
quelle
1
Was ist mit Uusund Uuo?
Conor O'Brien
3
@ CᴏɴᴏʀO'Bʀɪᴇɴ - Die Frage erfordert nur bis zu Element 99, also Einsteinium (Es), sodass die nicht bestätigten Elemente (die daher keine endgültigen Namen haben und mit drei Zeichen geschrieben sind) überhaupt nicht berücksichtigt werden.
Glen O
Nett. Ich denke, Sie brauchen den Scheck nicht, +y?...:...da Sie Zifferngruppen ersetzen
edc65
@ edc65 Danke. Eine der Regeln ist, dass alle 00 in der Eingabe unverändert sein müssen, sodass eine Überprüfung erforderlich ist.
ETHproductions
jetzt sehe ich. Trotzdem können Sie [y]anstelle von [+y]1 Byte speichern
edc65 29.10.15
1

Python 3, 278 285 Bytes

import re;f=lambda a:re.sub('(?!00)\d\d?',lambda m:'0HHLBBCNOFNNMASPSCAKCSTVCMFCNCZGGASBKRSYZNMTRRPACISSTIXCBLCPNPSEGTDHETYLHTWROIPAHTPBPARFRATPUNPACBCE  eie     eagli  lr aci rneoiunaeserrbr rbocuhdgdnnbe esaaerdmmudbyormbufa esrtuglbiotnracha pummkfs'[int(m.group())::100].strip(),a)

Testfälle:

>>> f('32289216')
'GeNiUS'
>>> f('J08017 5811')
'JOHN CeNa'
>>> f('M18227 0592tt10r')
'MArTiN BUttNer'
>>> f('De072816')
'DeNNiS'
>>> f('D088r1907085')
'DOOrKNOB'
>>> f('13ex A.')
'Alex A.'
>>> f('P90X 42,800 3.14159')
'PThX Mo,Hg0 Li.SiPF'
>>> f('1 01 10 0 00')
'H H Ne 0 00'
kennytm
quelle
f('P90X 42,800 3.14159')gibt 'PThX Mo, Hgs Li.SiPF' anstelle von 'PThX Mo, Hg0 Li.SiPF' zurück und f('1 01 10 0 00')gibt 'HH Ne s' anstelle von 'HH Ne 0 00' zurück . Übrigens habe ich in meiner Python 2-Lösung gerade Ihren erweiterten Slicing-Ansatz verwendet. Vielen Dank!
cr3
@ cr3: Behoben 0 und 00.
kennytm
schön, du hast mich um 19 Bytes geschlagen!
cr3
0

Python 2, 312 304 Bytes

import re
f=lambda a:''.join([j or'0HHLBBCNOFNNMASPSCAKCSTVCMFCNCZGGASBKRSYZNMTRRPACISSTIXCBLCPNPSEGTDHETYLHTWROIPAHTPBPARFRATPUNPACBCE0 eie     eagli  lr aci rneoiunaeserrbr rbocuhdgdnnbe esaaerdmmudbyormbufa esrtuglbiotnracha pummkfs'[int(i)::100].strip() for i,j in re.findall('(\d\d|[1-9])|(.)',a)])

Diese erstellt eine Funktion f, die eine Folge von Zahlen als Argument verwendet und die entsprechende Folge mit ersetzten Elementsymbolen zurückgibt.

Die Funktion durchläuft Zeichenfolgen mit ein bis zwei Ziffern ( "1" , "01" , "10" , "00", aber nicht "0" ) oder ein Zeichen ( "a" , "0", aber nicht "1" ). Bei Ziffern wird die Zeichenfolge in eine Ganzzahl umgewandelt und in einer verketteten Zeichenfolge von Elementsymbolen nachgeschlagen, wobei jedes Symbol mit zwei Zeichen aufgefüllt wird. Bei Zeichen wird der String einfach ohne Lookup verwendet.

Die Tests für jedes Beispiel in der Frage bestehen alle:

assert f('P90X 42,800 3.14159') == 'PThX Mo,Hg0 Li.SiPF'
assert f('1 01 10 0 00') == 'H H Ne 0 00'
assert f('0153 5301 153') == 'HI IH PLi'
assert f('32289216') == 'GeNiUS'
assert f('J08017 5811') == 'JOHN CeNa'
assert f('M18227 0592tt10r') == 'MArTiN BUttNer'
assert f('De072816') == 'DeNNiS'
assert f('D088r1907085') == 'DOOrKNOB'
assert f('13ex A.') == 'Alex A.'
cr3
quelle