초등 도전


16

이 도전은 Oliver Sacks 인용문에서 영감을 얻었습니다.

“11 살에 나는 '나는 나트륨이다'(요소 11)라고 말할 수 있고, 지금은 79 살에 나는 금입니다.”-Oliver Sacks

문자열에서 숫자를 찾아 해당 요소의 기호로 바꿉니다. (1은 H, 2는 He, 3은 Li 등입니다.) 따라야 할 몇 가지 규칙이 있습니다.

  • 한 자리와 두 자리 숫자는 정상적으로 해당 요소로 바뀝니다. 숫자 시작 부분에서 0을 무시하십시오. 숫자에 0 만 있으면 무시하십시오. 예는 1 01 10 0 00된다H H Ne 0 00
  • 둘 이상의 숫자가 함께 2 개의 그룹으로 나뉩니다. 홀수의 숫자에는 끝에 한 자리 숫자가 추가되어야합니다. 예가 0153 5301 153될 것 HI IH PLi이 규칙, 당신은 1에서 99의 요소를 알아야합니다 때문에
  • 숫자는 어떤 문자로 둘러싸여 있든 상관없이 동일하게 취급되며 쉼표와 소수점은 숫자의 일부가 아닙니다. P90X 42,800 3.14159될 것이다PThX Mo,Hg0 Li.SiPF

입력 / 출력 예 (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.

입력 한 언어가 사용하는 문자열과 가장 가까운 형식으로 입력됩니다.

주기율표 :

이것은 이므로 프로그램의 점수가 바이트로 표시됩니다.


17
John Cena는 PPCG의 중재자입니까? ;-)
Level River St

5
우리의 새로운 운영자 JOHN CENA의 따뜻한 환영을주십시오 음악과 airhorns는 나팔이 울려 퍼지는 시작
spaghetto

instantcena.com
DanTheMan

답변:


7

매스 매 티카, 96 94 89 바이트

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

Mma에는 여러 데이터 세트가 있습니다 ...


물론 내장 데이터 세트는 139 바이트 압축 문자열을 능가합니다. ;)
ETHproductions

@ETHproductions 나는 이것이 9 시간 동안 가장 짧은 대답이라는 것에 놀랐습니다. D : 일반적으로이 장소는 CJam 및 Pyth 예약되어
LegionMammal978

89 바이트를이기려면 필요한 184 개의 알파벳 문자를 압축하고 89 바이트 미만 (아주 매우 드물게)로 디코딩하는 프로그램을 만들거나 내장 된 다른 언어를 찾아야합니다. -CJam 또는 Pyth가 아닌 적절한 요소의 데이터 세트. 따라서 이것은 아마도 승자가 될 것입니다.
ETHproductions

3

자바 스크립트 (ES6), 202 바이트

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

생략 된 문자열에는 인쇄 할 수없는 문자가 포함되어 있으므로 다음과 같이 (가상적으로 뒤집을 수있는) 16 진 덤프가 있습니다.

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-Z][a-z]?/g을위한 것입니다. 각 대문자와 일치하며 선택적으로 소문자가 뒤 따릅니다. 제 정규식은 /\d\d?/g, 숫자의 각각의 집합을 대체 입력 2 (또는 1) 숫자들의 각 세트와 일치 N 인덱스의 요소 N 비 압축, 일치하는 문자열이다.

다른 사람이 그것을 사용하고자하는 경우 여기에 원래 문자열은 다음과 같습니다합니다 ( A끝에서의이 필러 있습니다)

AHHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsA

질문과 제안을 환영합니다!


1
무엇에 대한 Uus그리고 Uuo?
Conor O'Brien

3
@ CᴏɴᴏʀO'Bʀɪᴇɴ-이 질문은 99까지의 요소, 즉 아인 슈타 늄 (Essteinium, Es) 만 필요하므로 확인되지 않은 요소 (최종 이름이없고 3 자로 작성 됨)는 전혀 고려하지 않습니다.
Glen O

좋은. +y?...:...숫자 그룹을 교체 할 때 점검 할 필요가 없습니다
edc65

@ edc65 감사합니다. 규칙 중 하나는 입력의 00을 변경하지 않아야하므로 점검이 필요하다는 것입니다.
ETHproductions

이제 알겠습니다. 여전히 1 바이트 [y]대신 사용할 수 있으며 [+y]1 바이트를 저장할 수 있습니다
edc65

1

파이썬 3, 278 285 바이트

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)

테스트 사례 :

>>> 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')복귀 'PThX MO, HGS Li.SiPF' 대신에 'PThX MO, Hg0 Li.SiPF'f('1 01 10 0 00')복귀 'HH의 네 S' 대신에 'HH 네 0 00 . 그건 그렇고, 방금 Python 2 솔루션에서 확장 슬라이싱 접근 방식을 사용했습니다. 감사!
cr3

@ cr3 : 고정 0과 00.
kennytm

좋아, 당신은 19 바이트 나 이길!
cr3

0

파이썬 2, 312304 바이트

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

이것에 의해, 함수열 f 가 인수로서 숫자 열을 취해 요소 기호를 옮겨 대응하는 캐릭터 라인을 돌려줍니다

이 함수는 1 ~ 2 자리의 문자열 ( '1' , '01' , '10' , '00' 이지만 '0' 아님) 또는 한 문자 ( 'a' , '0' 이지만 '1' 아님)의 문자열을 반복 합니다 . 자릿수의 경우 문자열은 정수로 변환되어 각 기호가 두 문자로 채워지는 연결된 요소 기호 문자열에서 조회됩니다. 문자의 경우 문자열은 조회없이 간단하게 사용됩니다.

문제의 각 예에 대한 테스트는 모두 통과합니다.

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.'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.