Un desafío elemental

16

Este desafío está inspirado en esta cita de Oliver Sacks:

"A los 11 años, podría decir 'Soy sodio' (Elemento 11), y ahora a los 79, soy oro". - Oliver Sacks

Quiero que encuentres números en una cadena y los reemplaces con los símbolos de sus elementos correspondientes. (1 es H, 2 es He, 3 es Li, etc.) Hay algunas reglas a seguir:

  • Los dígitos simples y dobles se reemplazan con sus elementos correspondientes de manera normal. Ignora los 0 al comienzo de los números. Si solo hay 0 en un número, ignórelo. Por ejemplo, se 1 01 10 0 00convierteH H Ne 0 00
  • Más de 2 dígitos juntos se dividen en grupos de 2. Un número impar de dígitos debe tener un solo dígito adicional al final. Por ejemplo 0153 5301 153, HI IH PLidebido a esta regla, solo necesitará conocer los elementos del 1 al 99
  • Los números se tratarán de la misma manera, sin importar qué caracteres los rodeen, y las comas y los puntos decimales no son partes de los números. P90X 42,800 3.14159se convertiríaPThX Mo,Hg0 Li.SiPF

Ejemplo de entradas / salidas (E / S):

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.

La entrada estará en el formato más cercano a una cadena que tenga su idioma.

Una tabla periódica para referencia:

Este es el , por lo que su programa se puntuará en bytes.

DanTheMan
fuente
17
John Cena es moderador en PPCG? ;-)
Level River St
55
Por favor denle una cálida bienvenida a nuestro nuevo moderador. La música y los aeroplanos de
un espagueti el
instantcena.com
DanTheMan

Respuestas:

7

Mathematica, 96 94 89 bytes

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

Mma tiene varios conjuntos de datos ...

LegionMammal978
fuente
Bueno, por supuesto, un conjunto de datos incorporado superará una cadena comprimida de 139 bytes. ;)
ETHproductions
@ETHproductions Me sorprende que esta haya sido la respuesta más corta durante 9 horas. Por lo general, este lugar está reservado para CJam y Pyth: D
LegionMammal978
Bueno, veamos: para superar los 89 bytes, uno necesitaría condensar los 184 caracteres alfabéticos necesarios (Y crear un programa para decodificarlo) en menos de 89 bytes (muy poco probable), O encontrar otro idioma que haya construido -en el conjunto de datos de los elementos adecuados (ni CJam ni Pyth). Entonces esto probablemente terminará siendo el ganador.
ETHproductions
3

JavaScript (ES6), 202 bytes

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

La cadena omitida contiene caracteres no imprimibles, así que aquí hay un hexdump (con suerte reversible):

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 técnica aquí consistía en poner todas las abreviaturas de elementos en una cadena, separadas por nada, eso es lo que la segunda expresión regular /[A-Z][a-z]?/g ; coincide con cada letra mayúscula, opcionalmente seguida de una letra minúscula. La primera expresión regular, /\d\d?/gcoincide con cada conjunto de 2 (o 1) dígitos en la entrada, por lo que esto reemplaza cada conjunto de dígitos N con el elemento en el índice N en la cadena descomprimida y coincidente.

Aquí está la cadena original, si a alguien más le gustaría usarla: (los A's en los extremos son rellenos)

AHHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsA

Preguntas y sugerencias bienvenidas!

ETHproducciones
fuente
1
¿Qué hay de Uusy Uuo?
Conor O'Brien
3
@ CᴏɴᴏʀO'Bʀɪᴇɴ: la pregunta solo requiere hasta el elemento 99, que es Einsteinium (Es), por lo que los elementos no confirmados (que, por lo tanto, no tienen nombres finales y están escritos con tres caracteres) no tienen ningún factor en absoluto.
Glen O
Agradable. Creo que no necesita el cheque +y?...:...ya que está reemplazando grupos de dígitos
edc65
@ edc65 Gracias. Una de las reglas es que cualquier 00 en la entrada no debe modificarse, por lo que esa verificación es necesaria.
ETHproductions
ahora veo. Todavía puede usar en [y]lugar de [+y]y guardar 1 byte
edc65
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)

Casos de prueba:

>>> 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
fuente
f('P90X 42,800 3.14159')devuelve 'PThX Mo, Hgs Li.SiPF' en lugar de 'PThX Mo, Hg0 Li.SiPF' y f('1 01 10 0 00')devuelve 'HH Ne s s' en lugar de 'HH Ne 0 00' . Por cierto, acabo de usar su enfoque de corte extendido en mi solución Python 2. ¡Gracias!
cr3
@ cr3: Corregido 0 y 00.
kennytm
bien, me ganaste por 19 bytes!
cr3
0

Python 2, 312304 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)])

Este crea una función f que toma una cadena de números como argumento y devuelve la cadena correspondiente con símbolos de elementos reemplazados.

La función itera sobre cadenas de uno a dos dígitos ( '1' , '01' , '10' , '00' pero no '0' ) o un carácter ( 'a' , '0' pero no '1' ). En el caso de los dígitos, la cadena se convierte en un entero y se busca en una cadena concatenada de símbolos de elementos donde cada símbolo se rellena con dos caracteres. En el caso de los caracteres, la cadena simplemente se usa sin búsqueda.

Todas las pruebas para cada ejemplo en la pregunta pasan:

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
fuente