El reto
Escriba un programa que pueda descomponer una fórmula química de entrada (ver más abajo) y generar sus respectivos átomos en la forma element: atom-count
.
Entrada
Entrada de muestra:
H2O
Su entrada siempre contendrá al menos un elemento, pero no más de diez. Su programa debe aceptar entradas que contengan paréntesis, que pueden estar anidadas.
Los elementos en las cadenas siempre coincidirán [A-Z][a-z]*
, lo que significa que siempre comenzarán con una letra mayúscula. Los números siempre serán de un solo dígito.
Salida
Salida de muestra (para la entrada anterior):
H: 2
O: 1
Su salida puede ser opcionalmente seguida por una nueva línea.
Descomponiendo Moléculas
Los números a la derecha de un conjunto de paréntesis se distribuyen a cada elemento dentro:
Mg(OH)2
Debería dar salida:
Mg: 1
O: 2
H: 2
El mismo principio se aplica a los átomos individuales:
O2
Debería dar salida:
O: 2
Y también encadenando:
Ba(NO2)2
Debería dar salida:
Ba: 1
N: 2
O: 4
Ejemplos
> Ba(PO3)2
Ba: 1
P: 2
O: 6
> C13H18O2
C: 13
H: 18
O: 2
> K4(ON(SO3)2)2
K: 4
O: 14
N: 2
S: 4
> (CH3)3COOC(CH3)3
C: 8
H: 18
O: 2
> (C2H5)2NH
C: 4
H: 11
N: 1
> Co3(Fe(CN)6)2
Co: 3
Fe: 2
C: 12
N: 12
Las entradas se denotan con una flecha (signo mayor que >
) ;
Marcador
Para que su puntaje aparezca en el tablero, debe estar en este formato:
# Language, Score
O si ganaste un bono:
# Language, Score (Bytes - Bonus%)
Editar: Los corchetes ya no son parte de la pregunta. Cualquier respuesta publicada antes de las 3 a.m., hora UTC del 23 de septiembre, es segura y no se verá afectada por este cambio.
[HCl] = 0.01 mol L^-1
.>
.Respuestas:
CJam,
5957 bytesPruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
Pyth,
6665 bytesPuerto de mi respuesta de Python. Solo admite entrada con corchetes regulares.
fuente
Python3,
157154 bytesSolo admite entrada con corchetes regulares.
Antes de crear la solución de golf usando lo
eval
anterior, creé esta solución de referencia, que me pareció muy elegante:fuente
JavaScript ES6, 366 bytes
JS Fiddle: https://jsfiddle.net/32tunzkr/1/
Estoy bastante seguro de que esto se puede acortar, pero necesito volver al trabajo. ;-)
fuente
return
declaración implícita . Eso debería ser suficiente por ahora.replace
mucho para poder guardar algunos bytes usandoxyz[R='replace'](...)
la primera vez yabc[R] (...)
cada vez posterior.SageMath ,
156148 bytesPruébelo en línea aquí (con suerte el enlace funcionará, podría necesitar una cuenta en línea)
Nota: Si intenta en línea, deberá reemplazarlo
input()
con la cadena (por ejemplo"(CH3)3COOC(CH3)3"
)Explicación
Sage le permite simplificar expresiones algebraicas, siempre que estén en el formato correcto (vea 'manipulación simbólica' de este enlace). Las expresiones regulares dentro de eval () básicamente sirven para obtener la cadena de entrada en el formato correcto, por ejemplo algo como:
eval()
luego simplificará esto a:,8*C + 18*H + 2*O
y luego es solo cuestión de formatear la salida con otra sustitución de expresiones regulares.fuente
Python 3, 414 bytes
Espero que el orden del resultado no cuente.
fuente
Javascript (ES6),
286284No es mucho más corto que el otro ES6, pero di lo mejor de mí. Nota: esto generará un error si le da una cadena vacía o la mayoría de las entradas no válidas. También espera que todos los grupos tengan un recuento de más de 1 (es decir, no
CO[OH]
). Si esto rompe alguna regla de desafío, avíseme.Utiliza un enfoque basado en la pila. Primero, procesa previamente la cadena para agregar
1
a cualquier elemento sin un número, es decir, seCo3(Fe(CN)6)2
convierteCo3(Fe1(C1N1)6)2
. Luego se repite en orden inverso y acumula recuentos de elementos.Violín
fuente
Perl,
177172 bytesCódigo de 171 bytes + parámetro de línea de comando de 1 byte
Ok, puede que me haya dejado llevar un poco de expresión regular en este ...
Ejemplo de uso:
fuente
Mathematica, 152 bytes
Lo anterior define una función
f
que toma una cadena como entrada. La función toma la cadena y ajusta el nombre de cada elemento entre comillas y agrega un operador de exponenciación infijo antes de cada número, luego interpreta la cadena como una expresión:Luego toma el logaritmo de eso y lo expande (a Mathica no le importa, qué tomar el logaritmo de :)):
y luego encuentra todas las apariciones de multiplicación de a
Log
por un número y lo analiza en forma de{log-argument, number}
y genera los de una tabla. Algunos ejemplos:fuente
Java, 827 bytes
Repositorio de Git con fuente no oculta (paridad no perfecta, no compatible admite números de varios caracteres).
Ha pasado un tiempo, pensé que le daría alguna representación a Java. Definitivamente no voy a ganar ningún premio :).
fuente
ES6, 198 bytes
Donde
\n
es un carácter literal de nueva línea.Sin golf:
fuente
Pip ,
8577 + 1 = 78 bytesRespuesta no competitiva porque usa características de lenguaje que son más nuevas que el desafío. Toma la fórmula como un argumento de línea de comandos y usa el
-n
indicador para un formato de salida adecuado.Pruébalo en línea!
El truco principal es transformar la fórmula mediante reemplazos de expresiones regulares en una expresión Pip. Esto, cuando evaluado, hará la repetición y resolverá los paréntesis por nosotros. Luego procesamos un poco para obtener los recuentos de átomos y formatear todo correctamente.
Sin golf, con comentarios:
Así es como
Co3(Fe(CN)6)2
se transforma la entrada :Entonces:
fuente