ความท้าทายขั้นต้น


16

ความท้าทายนี้ได้รับแรงบันดาลใจจากคำพูดของ Oliver Sacks:

“ ตอนอายุ 11 ฉันสามารถพูดว่า 'ฉันเป็นโซเดียม' (ธาตุ 11) และตอนนี้ที่ 79 ฉันเป็นทอง” - Oliver Sacks

ฉันต้องการให้คุณหาตัวเลขในสตริงและแทนที่ด้วยสัญลักษณ์ขององค์ประกอบที่เกี่ยวข้อง (1 คือ H, 2 คือเขา, 3 คือ Li, ฯลฯ ) มีกฎให้ปฏิบัติดังนี้:

  • ตัวเลขเดี่ยวและสองหลักจะถูกแทนที่ด้วยองค์ประกอบที่เกี่ยวข้องตามปกติ เพิกเฉย 0s ที่จุดเริ่มต้นของตัวเลข หากมีตัวเลขเพียง 0 ให้เพิกเฉย เช่น1 01 10 0 00กลายเป็นH H Ne 0 00
  • มากกว่า 2 หลักด้วยกันได้รับการแบ่งออกเป็นกลุ่ม 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 หรือไม่? ;-)
เลเวลริเวอร์เซนต์

5
กรุณาให้การต้อนรับอย่างอบอุ่นกับผู้ดูแลดนตรี
สปาเก็ตตี้

instantcena.com
DanTheMan

คำตอบ:


7

Mathematica, 96 94 89 ไบต์

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

Mma มีชุดข้อมูลหลายชุด ...


แน่นอนชุดข้อมูลในตัวจะเอาชนะสตริงบีบอัด 139 ไบต์ ;)
ETHproductions

@ ETHproductions ฉันแค่แปลกใจว่านี่เป็นคำตอบที่สั้นที่สุดเป็นเวลา 9 ชั่วโมง โดยปกติสถานที่นี้สงวนไว้สำหรับ CJam และ Pyth: D
LegionMammal978

เรามาดูกันว่าการเอาชนะ 89 ไบต์ใครจะต้องย่อตัวอักษรที่จำเป็น 184 ตัว - สร้างโปรแกรมเพื่อถอดรหัส - ใน 89 ไบต์ (ไม่น่าจะเป็นไปได้มาก) หรือค้นหาภาษาอื่นที่มีการสร้าง ในชุดข้อมูลขององค์ประกอบที่เหมาะสม (ไม่ใช่ CJam หรือ Pyth) ดังนั้นนี่น่าจะเป็นผู้ชนะ
ETHproductions

3

JavaScript (ES6), 202 ไบต์

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

สตริงที่ละเว้นมีอักขระที่ไม่สามารถพิมพ์ได้ดังนั้นนี่คือ 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              =¥.¤û..)..'Ä°

เทคนิคที่นี่คือการทำให้ตัวย่อองค์ประกอบทั้งหมดในสตริงเดียวคั่นด้วยไม่มีอะไร - นั่นคือสิ่งที่ regex ที่สอง/[A-Z][a-z]?/gมีไว้สำหรับ; มันตรงกับตัวพิมพ์ใหญ่แต่ละตัวเลือกตามด้วยตัวอักษรพิมพ์เล็ก regex แรก/\d\d?/g, จับคู่แต่ละชุดของ 2 (หรือ 1) หลักในอินพุตดังนั้นสิ่งนี้จะแทนที่แต่ละชุดของตัวเลขNด้วยองค์ประกอบที่ดัชนีNในสตริงที่ตรงกับการบีบอัด

นี่คือสตริงต้นฉบับถ้าใครอยากจะใช้มัน: ( Aที่ท้ายคือฟิลเลอร์)

AHHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsA

ยินดีต้อนรับคำถามและข้อเสนอแนะ!


1
สิ่งที่เกี่ยวกับUusและUuo?
Conor O'Brien

3
@ CᴏɴᴏʀO'Bʀɪᴇɴ - คำถามต้องการเพียงแค่องค์ประกอบ 99 ซึ่งก็คือ Einsteinium (Es) ดังนั้นองค์ประกอบที่ไม่ได้รับการยืนยัน (ซึ่งไม่มีชื่อสุดท้ายและเขียนด้วยอักขระสามตัว) ไม่ได้คำนึงถึงปัจจัยทั้งหมด
เกลน O

ดี ฉันคิดว่าคุณไม่จำเป็นต้องตรวจสอบ+y?...:...ในขณะที่คุณกำลังเปลี่ยนกลุ่มหลัก
edc65

@ edc65 ขอบคุณ หนึ่งในกฎคือ 00 ใด ๆ ในอินพุตจะต้องไม่เปลี่ยนแปลงดังนั้นจึงจำเป็นต้องมีการตรวจสอบ
ETHproductions

ตอนนี้ฉันเห็น คุณยังสามารถใช้[y]แทน[+y]และบันทึก 1 ไบต์
edc65

1

Python 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 Ne s s'แทน'HH Ne 0 00' อย่างไรก็ตามฉันเพิ่งใช้วิธีการแบ่งส่วนขยายของคุณในโซลูชัน Python 2 ของฉัน ขอบคุณ!
cr3

@ cr3: แก้ไข 0 และ 00
kennytm

ดีคุณเอาชนะฉันด้วย 19 ไบต์!
cr3

0

Python 2, 312 304 ไบต์

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' , '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.