Desafío
Dada la masa molecular de alta resolución de una molécula orgánica, genera la fórmula molecular de la molécula.
Explicación
La entrada será un solo número con tres decimales de precisión, la masa molecular relativa de la molécula.
Aquí, la masa molecular se define como la suma de las masas de los átomos en el compuesto. Como solo está encontrando las fórmulas moleculares de los compuestos orgánicos, las masas atómicas que necesita saber son:
- C , carbono: 12.011
- H , hidrógeno: 1.008
- O , oxígeno: 15.999
- N , nitrógeno: 14.007
Su fórmula solo debe contener carbono, hidrógeno, oxígeno o nitrógeno.
Al escribir la fórmula, debe tomar la forma:
CaHbOcNd
Cuando los elementos deben estar en ese orden ( C -> H -> O -> N
, por lo que C2O8N4H6
debe ser C2H6O8N4
) y a
, b
, c
y d
son números del elemento precedente en la molécula (es decir, C2
significa que hay dos átomos de carbono en la molécula).
Si a
, b
, c
o d
son cero, ese elemento no debería incluirse en la fórmula (por ejemplo, C2H6O2N0
debe ser C2H6O2
). Por último, si a
, b
, c
o d
son uno, no debería incluir el número en la fórmula (por ejemplo, C1H4
debería ser CH4
).
La entrada siempre será válida (es decir, habrá una molécula con esa masa). Si la entrada es ambigua (varias moléculas tienen la misma masa), solo debe generar una de las moléculas. Cómo elige esta molécula depende de usted.
Ejemplo trabajado
Supongamos que la entrada es 180.156
, solo hay una combinación de los elementos que pueden tener esta masa molecular:
12.011*6 + 1.008*12 + 15.999*6 + 14.007*0 = 180.156
Entonces hay:
- 6 carbonos
- 12 hidrógenos
- 6 oxígenos
- 0 Nitrógenos
Por lo tanto, su salida debería ser:
C6H12O6
Más ejemplos
Input -> Output
28.054 -> C2H4
74.079 -> C3H6O2
75.067 -> C2H5O2N
18.015 -> H2O
Victorioso
El código más corto en bytes gana.
28054
)12.011
es la masa atómica relativa de carbono, que es un promedio ponderado de las masas isotópicas relativas de los isótopos. En un espectrómetro de masas, donde se distinguen diferentes isótopos, debería ver exactamente12
. Similar para otros átomos.672.336
tiene 24 soluciones posibles, incluida una solución de nitrógeno puro y una de hidrógeno puro.Respuestas:
Mathematica, 108 bytes
Función pura que espera la entrada como un entero (1000 veces la masa molecular relativa); imprime todas las respuestas posibles a STOUD (y devuelve una serie de
Null
s).El levantamiento pesado lo realiza el builtin
{12011,1008,15999,14007}~FrobeniusSolve~#
, que encuentra todas las combinaciones enteras no negativas de los pesos codificados que son iguales a la entrada.{Characters@"CHON",#}ᵀ
pone cada una de esas combinaciones en una forma como{{"C", 0}, {"H", 1}, {"O", 2}, {"N", 3}}
. (enᵀ
realidad es el carácter privado de 3 bytes de Mathematica U + F3C7).La regla de transformación
/.a_/;Last@a<2:>Table@@a
cambia los pares de la forma{x, 0}
a{}
y los pares del formulario{x, 1}
a{x}
(y escupe errores a medida que intenta aplicarse también a toda la expresión). LuegoPrint@@Join@@
imprime el resultado en la forma correcta, evitando la necesidad de convertir los enteros como cadenas y concatenar.fuente
ᵀ
parece ser el personaje equivocado. Debe ser
.Python 2 , 242 bytes
Pruébalo en línea!
Función recursiva, la entrada es un número entero (1000 veces la masa molecular relativa) gracias Stephen S por la idea
Mi máquina tomó 40 segs a su vez
672336
enC33H115O3N8
con este código modificado . Contiene una tabla de búsqueda de aciertos / errores para reducir la cantidad de llamadas recursivas y una optimización para contar un elemento varias veces (si la masa es lo suficientemente alta)fuente
180156
tiempo de espera cuando todos los casos de prueba son tan rápidos? (sin el aciertos de caché)18015
en su lugar?18015
esH2O
, noC6H12O6
JavaScript (ES6),
159158bytesNo exactamente rápido ...
Manifestación
Mostrar fragmento de código
Versión más rápida,
174173 bytesTodos los casos de prueba
Mostrar fragmento de código
fuente