Podstawowe wyzwanie

16

To wyzwanie jest inspirowane cytatem Olivera Sacksa:

„W wieku 11 lat mógłbym powiedzieć„ Jestem sodu ”(element 11), a teraz w wieku 79 lat jestem złotem.” - Oliver Sacks

Chcę, żebyś znalazł liczby w ciągu i zastąpił je symbolami odpowiadających im elementów. (1 to H, 2 to He, 3 to Li itp.) Należy przestrzegać kilku zasad:

  • Pojedyncze i podwójne cyfry są normalnie zastępowane odpowiadającymi im elementami. Zignoruj ​​0 na początku liczb. Jeśli liczba zawiera tylko 0, zignoruj ​​ją. Na przykład1 01 10 0 00 Staje sięH H Ne 0 00
  • Więcej niż 2 cyfry razem dzielą się na grupy po 2 sztuki. Na końcu nieparzysta liczba cyfr powinna mieć dodatkową pojedynczą cyfrę. Np. Stałby 0153 5301 153sięHI IH PLi Z powodu tej reguły musisz znać tylko elementy od 1 do 99
  • Liczby należy traktować tak samo, bez względu na to, jakie znaki je otaczają, a przecinki i kropki dziesiętne nie są częściami liczb. P90X 42,800 3.14159stanie sięPThX Mo,Hg0 Li.SiPF

Przykładowe wejścia / wyjścia (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.

Dane wejściowe będą miały format najbliższy ciągowi, który ma Twój język.

Układ okresowy w celach informacyjnych:

To jest , więc twój program będzie oceniany w bajtach.

DanTheMan
źródło
17
John Cena jest moderatorem PPCG? ;-)
Level River St
5
Serdecznie witamy naszego nowego moderatora JOHN CENA, a lotniki zaczynają wybuchać
spaghetto
instantcena.com
DanTheMan

Odpowiedzi:

7

Mathematica, 96 94 89 bajtów

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

Mma ma kilka zestawów danych ...

LegionMammal978
źródło
Oczywiście wbudowany zestaw danych pobije 139-bajtowy skompresowany ciąg. ;)
ETHproductions
@ETHproductions Jestem zaskoczony, że to najkrótsza odpowiedź od 9 godzin. Zazwyczaj to miejsce jest zarezerwowane dla CJam i Pyth: D
LegionMammal978
Cóż, zobaczmy: aby pokonać 89 bajtów, należałoby albo super-zagęścić 184 niezbędne znaki alfabetyczne - ORAZ stworzyć program do dekodowania - w mniej niż 89 bajtach (bardzo mało prawdopodobne), LUB znaleźć inny język, który ma wbudowaną -w zestawie danych odpowiednich elementów (ani CJam, ani Pyth). To prawdopodobnie skończy się zwycięstwem.
ETHprodukcje
3

JavaScript (ES6), 202 bajty

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

Pominięty ciąg znaków zawiera niedrukowalne znaki, więc oto zrzut (szesnastkowo odwracalny):

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

Technika polegała na umieszczeniu wszystkich skrótów elementów w jednym ciągu, oddzielonych niczym - po to jest drugi regex /[A-Z][a-z]?/g; pasuje do każdej dużej litery, opcjonalnie z małą literą. Pierwsze wyrażenie regularne /\d\d?/gdopasowuje każdy zestaw 2 (lub 1) cyfr na wejściu, więc zastępuje każdy zestaw cyfr N elementem o indeksie N w zdekompresowanym dopasowanym ciągu.

Oto oryginalny ciąg, jeśli ktoś chciałby go użyć: ( Ana końcach są wypełniacze)

AHHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsA

Pytania i sugestie mile widziane!

ETHprodukcje
źródło
1
Co z Uusi Uuo?
Conor O'Brien
3
@ CᴏɴᴏʀO'Bʀɪᴇɴ - Pytanie wymaga tylko pierwiastka 99, którym jest Einsteinium (Es), więc niepotwierdzone elementy (które dlatego nie mają ostatecznych nazw i są napisane trzema znakami) w ogóle nie uwzględniają.
Glen O
Ładny. Myślę, że nie potrzebujesz czeku, +y?...:...ponieważ zastępujesz grupy cyfr
edc65,
@ edc65 Dzięki. Jedną z zasad jest to, że dowolne 00 na wejściu muszą pozostać niezmienione, więc sprawdzenie jest konieczne.
ETHprodukcje
teraz widzę. Nadal możesz użyć [y]zamiast [+y]i zapisać 1 bajt
edc65
1

Python 3, 278 285 bajtów

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)

Przypadki testowe:

>>> 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
źródło
f('P90X 42,800 3.14159')zwraca „PThX Mo, Hgs Li.SiPF” zamiast „PThX Mo, Hg0 Li.SiPF” i f('1 01 10 0 00')zwraca „HH Ne s s” zamiast „HH Ne 0 00” . Nawiasem mówiąc, właśnie zastosowałem twoje rozszerzone podejście do krojenia w moim rozwiązaniu Python 2. Dzięki!
cr3
@ cr3: Naprawiono 0 i 00.
kennytm
Fajnie, pobiłeś mnie o 19 bajtów!
cr3
0

Python 2, 312 304 bajty

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

Ten tworzy funkcję f która przyjmuje ciąg liczb jako argument i zwraca odpowiedni ciąg z zastąpionymi symbolami elementów.

Funkcja iteruje ciągi od jednej do dwóch cyfr ( „1” , „01” , „10” , „00”, ale nie „0” ) lub jednego znaku ( „a” , „0”, ale nie „1” ). W przypadku cyfr ciąg jest konwertowany na liczbę całkowitą i przeglądany w połączonym ciągu symboli elementów, w którym każdy symbol jest dopełniany do dwóch znaków. W przypadku znaków ciąg jest po prostu używany bez wyszukiwania.

Testy dla każdego przykładu w pytaniu wszystkie przebiegają pomyślnie:

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
źródło