Codegolf - Элементарная Задача

  • Автор темы Galanto
  • Обновлено
  • 23, Oct 2024
  • #1

Эта задача вдохновлена ​​цитатой Оливера Сакса:

«В 11 лет я мог сказать: «Я — натрий» (Элемент 11), а сейчас, в 79, я

  • золото." ― Оливер Сакс
     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.
     
    becomes PThX Mo,Hg0 Li.SiPF
  • Я хочу, чтобы вы нашли числа в строке и заменили их символами соответствующих элементов. (1 — H, 2 — He, 3 — Li и т. д.) Следует соблюдать несколько правил: P90X 42,800 3.14159 would become HI IH PLi Однозначные и двузначные цифры заменяются соответствующими им числами.
  • элементы как обычно. Игнорируйте 0 в начале чисел. Если в числе есть только 0, игнорируйте его. Например. 0153 5301 153 would become H H Ne 0 00

Более двух цифр вместе делятся на группы по 2. Нечетное число.

1 01 10 0 00

количество цифр должно иметь дополнительную одну цифру в конце. Например.

По этому правилу вам нужно будет знать только элементы от 1 до 99. codegolf - элементарная задача

Числа должны обрабатываться одинаково независимо от того, какие символы окружают их.

они, запятые и десятичные точки не являются частями чисел.

Galanto


Рег
24 Mar, 2020

Тем
77

Постов
191

Баллов
586
  • 26, Oct 2024
  • #2

Математика, 96 94 89 байт

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

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

 

Вадим Зигангиров


Рег
28 Oct, 2020

Тем
76

Постов
222

Баллов
622
  • 26, Oct 2024
  • #3

JavaScript (ES6), 202 байта

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('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'

Техника здесь заключалась в том, чтобы поместить все сокращения элементов в одну строку, ничем не разделяя их — именно это и делает второе регулярное выражение. 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) is for; it matches each capital letter, optionally followed by a lowercase letter. The first regex, AHHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsA , соответствует каждому набору из 2 (или 1) цифр во входных данных, поэтому заменяется каждый набор цифр Н с элементом по индексу Н в распакованной совпадающей строке.

Вот исходная строка, если кто-то еще захочет ее использовать: (теперь A 's at the ends are fillers)

/\d\d?/g

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

 

VopPetlebep100


Рег
25 Oct, 2024

Тем
55

Постов
183

Баллов
478
  • 26, Oct 2024
  • #4

Питон 3, 278 285 байт

/[A-Z][a-z]?/g

Тестовые случаи:

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

Питон 2, 312 304 байта

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

Это создает функцию ж который принимает строку чисел в качестве аргумента и возвращает соответствующую строку с замененными символами элементов.

Функция перебирает строки из одной-двух цифр ('1', '01', '10', '00' но не '0') или один символ ('а', '0' но не '1'). В случае цифр строка преобразуется в целое число и ищется в объединенной строке символов элементов, где каждый символ дополняется двумя символами. В случае символов строка просто используется без поиска.

Все тесты для каждого примера в вопросе пройдены:

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

Killogramm


Рег
10 Mar, 2011

Тем
67

Постов
203

Баллов
558
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно