Um desafio elementar


16

Este desafio é inspirado nesta citação de Oliver Sacks:

“Aos 11 anos, eu poderia dizer 'eu sou sódio' (Elemento 11), e agora aos 79, eu sou ouro.” - Oliver Sacks

Quero que você encontre números em uma string e os substitua pelos símbolos dos elementos correspondentes. (1 é H, 2 é Ele, 3 é Li, etc.) Existem algumas regras a seguir:

  • Dígitos simples e duplos são substituídos por seus elementos correspondentes normalmente. Ignore 0s no início dos números. Se houver apenas 0s em um número, ignore-o. Por exemplo, 1 01 10 0 00torna-seH H Ne 0 00
  • Mais de 2 dígitos juntos são divididos em grupos de 2. Um número ímpar de dígitos deve ter um dígito extra extra no final. Por exemplo, 0153 5301 153se tornaria HI IH PLiPor causa dessa regra, você só precisará conhecer os elementos de 1 a 99
  • Os números devem ser tratados da mesma forma, independentemente dos caracteres que os cercam, e vírgulas e pontos decimais não fazem parte dos números. P90X 42,800 3.14159se tornariaPThX Mo,Hg0 Li.SiPF

Exemplo de entradas / saídas (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.

A entrada estará no formato mais próximo de uma string do seu idioma.

Uma tabela periódica para referência:

Isso é , então seu programa será pontuado em bytes.


17
John Cena é moderador do PPCG? ;-)
Level River St

5
Por favor, dar as boas-vindas ao nosso novo moderador JOHN CENA música e airhorns começar estridente
um Spaghetto

instantcena.com
DanTheMan

Respostas:


7

Mathematica, 96 94 89 bytes

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

Mma tem vários conjuntos de dados ...


Bem, é claro que um conjunto de dados embutido superará uma sequência compactada de 139 bytes. ;)
ETHproductions

@ETHproductions Estou surpreso que essa tenha sido a resposta mais curta por 9 horas. Normalmente, este lugar é reservado para CJam e Pyth: D
LegionMammal978

Bem, vejamos: para vencer 89 bytes, seria necessário condensar demais os 184 caracteres alfabéticos necessários - E criar um programa para decodificá-lo - em menos de 89 bytes (muito improvável) OU encontrar outro idioma que tenha sido construído no conjunto de dados dos elementos apropriados (nem CJam ou Pyth). Portanto, isso provavelmente acabará sendo o vencedor.
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)

A string omitida contém caracteres não imprimíveis, então aqui está um hexdump (provavelmente reversível):

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

A técnica aqui era colocar todas as abreviações de elementos em uma sequência, separadas por nada - é para isso que /[A-Z][a-z]?/gserve o segundo regex ; corresponde a cada letra maiúscula, opcionalmente seguida por uma letra minúscula. O primeiro regex,, /\d\d?/gcorresponde a cada conjunto de 2 (ou 1) dígitos na entrada, portanto, substitui cada conjunto de dígitos N pelo elemento no índice N na sequência descompactada e correspondente.

Aqui está a string original, se alguém mais quiser usá-la: ( Aas extremidades são preenchimentos)

AHHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsA

Perguntas e sugestões são bem-vindas!


11
Que tal Uuse Uuo?
Conor O'Brien

3
@ CᴏɴᴏʀO'Bʀɪᴇɴ - A pergunta requer apenas até o elemento 99, que é o Einsteinio (Es), portanto os elementos não confirmados (que, portanto, não têm nomes finais e são escritos com três caracteres) não são considerados.
Glen O

Agradável. Eu acho que você não precisa do cheque +y?...:...como você está substituindo grupos dígito
edc65

@ edc65 Obrigado. Uma das regras é que qualquer 00 na entrada precisa ser inalterado, para que a verificação seja necessária.
ETHproductions

agora eu vejo. Ainda assim, você pode usar em [y]vez de [+y]e salvar 1
byt

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 teste:

>>> 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')retorna 'PThX Mo, Hgs Li.SiPF' em vez de 'PThX Mo, Hg0 Li.SiPF' e f('1 01 10 0 00')retorna 'HH Ne s' em vez de 'HH Ne 0 00' . A propósito, eu apenas usei sua abordagem de fatia estendida na minha solução Python 2. Obrigado!
cr3 29/10/2015

@ cr3: Corrigido 0 e 00.
kennytm

bom, você me venceu por 19 bytes!
cr3 29/10

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

Essa cria uma função f que pega uma sequência de números como argumento e retorna a sequência correspondente com os símbolos dos elementos substituídos.

A função itera sobre cadeias de um a dois dígitos ( '1' , '01' , '10' , '00' mas não '0' ) ou um caractere ( 'a' , '0' mas não '1' ). No caso de dígitos, a sequência é convertida em um número inteiro e procurada em uma sequência concatenada de símbolos de elementos em que cada símbolo é preenchido com dois caracteres. No caso de caracteres, a string é simplesmente usada sem consulta.

Os testes para cada exemplo na pergunta são aprovados:

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.'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.