Tarea
Escriba un programa que tome un compuesto hecho únicamente de elementos con un número atómico menor o igual a 92 (Uranio), y genera la masa molar del compuesto en grams/mole
.
Reglas y restricciones
- No puede usar una función que calcule directamente las masas molares por usted.
- Su programa debe poder ejecutarse en una máquina fuera de línea.
- PUEDE usar un archivo de datos separado. Se debe proporcionar el contenido de este archivo.
- Su puntaje es la longitud de su programa en bytes, más la longitud de su archivo de datos en bytes, en caso de que elija usar uno.
- Este es el código de golf , por lo tanto, gana la puntuación más baja.
Entrada
Una cadena que contiene el compuesto. Esta cadena puede leerse STDIN
, pasarse como argumento o establecerse en una variable (especifique cuál). Las siguientes son todas las entradas válidas:
CH2
(un carbono, dos hidrógenos)(CH2)8
(8 Carbones, 16 Hidrógenos)U
(1 uranio)
No es necesario que su programa funcione para paréntesis incrustados (es decir ((CH3)2N4)4
), ni para ningún compuesto que contenga un elemento con un número atómico mayor que 92. Si su programa no funciona para ninguno de los dos casos anteriores, debe generar resultados Invalid formula
para tales casos: Sin comportamiento indefinido.
Salida
Debe generar, STDOUT
ao para una variable, la masa molar del compuesto en grams/mole
. Una lista de masas atómicas de elementos está disponible aquí (Wikipedia) . Su respuesta debe ser precisa al lugar decimal para los compuestos que contienen menos de 100 átomos (redondeados).
Si la entrada no es válida, se Invalid formula
debe generar.
Información sobre el cálculo de la masa molar de un compuesto en grams/mole
(Wikipedia).
Ejemplos
Input Output
H2O 18.015
O 15.999 (16 acceptable)
C6H2(NO2)3CH3 227.132
FOOF 69.995
C6H12Op3 Invalid formula
Np 237 (or Invalid formula)
((C)3)4 144.132 (or Invalid formula)
CodeGolf Invalid formula
U1000000
es más difícil de determinar al punto decimal que la masa deU2
13
si la masa atómica es12.999
?Respuestas:
Golpetazo,
978 708 675 673 650 636 632 631 598594211 bytes para el programa y 382 bytes para los datos.
La entrada está en STDIN, la salida está en STDOUT. ADVERTENCIA: crea archivos llamados
g
ya
, si existen, se sobrescribirán.Archivo de datos
Esto requiere un archivo llamado
y
, que es la forma comprimida con zopfli de estos datos (sin línea nueva). zopfli es un algoritmo de compresión compatible con gzip y puede descomprimirse con herramientas estándar de gzip. Se ejecutó con 1024 iteraciones (esto probablemente sea demasiado). Los últimos 8 bytes fueron eliminados.La base64 de
y
es (se usabase64 -d
para reproducir el archivo original):El md5sum es
d392b0f5516033f2ae0985745f299efd
.Explicación
Los números en el archivo son incrementos de la masa atómica relativa (por lo que la masa atómica relativa del litio es
1.008 + 0 + 2.995 + 2.937
).Este script funciona convirtiendo la fórmula química en una expresión aritmética con
+
y*
, reemplazando cada símbolo con su masa atómica relativa, luego alimentando la expresión abc
. Si la fórmula contiene símbolos inválidos,bc
dará un error de sintaxis y no enviará nada a STDOUT; en ese caso, la salida esInvalid formula
.Si STDIN está vacío, la salida es
0
. Soportes anidados son compatibles.Ejemplo
fuente
Perl - 924
Utiliza una serie de operaciones de sustitución de expresiones regulares en la fórmula ingresada para expandir los elementos y grupos suscritos, reemplazar los elementos con pesos atómicos y transformarlos en una secuencia de adiciones que luego evalúa.
fuente
Mathematica 9 -
247227Esto es claramente una trampa ya que estoy usando una función que calcula directamente las masas atomáticas (¡pero no las masas molares!):
Uso: llame a la función
f
con una cadena que contenga la fórmula, la salida será la masa.Prueba:
Mathematica 10 no genera un número sin formato, sino un número con una unidad, por lo que puede no ser aceptable.
fuente
Javascript, 1002
La entrada está adentro
q
y la salida está adentroa
. No estaba seguro de cuáles eran las reglas para el redondeo, por lo que trunqué a 3 lugares después del decimal (o menos, si los dígitos no estaban disponibles en Wikipedia).fuente
q
, aunque todo lo demás parece estar bien. +1Javascript (E6) 1231
Como una función con la entrada como argumento y devolviendo la salida. Precisión: 3 dígitos decimales
Use regexp para transformar la fórmula química en una expresión aritmética simple, con sumas y productos, reemplazando:
(
con+(
Luego se evalúa la expresión y se devuelve el valor. En caso de errores o si el valor es NaN (o cero), la función devuelve 'Fórmula no válida'
Ahora veo que todas las demás respuestas usan el mismo método ... bueno, aquí está la versión de JavaScript
fuente
PHP - 793 (583 + 210)
En gran medida superado por la respuesta del profesorfish , que está utilizando un método similar, pero bueno ... Los símbolos y las masas están comprimidos con gzip en el archivo
a
obtenido con el siguiente código:La fórmula debe almacenarse en la
$f
variable:Aquí está la versión no comentada y comentada:
fuente
Scala, 1077
Veo todas sus soluciones en lenguajes dinámicamente tipados con cop-outs como
eval
o función de masa atómica incorporada y le ofrezco una solución de lenguaje tipado estáticamente:Debería considerar un poco de compresión para los datos, pero por ahora solo tengamos las masas atómicas en la base 94, sin comprimir.
fuente
molarmass.scala:5: error: ';' expected but identifier found. def a(m:S)={var(r,s)=(m,0);do{val(y,z)=o(r);r=z;s+=y}while(r!=""&&r(0)!=41)s->r}