Degré d'insaturation
Ce n'est pas un casse-tête de code particulièrement difficile - mais je suis intéressé de voir vos multiples façons de le résoudre.
Le degré d'insaturation est le nombre de doubles liaisons chimiques entre les atomes et / ou le nombre d'anneaux dans un composé chimique.
Vous recevrez la formule moléculaire d'un composé chimique sous la forme XaYbZc (où a, b et c sont le nombre d'atomes de X, Y ou Z dans le composé) - la formule peut être de n'importe quelle longueur et contenir n'importe quel élément chimique dans le tableau périodique (bien que des éléments autres que C, H, N, F, Cl, Br, I puissent être ignorés car ils ne figurent pas dans la formule). Le composé contiendra au moins un atome de carbone. Vous devez calculer et afficher son degré d'insaturation.
Par exemple, le composé benzène (illustré ci-dessous) a un DoU de 4 car il a trois doubles liaisons (représentées par une double ligne entre les atomes) et un seul cycle (un certain nombre d'atomes connectés en boucle):
Tel que défini par LibreTexts :
DoU = (2C + 2 + N - X - H) / 2
Où:
C
est le nombre d'atomes de carboneN
est le nombre d'atomes d'azoteX
est le nombre d'atomes d'halogène (F
,Cl
,Br
,I
)H
est le nombre d'atomes d'hydrogène
Cas de test:
C6H6 --> 4
C9H2O1 --> 0
C9H9N1O4 --> 6
U1Pt1 --> Not a valid input, no carbon
Na2O1 --> Not a valid input, no carbon
C1H1 --> 1.5, although in practice this would be one, but is a part of a compound rather than a compound in entirety.
N1H3 would return 0 - though in practice it isn't an organic compound (in other words it contains no carbon) so the formula wouldn't apply and it isn't a valid input
Pour une explication de CH voir ici
En substance, vous devez identifier s'il y a l'un des éléments ci-dessus (C, H, N, F, Cl, Br, I) dans le composé, et si oui, combien il y en a. Ensuite, calculez le degré d'insaturation à l'aide de la formule ci-dessus.
Seuls C, H, N, F, Cl, Br et I sont des entrées valides pour la formule DoU. Aux fins de ce casse-tête, tout autre élément peut être complètement ignoré (par exemple, si le composé était C6H6Mn, le résultat serait toujours 4). S'il n'y a aucun des composés ci-dessus, la réponse serait zéro.
Vous pouvez supposer que tous les composés entrés sont chimiquement possibles, contiennent au moins un atome de carbone et sont connus pour exister. Si l'entrée n'est pas valide, le programme peut sortir 0 ou -1 ou ne produire aucun résultat.
Règles
Les règles et les failles standard d'E / S s'appliquent. L'entrée doit être une chaîne standard et vous pouvez supposer que l'entrée ne sera pas vide. Ceci est codegolf - donc le code le plus court en octets l'emporte.
Na2O
et méthylidyne:CH
etCCl4He
. Ce sont des cas d'angle qui peuvent casser quelques solutions. Soit dit en passant, ce n'est pas important pour quelqu'un d'autre que Mathematica (probablement), mais pouvons-nous supposer que les composés (peuvent) exister?C9H2O1 --> 0
. Ne devrait-il pas être 9?(2*9+2+0-0-2)/2
Réponses:
JavaScript (ES6),
117112 octetsRenvoie
0
les entrées non valides.Cas de test
Afficher l'extrait de code
Version alternative, 103 octets
Si la contribution était garantie - comme le suggère l'introduction du défi de manière trompeuse - nous pourrions simplement faire:
Démo
Afficher l'extrait de code
la source
Python 3 ,
142 151 151148 octetsRenvoie 0 en cas d'erreur.
Merci à @HyperNeutrino de réduire les octets.
Essayez-le en ligne!
la source
dict
là - bas!Pip ,
7067 octetsPrend la formule chimique comme argument de ligne de commande. Sorties
0
pour entrées invalides. Essayez-le en ligne!Explication
Utilise une série de remplacements de regex pour transformer la formule chimique en une formule mathématique, l'évale et fait quelques ajustements pour obtenir la valeur finale.
Les remplacements (version légèrement non golfée):
Nous évaluons la chaîne résultante avec
V
. Cela nous donne2C + N − X − H
. Pour obtenir la valeur correcte, nous effectuons les ajustements suivants:la source
C (gcc) , 195
197202octetsProbablement la réponse la plus longue.
Essayez-le en ligne!
Renvoie 0 en cas d'erreur.
la source