Tâche
Écrivez un programme qui absorbe un composé composé uniquement d'éléments dont le numéro atomique est inférieur ou égal à 92 (Uranium) et produit la masse molaire du composé grams/mole
.
Règles et restrictions
- Vous ne pouvez pas utiliser une fonction qui calcule directement les masses molaires pour vous.
- Votre programme doit pouvoir s'exécuter sur une machine hors ligne.
- Vous POUVEZ utiliser un fichier de données distinct. Le contenu de ce dossier doit être fourni.
- Votre score est la longueur de votre programme en octets, plus la longueur de votre fichier de données en octets, si vous choisissez d'en utiliser un.
- C'est le code-golf , donc le score le plus bas l'emporte.
Contribution
Une chaîne contenant le composé. Cette chaîne peut être lue STDIN
, passée en argument ou définie sur une variable (veuillez préciser laquelle). Les éléments suivants sont tous des entrées valides:
CH2
(un carbone, deux hydrogènes)(CH2)8
(8 carbones, 16 hydrogènes)U
(1 Uranium)
Votre programme n'est pas tenu de fonctionner pour les parenthèses imbriquées (c.-à-d. ((CH3)2N4)4
), Ni pour tout composé contenant un élément dont le numéro atomique est supérieur à 92. Si votre programme ne fonctionne pour aucun des deux cas ci-dessus, il doit produireInvalid formula
pour ces cas - aucun comportement indéfini.
Production
Vous devez sortir, vers STDOUT
ou vers une variable, la masse molaire du composé grams/mole
. Une liste des masses atomiques d'éléments est disponible ici (Wikipedia) . Votre réponse doit être précise à la décimale pour les composés contenant moins de 100 atomes (arrondis).
Si l'entrée n'est pas valide, Invalid formula
doit être sortie.
Informations sur le calcul de la masse molaire d'un composé dans grams/mole
(Wikipedia).
Exemples
Input Output
H2O 18.015
O 15.999 (16 acceptable)
C6H2(NO2)3CH3 227.132
FOOF 69.995
C6H12Op3 Invalid formula
Np 237 (or Invalid formula)
((C)3)4 144.132 (or Invalid formula)
CodeGolf Invalid formula
U1000000
est plus difficile à déterminer à la décimale que la masse deU2
13
si la masse atomique est12.999
?Réponses:
Frapper,
978 708 675 673 650 636 632 631 598594211 octets pour le programme et 382 octets pour les données.
L'entrée est sur STDIN, la sortie est sur STDOUT. ATTENTION: crée des fichiers appelés
g
eta
, s'ils existent, ils seront écrasés!Fichier de données
Cela nécessite un fichier appelé
y
, qui est la forme compressée par zopfli de ces données (pas de nouvelle ligne de fin). zopfli est un algorithme de compression compatible gzip et peut être décompressé avec les outils gzip standard. Il a été exécuté avec 1024 itérations (c'est probablement trop). Les 8 derniers octets ont ensuite été supprimés.La base64 de
y
est (à utiliserbase64 -d
pour reproduire le fichier d'origine):La somme md5 est
d392b0f5516033f2ae0985745f299efd
.Explication
Les nombres dans le fichier sont des incréments de masse atomique relative (donc la masse atomique relative de lithium est
1.008 + 0 + 2.995 + 2.937
).Ce script fonctionne en convertissant la formule chimique en une expression arithmétique avec
+
et*
, en remplaçant chaque symbole par sa masse atomique relative, puis en alimentant l'expressionbc
. Si la formule contient des symboles invalides,bc
donnera une erreur de syntaxe et ne produira rien à STDOUT; dans ce cas, la sortie estInvalid formula
.Si STDIN est vide, la sortie l'est
0
. Les crochets imbriqués sont pris en charge.Exemple
la source
Perl - 924
Il utilise une série d'opérations de substitution d'expression régulière sur la formule entrée pour développer les éléments et les groupes souscrits, remplacer les éléments par des poids atomiques et les transformer en une séquence d'additions qu'il évalue ensuite.
la source
Mathematica 9 -
247227C'est clairement de la triche car j'utilise une fonction qui calcule directement les masses atomatiques (mais pas les masses molaires!):
Utilisation: Appelez la fonction
f
avec une chaîne contenant la formule, la sortie sera la masse.Tester:
Mathematica 10 ne génère pas de nombre brut, mais un nombre avec une unité, ce qui peut ne pas être acceptable.
la source
Javascript, 1002
L'entrée est in
q
et la sortie est ina
. Je ne savais pas quelles étaient les règles d'arrondi, alors j'ai tronqué à 3 endroits après la décimale (ou moins, si les chiffres n'étaient pas disponibles sur Wikipedia).la source
q
, bien que tout le reste semble bien. +1Javascript (E6) 1231
En tant que fonction avec l'entrée comme argument et renvoyant la sortie. Précision: 3 chiffres décimaux
Utilisez l'expression rationnelle pour transformer la formule chimique en une expression arithmétique simple, avec des sommes et des produits, en remplaçant:
(
avec+(
Ensuite, l'expression est évaluée et la valeur renvoyée. En cas d'erreurs ou si la valeur est NaN (ou zéro), la fonction retourne 'Formule invalide'
Maintenant, je vois que toutes les autres réponses utilisent la même méthode ... eh bien voici la version javascript
la source
PHP - 793 (583 + 210)
Largement distancé par la réponse du professeur , qui utilise une méthode similaire, mais bon… Les symboles et les masses sont compressés par gzip dans le fichier
a
obtenu avec le code suivant:La formule doit être stockée dans la
$f
variable:Voici la version non golfée et commentée:
la source
Scala, 1077
Je vois toutes vos solutions dans des langages typés dynamiquement avec des cop-outs comme
eval
ou une fonction de masse atomique intégrée et je vous élève une solution de langage typé:Je devrais envisager une compression pour les données, mais pour l'instant, nous n'avons que les masses atomiques de la base 94, non compressées.
la source
molarmass.scala:5: error: ';' expected but identifier found. def a(m:S)={var(r,s)=(m,0);do{val(y,z)=o(r);r=z;s+=y}while(r!=""&&r(0)!=41)s->r}