Défi
Étant donné la formule d'un produit chimique, produire le M r du composé.
Équation
Chaque élément du composé est suivi d'un nombre qui indique le nombre dudit atome dans le composé. S'il n'y a pas de nombre, il n'y a qu'un seul de cet atome dans le composé.
Quelques exemples sont:
- L'éthanol (C 2 H 6 O) serait là
C2H6O
où il y a deux atomes de carbone, 6 atomes d'hydrogène et 1 atome d'oxygène - L'hydroxyde de magnésium (MgO 2 H 2 ) serait là
MgO2H2
où il y a un atome de magnésium, deux atomes d'oxygène et deux atomes d'hydrogène.
Notez que vous n'aurez jamais à gérer les crochets et que chaque élément n'est inclus qu'une seule fois dans la formule.
Alors que la plupart des gens respecteront probablement la commande avec laquelle ils se sentent le plus à l'aise, il n'y a pas de système de commande strict. Par exemple, l'eau peut être donnée sous forme de H2O
ou OH2
.
M r
Remarque: ici, supposons que la masse de la formule est la même que la masse moléculaire
Le M r d'un composé, la masse moléculaire, est la somme des poids atomiques des atomes dans la molécule.
Les seuls éléments et leurs poids atomiques à 1 décimale que vous devez supporter (l'hydrogène au calcium, à l'exclusion des gaz nobles) sont les suivants. Ils peuvent également être trouvés ici
H - 1.0 Li - 6.9 Be - 9.0
B - 10.8 C - 12.0 N - 14.0
O - 16.0 F - 19.0 Na - 23.0
Mg - 24.3 Al - 27.0 Si - 28.1
P - 31.0 S - 32.1 Cl - 35.5
K - 39.1 Ca - 40.1
Vous devez toujours attribuer la sortie à une décimale.
Par exemple, de l' éthanol ( C2H6O
) a un M r de 46.0
telle qu'elle correspond à la somme des poids atomiques des éléments qu'elle contient :
12.0 + 12.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 16.0
(2*C + 6*H + 1*O)
Contribution
Une seule chaîne dans le format ci-dessus. Vous pouvez garantir que les éléments inclus dans l'équation seront de véritables symboles élémentaires.
Le composé donné n'est pas garanti d'exister dans la réalité.
Production
Le total M r du composé, à 1 décimale près.
Règles
Les buildins qui accèdent à un élément ou à des données chimiques sont interdits (désolé Mathematica)
Exemples
Input > Output
CaCO3 > 100.1
H2SO4 > 98.1
SF6 > 146.1
C100H202O53 > 2250.0
Gagnant
Le code le plus court en octets gagne.
Ce poste a été adopté avec la permission de caird coinheringaahing . (Message maintenant supprimé)
la source
2H2O
:?NumberForm[#&@@#~ChemicalData~"MolecularMass",{9,1}]&
Réponses:
Gelée , 63 octets
Un lien monadique acceptant une liste de caractères et renvoyant un numéro.
Essayez-le en ligne!
Comment?
la source
Python 3 ,
189 182 182168 octets-14 octets en utilisant le hachage de la réponse JavaScript (ES6) de Justin Mariner .
Essayez-le en ligne!
Ci-dessous est la version de 182 octets, je vais laisser l'explication pour celle-ci - ce qui précède modifie simplement l'ordre des poids, utilise
int
pour convertir le nom de l'élément à partir de la base29
et utilise différents dividendes pour compresser la plage d'entiers - voir Justin Réponse de Mariner .Une fonction sans nom acceptant une chaîne
s
et renvoyant un nombre.Essayez-le en ligne!
Comment?
Utilise une expression régulière pour diviser l'entrée,
s
en les éléments et leursre.findall("(\D[a-z]?)(\d*)",s)
\D
nombres en utilisant: correspond exactement à un non-chiffre et[a-z]?
correspond à 0 ou 1 lettre minuscule, ensemble les éléments correspondants.\d*
correspond à 0 ou plusieurs chiffres. Les parenthèses font ces deux groupes, et en tant que telfindall("...",s)
retourne une liste de tuples de chaînes,[(element, number),...]
.Le nombre est simple à extraire, la seule chose à poignée est qu'un moyen de chaîne vide 1, ceci est réalisé avec une logique
or
puisque les chaînes Python sont Falsey:int(n or 1)
.La chaîne d'élément reçoit un numéro unique en prenant le produit des ordinaux de son premier et dernier caractère (généralement ce sont les mêmes, par exemple S ou C, mais nous devons faire la différence entre Cl, C, Ca et Na, donc nous ne pouvons pas simplement en utiliser un personnage).
Ces nombres sont ensuite hachés pour couvrir une plage beaucoup plus petite de [0,18], trouvée par une recherche de l'espace modulo résultant
%1135%98%19
. Par exemple,"Cl"
a des ordinaux67
et108
, qui se multiplient pour donner7736
, ce qui1135
est modulo426
, quel modulo98
est34
, quel modulo19
est15
; ce nombre est utilisé pour indexer dans une liste d'entiers - la 15e valeur (indexée 0) dans la liste:[16,31,40.1,32.1,0,24.3,12,39.1,28.1,19,0,9,10.8,23,27,35.5,6.9,14,1]
is
35.5
, le poids atomique de Cl, qui est ensuite multiplié par le nombre de ces éléments (comme indiqué ci-dessus).Ces produits sont ensuite additionnés à l'aide de
sum(...)
.la source
PHP , 235 octets
Essayez-le en ligne!
Au lieu de
array_combine([H,Li,Be,B,C,N,O,F,Na,Mg,Al,Si,P,S,Cl,K,Ca],[1,6.9,9,10.8,12,14,16,19,23,24.3,27,28.1,31,32.1,35.5,39.1,40.1])
vous pouvez utiliser[H=>1,Li=>6.9,Be=>9,B=>10.8,C=>12,N=>14,O=>16,F=>19,Na=>23,Mg=>24.3,Al=>27,Si=>28.1,P=>31,S=>32.1,Cl=>35.5,K=>39.1,Ca=>40.1]
avec le même nombre d'octetsla source
JavaScript (ES6), 150 octets
Inspiré par la réponse Python de Jonathan Allan , où il a expliqué donner à chaque élément un numéro unique et hacher ces nombres pour qu'ils soient dans une plage plus petite.
Les éléments ont été transformés en nombres uniques en les interprétant comme base-29 (0-9 et AS). J'ai ensuite constaté que
%633%35%18
rétrécit les valeurs jusqu'à la plage de[0, 17]
tout en conservant l'unicité.Extrait de test
la source
Clojure,
198194 octetsMise à jour: mieux
for
quereduce
.Original:
Je me demande s'il existe un moyen plus compact d'encoder la table de recherche.
la source
Python 3 , 253 octets
Essayez-le en ligne!
la source
Mathematica,
390338329 octets9 octets enregistrés en raison du fait que je suis actuellement réveillé et que j'utilise le raccourcissement que je voulais.
Version 2.1:
Explication: recherchez la position de tous les caractères majuscules. Mettez un point devant chacun. Divisez la chaîne à chaque point. Pour cette liste de sous-chaînes, procédez comme suit: fractionnez-le en fonction des lettres et divisez-le en fonction des chiffres. Pour ceux divisés par des lettres, convertissez la chaîne en chiffres. Pour ceux divisés par des chiffres, remplacez chaque produit chimique par son poids moléculaire. Pour ceux qui ont un poids moléculaire et un nombre d'atomes, remplacez-le par le produit d'eux. Ils trouvent le total.
Version 1:
Je suis sûr que cela peut être beaucoup de golf (ou juste complètement réécrit). Je voulais juste comprendre comment le faire. (Y réfléchira le matin.)
Explication: Commencez par diviser la chaîne en caractères. Repliez ensuite le tableau en joignant les caractères et les chiffres en minuscules à leur capitale. Ensuite, ajoutez un 1 à n'importe quel produit chimique sans numéro à la fin. Effectuez ensuite deux divisions des termes dans le tableau - une division à tous les nombres et une séparation à toutes les lettres. Pour le premier remplacer les lettres par leurs masses molaires puis trouver le produit scalaire de ces deux listes.
la source
Python 3 - 408 octets
Il s'agit principalement de la solution de @ovs, car il l'a analysée de plus de 120 octets ... Voir la solution initiale ci-dessous.
Essayez-le en ligne!
Python 3 -
550 548535 octets (perdu le compte avec indentation)10 octets enregistrés grâce à @cairdcoinheringaahing et 3 enregistrés grâce à ovs
J'avais un objectif personnel de ne pas utiliser d'expressions régulières, et de le faire de manière amusante et à l'ancienne ... Cela s'est avéré être 350 octets plus long que la solution d'expressions régulières, mais il n'utilise que la bibliothèque standard de Python ...
Essayez-le en ligne!
Si quelqu'un est prêt à jouer au golf (avec des corrections d'indentation et d'autres astuces ...), il sera 100% bien reçu, se sentant comme s'il y avait une meilleure façon de le faire ...
la source
for y in g: if str(y[0])==h[i][:h[i].index('-')]:x+=y[1]
parfor y in g:x+=y[1]*(str(y[0])==h[i][:h[i].index('-')])
if/for/while
sur la ligne suivante. Comme c'est le cas sur chaque ligne en retrait, vous ne pouvez pas enregistrer d'octets par cela.