Một thử thách cơ bản


16

Thử thách này được lấy cảm hứng từ trích dẫn Oliver Sacks này:

Lúc 11 tuổi, tôi có thể nói 'Tôi là natri' (Yếu tố 11), và bây giờ là 79, tôi là vàng.

Tôi muốn bạn tìm số trong một chuỗi và thay thế chúng bằng các ký hiệu tương ứng của chúng. (1 là H, 2 là He, 3 là Li, v.v.) Có một vài quy tắc cần tuân theo:

  • Các chữ số đơn và đôi được thay thế bằng các phần tử tương ứng như bình thường. Bỏ qua 0s khi bắt đầu số. Nếu chỉ có 0 trong một số, hãy bỏ qua nó. Ví dụ 1 01 10 0 00trở thànhH H Ne 0 00
  • Nhiều hơn 2 chữ số được chia thành các nhóm 2. Một số chữ số lẻ nên có thêm một chữ số ở cuối. Ví dụ: 0153 5301 153sẽ trở thành HI IH PLiVì quy tắc này, bạn sẽ chỉ cần biết các yếu tố từ 1 đến 99
  • Các số sẽ được xử lý như nhau cho dù các ký tự bao quanh chúng và dấu phẩy và dấu thập phân không phải là một phần của số. P90X 42,800 3.14159sẽ trở thànhPThX Mo,Hg0 Li.SiPF

Ví dụ Đầu vào / Đầu ra (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.

Đầu vào sẽ ở định dạng gần nhất với chuỗi mà ngôn ngữ của bạn có.

Một bảng tuần hoàn để tham khảo:

Đây là , vì vậy chương trình của bạn sẽ được tính bằng byte.


17
John Cena là người điều hành tại PPCG? ;-)
Cấp độ sông St

5
Xin hãy chào đón nồng nhiệt đến người điều hành mới của chúng tôi Âm nhạc
một spaghetto

instantcena.com
DanTheMan

Câu trả lời:


7

Toán học, 96 94 89 byte

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

Mma có một vài bộ dữ liệu ...


Tất nhiên, một bộ dữ liệu tích hợp sẽ đánh bại chuỗi nén 139 byte. ;)
Sản phẩm điện tử

@ETHproductions Tôi chỉ ngạc nhiên rằng đây là câu trả lời ngắn nhất trong 9 giờ. Thông thường, nơi này được dành riêng cho CJam và Pyth: D
LegionMammal978

Chà, hãy xem: để đánh bại 89 byte, người ta sẽ cần phải siêu ngưng tụ 184 ký tự chữ cái cần thiết. -in bộ dữ liệu của các yếu tố thích hợp (không phải là CJam hoặc Pyth). Vì vậy, điều này có thể sẽ trở thành người chiến thắng.
Sản xuất ETH

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)

Chuỗi bị bỏ qua chứa các ký tự không thể in được, vì vậy đây là một hexdump (hy vọng có thể đảo ngược):

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

Kỹ thuật ở đây là đặt tất cả các chữ viết tắt thành phần trong một chuỗi, cách nhau bởi không có gì mà đó là regex thứ hai /[A-Z][a-z]?/gdành cho; nó phù hợp với từng chữ in hoa, tùy ý theo sau là một chữ cái viết thường. Regex đầu tiên /\d\d?/g, khớp với từng bộ 2 (hoặc 1) chữ số trong đầu vào, do đó, thay thế từng bộ chữ số N bằng phần tử tại chỉ số N trong chuỗi được giải nén, khớp.

Đây là chuỗi gốc, nếu có ai khác muốn sử dụng nó: (phần cuối Aở cuối là chất độn)

AHHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsA

Câu hỏi và gợi ý chào mừng!


1
Còn về UusUuo?
Conor O'Brien

3
@ CᴏɴᴏʀO'Bʀɪᴇɴ - Câu hỏi chỉ yêu cầu tối đa yếu tố 99, đó là Einsteinium (Es), vì vậy các yếu tố chưa được xác nhận (do đó không có tên cuối cùng và được viết bằng ba ký tự) hoàn toàn không có yếu tố nào.
Glen O

Đẹp. Tôi nghĩ rằng bạn không cần kiểm tra +y?...:...vì bạn đang thay thế các nhóm chữ số
edc65

@ edc65 Cảm ơn. Một trong những quy tắc là bất kỳ 00 nào trong đầu vào cần phải không thay đổi, do đó việc kiểm tra là cần thiết.
Sản phẩm điện tử

Bây giờ tôi thấy. Tuy nhiên, bạn vẫn có thể sử dụng [y]thay vì [+y]và lưu 1 byte
edc65

1

Con trăn 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)

Các trường hợp thử nghiệm:

>>> 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')trả về 'PThX Mo, Hss Li.SiPF' thay vì 'PThX Mo, Hg0 Li.SiPF'f('1 01 10 0 00')trả về 'HH Ne s s' thay vì 'HH Ne 0 00' . Nhân tiện, tôi chỉ sử dụng phương pháp cắt lát mở rộng của bạn trong giải pháp Python 2 của tôi. Cảm ơn!
cr3

@ cr3: Đã sửa 0 và 00.
kennytm

thật tuyệt, bạn đã đánh bại tôi 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)])

Hàm này tạo một hàm f lấy một chuỗi số làm đối số và trả về chuỗi tương ứng với các ký hiệu phần tử được thay thế.

Hàm lặp trên các chuỗi từ một đến hai chữ số ( '1' , '01' , '10' , '00' nhưng không phải '0' ) hoặc một ký tự ( 'a' , '0' chứ không phải '1' ). Trong trường hợp các chữ số, chuỗi được chuyển đổi thành một số nguyên và tra cứu trong một chuỗi các ký hiệu phần tử được ghép nối trong đó mỗi ký hiệu được đệm thành hai ký tự. Trong trường hợp các ký tự, chuỗi được sử dụng đơn giản mà không cần tra cứu.

Các bài kiểm tra cho từng ví dụ trong câu hỏi đều vượt qua:

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.'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.