Tantangan mendasar

16

Tantangan ini terinspirasi oleh kutipan Oliver Sacks ini:

"Pada usia 11, saya bisa mengatakan 'Saya natrium' (Elemen 11), dan sekarang di usia 79, saya adalah emas." - Oliver Sacks

Saya ingin Anda menemukan angka dalam string dan menggantinya dengan simbol elemen yang sesuai. (1 adalah H, 2 adalah Dia, 3 adalah Li, dll.) Ada beberapa aturan yang harus diikuti:

  • Digit tunggal dan ganda diganti dengan elemen terkait seperti biasa. Abaikan 0s di awal angka. Jika hanya 0s dalam suatu angka, abaikan saja. Misalnya 1 01 10 0 00menjadiH H Ne 0 00
  • Lebih dari 2 digit bersama-sama dibagi menjadi kelompok-kelompok 2. Jumlah ganjil digit harus memiliki satu digit tambahan di akhir. Misalnya 0153 5301 153akan menjadi HI IH PLiKarena aturan ini, Anda hanya perlu mengetahui elemen dari 1 hingga 99
  • Angka harus diperlakukan sama tidak peduli karakter apa yang mengelilinginya dan koma dan titik desimal bukan bagian dari angka. P90X 42,800 3.14159akan menjadiPThX Mo,Hg0 Li.SiPF

Contoh Input / Output (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.

Input akan berada dalam format terdekat dengan string yang dimiliki bahasa Anda.

Tabel periodik untuk referensi:

Ini adalah , sehingga program Anda akan dinilai dalam byte.

DanTheMan
sumber
17
John Cena adalah moderator di PPCG? ;-)
Level River St
5
Tolong beri sambutan hangat untuk moderator baru kami JOHN CENA musik dan airhorns mulai menggelegar
spaghetto
instantcena.com
DanTheMan

Jawaban:

7

Mathematica, 96 94 89 byte

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

Mma memiliki beberapa set data ...

LegionMammal978
sumber
Yah tentu saja dataset bawaan akan mengalahkan string terkompresi 139 byte. ;)
ETHproduksi
@ ETHproductions Saya hanya terkejut bahwa ini adalah jawaban terpendek selama 9 jam. Biasanya, tempat ini disediakan untuk CJam dan Pyth: D
LegionMammal978
Baiklah, mari kita lihat: untuk mengalahkan 89 byte, kita perlu super-kondensasi 184 karakter alfabet yang diperlukan — DAN membuat program untuk menerjemahkannya — di bawah 89 byte (sangat sangat tidak mungkin), ATAU menemukan bahasa lain yang memiliki build -Dalam dataset elemen yang tepat (baik CJam atau Pyth). Jadi ini kemungkinan akan menjadi pemenang.
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)

String yang dihilangkan berisi karakter yang tidak diinginkan, jadi ini adalah hexdump (semoga reversibel):

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

Teknik di sini adalah menempatkan semua singkatan elemen dalam satu string, dipisahkan oleh ketiadaan — itulah tujuan regex kedua /[A-Z][a-z]?/g; cocok dengan setiap huruf besar, secara opsional diikuti oleh huruf kecil. Regex pertama /\d\d?/g,, cocok dengan setiap set 2 (atau 1) digit di input, jadi ini menggantikan setiap set digit N dengan elemen pada indeks N dalam string yang terkompresi dan cocok.

Inilah string asli, jika orang lain ingin menggunakannya: (yang ada Adi ujungnya adalah pengisi)

AHHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsA

Selamat datang pertanyaan dan saran!

Produksi ETH
sumber
1
Bagaimana dengan Uusdan Uuo?
Conor O'Brien
3
@ CᴏɴᴏʀO'Bʀɪᴇɴ - Pertanyaannya hanya membutuhkan hingga elemen 99, yaitu Einsteinium (Es), jadi elemen yang belum dikonfirmasi (yang karenanya tidak memiliki nama akhir, dan ditulis dengan tiga karakter) tidak memperhitungkan sama sekali.
Glen O
Bagus. Saya pikir Anda tidak perlu cek +y?...:...karena Anda mengganti grup digit
edc65
@ edc65 Terima kasih. Salah satu aturan adalah bahwa setiap 00 di input harus tidak berubah, sehingga pemeriksaan diperlukan.
ETHproduksi
sekarang saya mengerti. Anda masih dapat menggunakannya [y]sebagai ganti [+y]dan menyimpan 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)

Kasus uji:

>>> 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
sumber
f('P90X 42,800 3.14159')mengembalikan 'PThX Mo, Hgs Li.SiPF' alih-alih 'PThX Mo, Hg0 Li.SiPF' dan f('1 01 10 0 00')mengembalikan 'HH Ne s' alih-alih 'HH Ne 0 00' . Ngomong-ngomong, saya hanya menggunakan pendekatan slicing yang diperluas dalam solusi Python 2 saya. Terima kasih!
cr3
@ cr3: Diperbaiki 0 dan 00.
kennytm
bagus, Anda mengalahkan saya dengan 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)])

Yang ini menciptakan fungsi f yang mengambil string angka sebagai argumen dan mengembalikan string yang sesuai dengan simbol elemen diganti.

Fungsi iterates lebih dari string satu hingga dua digit ( '1' , '01' , '10' , '00' tetapi tidak '0' ) atau satu karakter ( 'a' , '0' tetapi tidak '1' ). Dalam kasus digit, string dikonversikan menjadi bilangan bulat dan melihat ke dalam rangkaian simbol elemen yang disatukan di mana masing-masing simbol diisi dengan dua karakter. Dalam hal karakter, string hanya digunakan tanpa pencarian.

Tes untuk setiap contoh dalam pertanyaan semuanya lulus:

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
sumber