Элементарный вызов


16

Эта проблема вдохновлена ​​этой цитатой Оливера Сакса:

«В 11 лет я мог бы сказать« я натрий »(Элемент 11), а сейчас в 79 я - золото». - Оливер Сакс

Я хочу, чтобы вы нашли числа в строке и заменили их соответствующими символами элементов. (1 - это Н, 2 - он, 3 - это Ли и т. Д.) Есть несколько правил, которым нужно следовать:

  • Одно- и двузначные цифры заменяются соответствующими элементами, как обычно. Игнорировать 0s в начале чисел. Если в числе всего 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
Джон Сина модератор в PPCG? ;-)
Level River St

5
Пожалуйста , дайте теплый прием в наш новый замедлителя JOHN CENA музыку и начинают Воздушные горны ревом
в spaghetto

instantcena.com
DanTheMan

Ответы:


7

Mathematica, 96 94 89 байт

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

Мма имеет несколько наборов данных ...


Ну, конечно, встроенный набор данных побьет 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              =¥.¤û..)..'Ä°

Техника здесь состояла в том, чтобы поместить все сокращения элементов в одну строку, разделенные ничем - для этого и используется второе регулярное выражение /[A-Z][a-z]?/g; он соответствует каждой заглавной букве, за которой может следовать строчная буква. Первое регулярное выражение, /\d\d?/gсоответствует каждому набору из 2 (или 1) цифр на входе, поэтому каждый набор цифр N заменяется элементом с индексом N в распакованной сопоставленной строке.

Вот оригинальная строка, если кто-то еще хотел бы использовать ее: ( Aна концах заполнители)

AHHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsA

Вопросы и предложения приветствуются!


1
Что о Uusи Uuo?
Конор О'Брайен,

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.'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.