Una sfida elementare


16

Questa sfida è ispirata a questa citazione di Oliver Sacks:

"A 11 anni, potrei dire 'I am sodium' (Element 11), e ora a 79, sono oro." - Oliver Sacks

Voglio che trovi i numeri in una stringa e li sostituisci con i simboli degli elementi corrispondenti. (1 è H, 2 è He, 3 è Li, ecc.) Ci sono alcune regole da seguire:

  • Le cifre singole e doppie vengono sostituite con gli elementi corrispondenti normalmente. Ignora 0 all'inizio dei numeri. Se ci sono solo 0 in un numero, ignoralo. Ad esempio 1 01 10 0 00diventaH H Ne 0 00
  • Più di 2 cifre insieme vengono divise in gruppi di 2. Un numero dispari di cifre dovrebbe avere la cifra singola aggiuntiva alla fine. Ad esempio 0153 5301 153diventerebbe HI IH PLiA causa di questa regola, dovrai solo conoscere gli elementi da 1 a 99
  • I numeri devono essere trattati allo stesso modo, indipendentemente dai caratteri che li circondano e le virgole e i punti decimali non fanno parte dei numeri. P90X 42,800 3.14159potrebbe diventarePThX Mo,Hg0 Li.SiPF

Ingressi / uscite di esempio (I / O):

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.

L'input sarà nel formato più vicino a una stringa della tua lingua.

Una tavola periodica di riferimento:

Questo è , quindi il tuo programma verrà segnato in byte.


17
John Cena è moderatore di PPCG? ;-)
Level River St

5
Per favore, dai un caloroso benvenuto al nostro nuovo moderatore, la musica di
uno spaghetto il

instantcena.com
DanTheMan,

Risposte:


7

Mathematica, 96 94 89 byte

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

Mma ha diversi set di dati ...


Ovviamente un set di dati incorporato batterà una stringa compressa da 139 byte. ;)
ETHproductions,

@ETHproductions Sono solo sorpreso che questa sia stata la risposta più breve per 9 ore. Di solito, questo posto è riservato a CJam e Pyth: D
LegionMammal978,

Bene, vediamo: per battere 89 byte, si dovrebbe o condensare in modo superfluo i 184 caratteri alfabetici necessari — E creare un programma per decodificarlo — in meno di 89 byte (molto molto improbabile), O trovare un'altra lingua che abbia un -in set di dati degli elementi propri (né CJam o Pyth). Quindi questo probabilmente finirà per essere il vincitore.
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)

La stringa omessa contiene caratteri non stampabili, quindi ecco un hexdump (si spera reversibile):

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              =¥.¤û..)..'Ä°

La tecnica qui era quella di mettere tutte le abbreviazioni degli elementi in una stringa, separate da nulla: ecco cosa è la seconda regex /[A-Z][a-z]?/g serve ; corrisponde a ogni lettera maiuscola, facoltativamente seguita da una lettera minuscola. Il primo regex, /\d\d?/gcorrisponde a ciascun set di 2 (o 1) cifre nell'input, quindi questo sostituisce ogni set di cifre N con l'elemento all'indice N nella stringa decompressa, abbinata.

Ecco la stringa originale, se qualcun altro vorrebbe usarla: (quelli Aalle estremità sono riempitivi)

AHHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsA

Domande e suggerimenti benvenuti!


1
Che dire di Uuse Uuo?
Conor O'Brien,

3
@ CᴏɴᴏʀO'Bʀɪᴇɴ - La domanda richiede solo fino all'elemento 99, che è Einsteinium (Es), quindi gli elementi non confermati (che quindi non hanno nomi finali e sono scritti con tre caratteri) non tengono conto affatto.
Glen O,

Bello. Penso che non sia necessario il controllo +y?...:...poiché si stanno sostituendo i gruppi di cifre
edc65,

@ edc65 Grazie. Una delle regole è che qualsiasi 00 nell'input deve essere invariato, quindi è necessario un controllo.
ETHproductions

ora vedo. Puoi ancora usare[y] al posto di [+y]e salvare 1 byte
edc65

1

Python 3, 278 285 byte

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)

Casi test:

>>> 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'

f('P90X 42,800 3.14159')restituisce "PThX Mo, Hgs Li.SiPF" anziché "PThX Mo, Hg0 Li.SiPF" e f('1 01 10 0 00')restituisce "HH Ne s s" anziché "HH Ne 0 00" . A proposito, ho appena usato il tuo approccio di suddivisione estesa nella mia soluzione Python 2. Grazie!
cr3

@ cr3: fissi 0 e 00.
kennytm

bello, mi hai battuto di 19 byte!
cr3

0

Python 2, 312 304 byte

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

Questo crea una funzione f che accetta una stringa di numeri come argomento e restituisce la stringa corrispondente con i simboli degli elementi sostituiti.

La funzione scorre su stringhe da una a due cifre ( '1' , '01' , '10' , '00' ma non '0' ) o un carattere ( 'a' , '0' ma non '1' ). Nel caso delle cifre, la stringa viene convertita in un numero intero e cercata in una stringa concatenata di simboli di elementi in cui ogni simbolo è riempito con due caratteri. Nel caso dei caratteri, la stringa viene semplicemente utilizzata senza ricerca.

I test per ogni esempio nella domanda passano tutti:

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.'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.