Le défi
Ecrivez un programme capable de décomposer une formule chimique d'entrée (voir ci-dessous) et de générer ses atomes respectifs sous la forme element: atom-count
.
Contribution
Exemple de saisie:
H2O
Votre entrée contiendra toujours au moins un élément, mais pas plus de dix. Votre programme doit accepter les entrées contenant des parenthèses, qui peuvent être imbriquées.
Les éléments dans les chaînes seront toujours identiques [A-Z][a-z]*
, ce qui signifie qu'ils commenceront toujours par une lettre majuscule. Les numéros seront toujours des chiffres simples.
Sortie
Exemple de sortie (pour l'entrée ci-dessus):
H: 2
O: 1
Votre sortie peut éventuellement être suivie d'une nouvelle ligne.
Briser des molécules
Les nombres à droite d'un ensemble de parenthèses sont distribués à chaque élément à l'intérieur:
Mg(OH)2
Devrait-il produire:
Mg: 1
O: 2
H: 2
Le même principe s'applique aux atomes individuels:
O2
Devrait-il produire:
O: 2
Et aussi enchaîner:
Ba(NO2)2
Devrait-il produire:
Ba: 1
N: 2
O: 4
Exemples
> Ba(PO3)2
Ba: 1
P: 2
O: 6
> C13H18O2
C: 13
H: 18
O: 2
> K4(ON(SO3)2)2
K: 4
O: 14
N: 2
S: 4
> (CH3)3COOC(CH3)3
C: 8
H: 18
O: 2
> (C2H5)2NH
C: 4
H: 11
N: 1
> Co3(Fe(CN)6)2
Co: 3
Fe: 2
C: 12
N: 12
Les entrées sont indiquées par une flèche (signe plus grand que; >
).
Tableau de bord
Pour que votre score apparaisse au tableau, il devrait être dans ce format:
# Language, Score
Ou si vous avez gagné un bonus:
# Language, Score (Bytes - Bonus%)
Edit: Les crochets ne font plus partie de la question. Toutes les réponses postées avant le 23 septembre, heure de 03h00 (UTC), ne seront pas affectées par ce changement.
[HCl] = 0.01 mol L^-1
.>
.Réponses:
CJam,
5957 octetsEssayez-le en ligne dans l' interprète CJam .
Comment ça marche
la source
Pyth,
6665 octetsRéponse de Port of my Python. Ne prend en charge que les entrées utilisant des crochets réguliers.
la source
Python3,
157154 octetsNe prend en charge que les entrées utilisant des crochets réguliers.
Avant de créer la solution golfée en utilisant
eval
ci-dessus, j'ai créé cette solution de référence, que j'ai trouvée très élégante:la source
JavaScript ES6, 366 octets
JS Fiddle: https://jsfiddle.net/32tunzkr/1/
Je suis presque sûr que cela peut être raccourci, mais je dois retourner au travail. ;-)
la source
return
déclaration implicite . Cela devrait suffire pour le moment.replace
beaucoup afin de pouvoir économiser des octets en utilisantxyz[R='replace'](...)
la première fois etabc[R] (...)
chaque fois ultérieure.SageMath ,
156148 octetsEssayez-le en ligne ici (espérons que le lien fonctionnera, vous aurez peut-être besoin d'un compte en ligne)
Remarque: Si vous essayez en ligne, vous devrez remplacer
input()
par la chaîne (par exemple"(CH3)3COOC(CH3)3"
) .Explication
Sage vous permet de simplifier les expressions algébriques, à condition qu'elles soient dans le bon format (voir «Manipulation symbolique» de ce lien). Les expressions rationnelles à l'intérieur de eval () servent essentiellement à obtenir la chaîne d'entrée dans le bon format, par exemple quelque chose comme:
eval()
simplifiera ensuite ceci en:,8*C + 18*H + 2*O
et ensuite, il s’agira simplement de formater la sortie avec une autre substitution regex.la source
Python 3, 414 octets
J'espère que l'ordre du résultat ne compte pas.
la source
Javascript (ES6),
286284Pas beaucoup plus court que l’autre ES6 mais j’ai donné le meilleur de moi-même. Remarque: ceci provoquera une erreur si vous lui donnez une chaîne vide ou la plupart des entrées non valides. On s'attend également à ce que tous les groupes comptent plus de 1 (c'est-à-dire non
CO[OH]
). Si cela ne respecte pas les règles du défi, faites le moi savoir.Utilise une approche basée sur la pile. Premièrement, il pré-traite la chaîne pour l'ajouter
1
à tout élément sans numéro, c'est-à-direCo3(Fe(CN)6)2
devientCo3(Fe1(C1N1)6)2
. Ensuite, il effectue une boucle inversée et accumule le nombre d'éléments.Violon
la source
Perl,
177172 octetsCode de 171 octets + paramètre de ligne de commande d'octet 1 octet
Ok, alors je me suis peut-être un peu laissé emporter par les regex de celui-ci ...
Exemple d'utilisation:
la source
Mathematica, 152 octets
Ce qui précède définit une fonction
f
qui prend une chaîne en entrée. La fonction prend la chaîne et encapsule chaque nom d'élément entre guillemets et ajoute un opérateur d'exponentiation infixe avant chaque nombre, puis interprète la chaîne comme une expression:Ensuite, il prend le logarithme de cela et le développe (mathematica se fiche de quoi prendre le logarithme de :)):
et puis il trouve toutes les occurrences de multiplication de a
Log
par un nombre et les analyse sous la forme de{log-argument, number}
et les affiche sous forme de tableau. Quelques exemples:la source
Java, 827 octets
Dépôt Git avec source non- golfée (pas de parité parfaite, ungolfed supporte les nombres multi-caractères).
Ça fait longtemps que je donnerais une représentation à Java. Ne va certainement pas gagner de prix :).
la source
ES6, 198 octets
Où
\n
est un caractère de nouvelle ligne littéral.Ungolfed:
la source
Pip ,
8577 + 1 = 78 octetsRéponse non concurrente car elle utilise des fonctionnalités linguistiques plus récentes que le défi. Prend la formule en tant qu'argument de ligne de commande et utilise l'
-n
indicateur pour un formatage de sortie correct.Essayez-le en ligne!
L'astuce principale consiste à transformer la formule via les substitutions de regex en une expression Pip. Ceci, une fois évalué, fera la répétition et résoudra les parenthèses pour nous. Nous post-traitons ensuite un peu pour obtenir le nombre d'atomes et formater tout correctement.
Ungolfed, avec des commentaires:
Voici comment l'entrée
Co3(Fe(CN)6)2
est transformée:Ensuite:
la source