Grado de insaturación
Este no es un rompecabezas de código particularmente difícil, pero estoy interesado en ver sus múltiples formas de resolverlo.
El grado de insaturación es el número de enlaces químicos dobles entre átomos y / o el número de anillos en un compuesto químico.
Se le dará la fórmula molecular de un compuesto químico en la forma XaYbZc (donde a, byc son el número de átomos de X, Y o Z en el compuesto); la fórmula podría tener cualquier longitud y contener cualquier elemento químico en la tabla periódica (aunque se pueden ignorar elementos que no sean C, H, N, F, Cl, Br, ya que no figuran en la fórmula). El compuesto contendrá al menos un átomo de carbono. Debe calcular y mostrar su grado de insaturación.
Por ejemplo, el benceno compuesto (que se muestra a continuación) tiene una DoU de 4, ya que tiene tres enlaces dobles (mostrados por una línea doble entre los átomos) y un solo anillo (varios átomos conectados en un bucle):
Según lo definido por LibreTexts :
DoU = (2C + 2 + N - X - H) / 2
Dónde:
C
es la cantidad de átomos de carbonoN
es la cantidad de átomos de nitrógenoX
es el número de átomos de halógeno (F
,Cl
,Br
,I
)H
es la cantidad de átomos de hidrógeno
Casos de prueba:
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
Para una explicación de CH ver aquí
En esencia, debe identificar si hay alguno de los elementos anteriores (C, H, N, F, Cl, Br, I) en el compuesto y, de ser así, cuántos hay. Luego, calcule el grado de insaturación utilizando la fórmula anterior.
Solo C, H, N, F, Cl, Br e I son entradas válidas para la fórmula DoU. Para los propósitos de este rompecabezas, cualquier otro elemento puede ignorarse por completo (por ejemplo, si el compuesto fuera C6H6Mn, el resultado aún sería 4). Si no hay ninguno de los compuestos anteriores, la respuesta sería cero.
Puede suponer que todos los compuestos de entrada son químicamente posibles, contienen al menos un átomo de carbono y se sabe que existen. Si la entrada no es válida, el programa puede generar 0 o -1, o no producir ningún resultado.
Reglas
Se aplican las normas estándar de E / S y lagunas . La entrada debe ser una cadena estándar y puede suponer que la entrada no estará vacía. Esto es codegolf, por lo que gana el código más corto en bytes.
Na2O
y Metilidino:CH
yCCl4He
. Estos son algunos casos de esquina que pueden romper algunas soluciones. Por cierto, no es que importe a nadie más que a Mathematica (probablemente), pero ¿podemos suponer que los compuestos (pueden) existir?C9H2O1 --> 0
. ¿No debería ser 9?(2*9+2+0-0-2)/2
Respuestas:
JavaScript (ES6),
117112 bytesDevoluciones
0
para entradas inválidas.Casos de prueba
Mostrar fragmento de código
Versión alternativa, 103 bytes.
Si se garantiza que la entrada sea válida, como sugiere la introducción del desafío, podríamos hacer lo siguiente:
Manifestación
Mostrar fragmento de código
fuente
Python 3 ,
142 151148 bytesDevuelve 0 por error.
Gracias a @HyperNeutrino por bajar los bytes.
Pruébalo en línea!
fuente
dict
allí!Pip ,
7067 bytesToma la fórmula química como un argumento de línea de comandos. Salidas
0
para entradas no válidas. Pruébalo en línea!Explicación
Utiliza una serie de reemplazos de expresiones regulares para convertir la fórmula química en una fórmula matemática, evaluarla y hacer un par de ajustes para obtener el valor final.
Los reemplazos (versión ungolfed):
Evaluamos la cadena resultante con
V
. Esto nos da2C + N − X − H
. Para obtener el valor correcto, hacemos los siguientes ajustes:fuente
C (gcc) , 195
197202bytesProbablemente la respuesta más larga.
Pruébalo en línea!
Devuelve 0 por error.
fuente