Temel zorluk


16

Bu meydan okuma bu Oliver Sacks alıntısından ilham alıyor:

“11 yaşında 'Ben sodyumum' diyebilirim (Element 11) ve şimdi 79 yaşında altınım.” - Oliver Sacks

Bir dizede sayı bulmanızı ve bunları karşılık gelen öğelerin sembolleriyle değiştirmenizi istiyorum. (1 H, 2 He, 3 Li vb.) Uyulması gereken birkaç kural vardır:

  • Tek ve çift basamaklar normal şekilde karşılık gelen elemanlarla değiştirilir. Sayıların başında 0'ları yoksay. Bir sayıda yalnızca 0'lar varsa, yok sayın. Eg 1 01 10 0 00olurH H Ne 0 00
  • 2'den fazla rakam birlikte 2 grubuna ayrılır. Tek sayıda rakamın sonunda fazladan tek bir rakam olmalıdır. Örneğin 0153 5301 153olacaktı HI IH PLiBu kuralın, yalnızca 1'den 99'a unsurları bilmek gerekir Çünkü
  • Sayılar hangi karakterleri çevrelediğine bakılmaksızın, virgül ve ondalık basamaklar sayıların bir parçası değilse de aynı şekilde ele alınacaktır. P90X 42,800 3.14159olacaktıPThX Mo,Hg0 Li.SiPF

Örnek Girişler / Çıkışlar (G / Ç):

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.

Giriş, dilinizin sahip olduğu bir dizeye en yakın biçimde olacaktır.

Referans için periyodik bir tablo:

Bu , bu nedenle programınız bayt cinsinden puanlanacak.


17
John Cena PPCG'de moderatör mü? ;-)
Level River St

5
Lütfen yeni moderatörümüz JOHN CENA müziğine
bir

instantcena.com
DanTheMan

Yanıtlar:


7

Mathematica, 96 94 89 bayt

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

Mma'nın birkaç veri kümesi var ...


Tabii ki yerleşik bir veri kümesi 139 baytlık sıkıştırılmış bir dizeyi yenecektir. ;)
ETHproductions

@ETHproductions Sadece 9 saatin en kısa cevabı olduğuna şaşırdım. Genellikle, burası CJam ve Pyth için ayrılmıştır: D
LegionMammal978

Bakalım: 89 baytı yenmek için, ya 184 gerekli alfabetik karakteri süper yoğunlaştırmak ve VE kod çözmek için bir program oluşturmak gerekiyor - 89 baytın altında (çok olası değil), ya da - uygun elemanların veri kümesinde (ne CJam ne de Pyth). Yani bu muhtemelen kazanan olacak.
ETHproductions

3

JavaScript (ES6), 202 bayt

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

Atlanan dize yazdırılamaz karakterler içeriyor, bu yüzden (umarım geri döndürülebilir) bir hexdump:

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

Buradaki teknik, tüm öğe kısaltmalarını hiçbir şeyle ayrılmış bir dizeye koymaktı - ikinci regex /[A-Z][a-z]?/gbunun içindi ; her büyük harfle eşleşir, bunu isteğe bağlı olarak küçük harf takip eder. Birinci normal ifade, /\d\d?/g, basamak Bu cümledeki her bir grubu, giriş 2 (veya 1), her basamak dizi ile eşleşen , N indeksi en elemanı ile N açılmış, eşleşen dizede.

İşte orijinal dize, eğer başka biri kullanmak istiyorsa: ( Auçlardaki dolgu maddeleri)

AHHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsA

Soru ve önerilerinizi bekliyoruz!


1
Ne hakkında Uusve Uuo?
Conor O'Brien

3
@ CᴏɴᴏʀO'Bʀɪᴇɴ - Soru, yalnızca Einsteinium (Es) olan 99'a kadar öğeyi gerektirir, bu nedenle onaylanmamış öğeler (bu nedenle kesin isimleri olmayan ve üç karakterle yazılır) hiç faktör oluşturmaz.
Glen O

Güzel. +y?...:...Rakam gruplarını değiştirirken kontrole ihtiyacınız olmadığını düşünüyorum
edc65

@ edc65 Teşekkürler. Kurallardan biri, girişteki herhangi bir 00'ın değişmemesi gerektiğidir, böylece kontrol gereklidir.
ETHproductions

şimdi anladım. Yine de 1 bayt [y]yerine kullanabilir [+y]ve kaydedebilirsiniz
edc65

1

Python 3, 278 285 bayt

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)

Test senaryoları:

>>> 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')döndürüyor 'PThX Mo, Hgs Li.SiPF' yerine 'PThX Mo, Hg0 Li.SiPF' ve f('1 01 10 0 00')döndürüyor 'HH Ne s s' yerine 'HH Ne 0 00' . Bu arada, Python 2 çözümümde genişletilmiş dilimleme yaklaşımınızı kullandım. Teşekkürler!
cr3

@ cr3: Sabit 0 ve 00.
kennytm

güzel, beni 19 byte yendin!
cr3

0

Python 2, 312 304 bayt

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

Bu, bir sayı dizesini bağımsız değişken olarak alan ve öğe sembolleri değiştirilmiş karşılık gelen dizeyi döndüren bir f işlevi yaratır .

İşlev, bir ila iki basamaklı ( '1' , '01' , '10' , '00' ancak '0' değil ) veya bir karakter ( 'a' , '0' ancak '1' değil ) dizeleri üzerinden yinelenir . Rakam durumunda, dize bir tamsayıya dönüştürülür ve her sembolün iki karakterle doldurulduğu birleştirilmiş bir dizi öğe sembolüne bakılır. Karakterler söz konusu olduğunda, dize arama yapmadan kullanılır.

Sorudaki her örnek için yapılan testlerin hepsi geçer:

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.'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.