基本挑战


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位数字将分成2组。奇数个数字的末尾应有额外的一位数字。例如0153 5301 153HI 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 音乐和喇叭响起
义大利面

instantcena.com
DanTheMan

Answers:


7

Mathematica,96 94 89字节

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

Mma有几个数据集...


当然,内置数据集会击败139字节的压缩字符串。;)
ETHproductions 2015年

@ETHproductions我很惊讶这是9个小时的最短答案。通常,这个地方留给CJam和Pyth使用:D
LegionMammal978

好吧,让我们看一下:要突破89个字节,要么要么需要将184个必需的字母字符超级压缩(并创建一个程序来对其进行解码),以少于89个字节(非常不可能),要么找到另一种具有内置语言的语言-in适当元素的数据集(无论CJam还是Pyth)。因此,这很可能最终成为赢家。
ETHproductions 2015年

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)

省略的字符串包含不可打印的字符,因此这是一个(希望是可逆的)十六进制转储:

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
怎么样UusUuo
Conor O'Brien 2015年

3
@CᴏɴᴏʀO'Bʀɪᴇɴ-该问题只要求元素E最多为99,即Es,因此未确认的元素(因此没有最终名称,并用三个字符书写)完全没有考虑。
Glen O

真好 我认为您+y?...:...在替换数字组时不需要检查
edc65

@ edc65谢谢。规则之一是输入中的任何00都必须保持不变,因此必须进行检查。
ETHproductions 2015年

现在我明白了。仍然可以使用[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.'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.