Un défi élémentaire

16

Ce défi est inspiré de cette citation d'Oliver Sacks:

«À 11 ans, je pourrais dire« Je suis du sodium »(Élément 11), et maintenant à 79 ans, je suis or.» - Oliver Sacks

Je veux que vous trouviez des nombres dans une chaîne et les remplaciez par les symboles de leurs éléments correspondants. (1 est H, 2 est He, 3 est Li, etc.) Il y a quelques règles à suivre:

  • Les chiffres simples et doubles sont remplacés par leurs éléments correspondants comme d'habitude. Ignorez les 0 au début des nombres. S'il n'y a que des 0 dans un nombre, ignorez-le. Par exemple1 01 10 0 00 devientH H Ne 0 00
  • Plus de 2 chiffres ensemble sont divisés en groupes de 2. Un nombre impair de chiffres doit avoir le seul chiffre supplémentaire à la fin. Par exemple 0153 5301 153, deviendrait HI IH PLiEn raison de cette règle, vous aurez seulement besoin de connaître les éléments de 1 à 99
  • Les nombres doivent être traités de la même manière quels que soient les caractères qui les entourent et les virgules et les décimales ne font pas partie des nombres. P90X 42,800 3.14159deviendraitPThX Mo,Hg0 Li.SiPF

Exemples d'entrées / sorties (E / S):

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.

L'entrée sera dans le format le plus proche d'une chaîne de votre langue.

Un tableau périodique pour référence:

Il s'agit de , donc votre programme sera noté en octets.

DanTheMan
la source
17
John Cena est modérateur chez PPCG? ;-)
Level River St
5
Veuillez souhaiter la bienvenue à notre nouveau modérateur, la musique
un spaghetto du
instantcena.com
DanTheMan

Réponses:

7

Mathematica, 96 94 89 octets

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

Mma a plusieurs jeux de données ...

LegionMammal978
la source
Bien sûr, un jeu de données intégré battra une chaîne compressée de 139 octets. ;)
ETHproductions
@ETHproductions Je suis juste surpris que ce soit la réponse la plus courte depuis 9 heures. Habituellement, cet endroit est réservé à CJam et Pyth: D
LegionMammal978
Eh bien, voyons: pour battre 89 octets, il faudrait soit super-condenser les 184 caractères alphabétiques nécessaires — ET créer un programme pour le décoder — en moins de 89 octets (très très peu probable), OU trouver une autre langue qui a une -dans l'ensemble de données des éléments appropriés (ni CJam ni Pyth). Ce sera donc probablement le gagnant.
ETHproductions
3

JavaScript (ES6), 202 octets

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

La chaîne omise contient des caractères non imprimables, voici donc un hexdump (espérons-le réversible):

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

La technique ici était de mettre toutes les abréviations d'élément dans une chaîne, séparées par rien - c'est à cela que /[A-Z][a-z]?/gsert le deuxième regex ; il correspond à chaque lettre majuscule, éventuellement suivie d'une lettre minuscule. Le premier regex,, /\d\d?/gcorrespond à chaque ensemble de 2 (ou 1) chiffres dans l'entrée, donc cela remplace chaque ensemble de chiffres N par l'élément à l'index N dans la chaîne correspondante décompressée.

Voici la chaîne d'origine, si quelqu'un d'autre souhaite l'utiliser: (les Aà la fin sont des remplisseurs)

AHHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsA

Questions et suggestions bienvenues!

ETHproductions
la source
1
Et pour Uuset Uuo?
Conor O'Brien
3
@ CᴏɴᴏʀO'Bʀɪᴇɴ - La question ne nécessite que jusqu'à l'élément 99, qui est Einsteinium (Es), donc les éléments non confirmés (qui n'ont donc pas de noms définitifs et sont écrits avec trois caractères) ne sont pas pris en compte du tout.
Glen O
Agréable. Je pense que vous n'avez pas besoin du chèque +y?...:...car vous remplacez les groupes de chiffres
edc65
@ edc65 Merci. L'une des règles est que tout 00 dans l'entrée doit être inchangé, de sorte qu'une vérification est nécessaire.
ETHproductions du
Maintenant, je vois. Vous pouvez toujours utiliser [y]au lieu de [+y]et enregistrer 1 octet
edc65
1

Python 3, 278 285 octets

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)

Cas de test:

>>> 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'
kennytm
la source
f('P90X 42,800 3.14159')renvoie «PThX Mo, Hgs Li.SiPF» au lieu de «PThX Mo, Hg0 Li.SiPF» et f('1 01 10 0 00')renvoie «HH Ne s s» au lieu de «HH Ne 0 00» . Soit dit en passant, je viens d'utiliser votre approche de découpage étendu dans ma solution Python 2. Merci!
cr3
@ cr3: Correction de 0 et 00.
kennytm
bien, tu m'as battu de 19 octets!
cr3
0

Python 2, 312 304 octets

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)])

Celui-ci crée une fonction f qui prend une chaîne de nombres comme argument et retourne la chaîne correspondante avec les symboles des éléments remplacés.

La fonction itère sur des chaînes de un à deux chiffres ( '1' , '01' , '10' , '00' mais pas '0' ) ou un caractère ( 'a' , '0' mais pas '1' ). Dans le cas des chiffres, la chaîne est convertie en un entier et recherchée dans une chaîne concaténée de symboles d'éléments où chaque symbole est rempli de deux caractères. Dans le cas des caractères, la chaîne est simplement utilisée sans recherche.

Les tests pour chaque exemple de la question réussissent tous:

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.'
cr3
la source