Bernd es un estudiante de secundaria que tiene algunos problemas en química. En clase tiene que diseñar ecuaciones químicas para algunos experimentos que están haciendo, como la combustión de heptano:
C 7 H 16 + 11O 2 → 7CO 2 + 8H 2 O
Como las matemáticas no son exactamente la asignatura más sólida de Bernd, a menudo le resulta difícil encontrar las proporciones exactas entre los pro- y eductos de la reacción. Como eres el tutor de Bernd, ¡es tu trabajo ayudarlo! Escriba un programa que calcule la cantidad de cada sustancia necesaria para obtener una ecuación química válida.
Entrada
La entrada es una ecuación química sin cantidades. Para hacer esto posible en ASCII puro, escribimos cualquier suscripción como números ordinarios. Los nombres de los elementos siempre comienzan con una letra mayúscula y pueden ir seguidos de una minúscula. Las moléculas se separan con +
signos, ->
se inserta una flecha ASCII-art entre ambos lados de la ecuación:
Al+Fe2O4->Fe+Al2O3
La entrada se termina con una nueva línea y no contendrá espacios. Si la entrada no es válida, su programa puede hacer lo que quiera.
Puede suponer que la entrada nunca tiene más de 1024 caracteres. Su programa puede leer la entrada desde la entrada estándar, desde el primer argumento o de una manera definida por la implementación en tiempo de ejecución si ninguno es posible.
Salida
La salida de su programa es la ecuación de entrada aumentada con números adicionales. El número de átomos para cada elemento debe ser el mismo en ambos lados de la flecha. Para el ejemplo anterior, una salida válida es:
2Al+Fe2O3->2Fe+Al2O3
Si el número de una molécula es 1, suéltelo. Un número siempre debe ser un entero positivo. Su programa debe producir números tales que su suma sea mínima Por ejemplo, lo siguiente es ilegal:
40Al+20Fe2O3->40Fe+20Al2O3
Si no hay solución, imprima
Nope!
en lugar. Una entrada de muestra que no tiene solución es
Pb->Au
Reglas
- Este es el código de golf. El código más corto gana.
- Su programa debe finalizar en un tiempo razonable para todas las entradas razonables.
Casos de prueba
Cada caso de prueba tiene dos líneas: una entrada y una salida correcta.
C7H16+O2->CO2+H2O
C7H16+11O2->7CO2+8H2O
Al+Fe2O3->Fe+Al2O3
2Al+Fe2O3->2Fe+Al2O3
Pb->Au
Nope!
solve(
función incorporada eeval(
interpretando la entrada :)Respuestas:
C, 442
505caracteresCorrer como:
Resultados:
fuente
Mathematica 507
Empleé el enfoque de matriz de composición química aumentada descrito en
LRThorne, un enfoque innovador para equilibrar las ecuaciones de reacción química: una técnica inversa de matriz simplificada para determinar el espacio nulo de la matriz. Chem.Educator , 2010, 15, 304-308 .
Se agregó un ligero ajuste: dividí la transposición del vector de espacio nulo por el máximo divisor común de los elementos para garantizar valores enteros en cualquier solución. Mi implementación aún no maneja casos en los que haya más de una solución para equilibrar la ecuación.
Pruebas
Análisis
Funciona configurando la siguiente tabla de composición química, que consta de especies químicas por elementos, a la que se agrega un vector de nulidad de adición (convirtiéndose en la tabla de composición química aumentada:
Las células internas se eliminan como una matriz y se invierten, produciendo.
Se extrae la columna de la derecha, obteniendo:
Cada elemento en el vector se divide por el mcd de los elementos (1/8), dando:
donde los valores negativos se colocarán en el lado izquierdo de la flecha. Los valores absolutos de estos son los números necesarios para equilibrar la ecuación original:
fuente
Python, 880 caracteres
Pruebas:
Salida:
Podría ser mucho menos de 880, pero mis ojos ya me están matando ...
fuente
Python 2, 635 bytes
conteo de bytes anteriores: 794, 776, 774, 765, 759, 747, 735, 734, 720, 683, 658, 655, 654, 653, 651, 638, 637, 636 bytes.
El segundo nivel de sangría es solo una pestaña, el tercero es una pestaña y luego un espacio.
Para ser honesto, esta es la respuesta de jadkik94, pero tantos bytes se afeitaron, tuve que hacerlo. ¡Dime si puedo eliminar los bytes!
fuente
''.join(map(chr,range(97,122)))
Dmap(chr,range(97,123))
funciona para 12 bytes guardados.JavaScript, 682 bytes
Esta es una respuesta mucho más desarrollada (¡décadas de personajes!) De Kuilin. Puede no ser competitivo porque ciertas características de JS son posteriores al desafío.
fuente
Javascript, 705 bytes
(no competitiva, algunas características son posteriores al desafío)
Todas las otras soluciones tenían elementos de fuerza bruta. Intenté un enfoque más determinista representando la ecuación química como un conjunto de ecuaciones lineales, y luego resolviendo usando el algoritmo de Gauss-Jordan para tomar la forma reducida de fila-escalón de esa matriz. Para aislar el caso trivial donde todo es cero, supongo que uno de los elementos es un número constante, y ese número está determinado por todos los números multiplicados juntos, para no tener fracciones. Luego, como paso final, dividiremos cada uno por el mcd para satisfacer la última condición.
Sin golf:
Golfed
fuente