Елементарний виклик


16

Ця проблема викликана цитатою Олівера Сакса:

"У 11 років я міг сказати" я натрій "(Елемент 11), а зараз у 79 років - я золото". - Олівер Сакс

Я хочу, щоб ви знайшли числа в рядку і замінили їх відповідними символами елементів. (1 - це Н, 2 - це Він, 3 - Лі тощо). Дотримуватися кількох правил:

  • Одно- і двозначні цифри замінюються відповідними елементами як звичайні. Ігноруйте 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: 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

Математика, 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)

Пропущена рядок містить недруковані символи, тому ось (сподіваємось, оборотний) шістнадцятковий набір:

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, який є Einsteinium (Es), тому непідтверджені елементи (які, таким чином, не мають остаточних назв і написані трьома символами), взагалі не враховують.
Глен О

Приємно. Я думаю, чек вам не потрібен, +y?...:...оскільки ви замінюєте розрядні групи
edc65

@ edc65 Дякую Одне з правил полягає в тому, що будь-які 00 вхідних даних повинні бути незмінними, тому необхідна перевірка.
ETHproductions

тепер я бачу. Проте ви можете використовувати [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 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.