En este desafío, su tarea es tomar un anión y un catión, y generar la fórmula química del compuesto. La entrada sigue estas reglas:
- Tome en 2 cadenas (en cualquier orden) que representa el anión y catión, por ejemplo
F
,NH_4
oAl
. - Para asumir la carga de cada ion, puede tenerlo como parte de la cadena separada por un cursor (p
F^-1
. Ej. ) O tomar argumentos numéricos adicionales.- Nota: Mientras su tipo de entrada numérica esté firmado, la carga del anión se pasará como un número negativo.
- Los símbolos siempre serán reales y los cargos serán precisos.
El resultado debe seguir estas reglas:
- Uso
_
para subíndices: Fe 2 O 3 seríaFe_2O_3
. - Cation primero: NaCl, no ClNa.
- Molécula neutra: Li 2 O, no LiO o LiO - .
- Coeficientes más bajos posibles: Fe 2 O 3 , no Fe 4 O 6 .
- Sin subíndices: NaCl, no Na 1 Cl 1 .
- Sin desplazamiento: NH 4 OH, no NH 5 O.
- Paréntesis condicionales:
- No use paréntesis en un ion de un solo átomo: MgCl 2 , no Mg (Cl) 2 .
- No use paréntesis si solo hay uno de los iones por molécula: KClO 3 , no K (ClO 3 ).
- SÍ use paréntesis si hay dos o más iones poliatómicos: Be 3 (PO 4 ) 2 , no Be 3 PO 4 2 o Be 3 P 2 O 8 .
Aquí hay algunas entradas y salidas de muestra adicionales:
Input Output
Fe^+3, O^-2 Fe_2O_3
Fe^+2, O^-2 FeO
H^+1, SO_4^-2 H_2SO_4
Al^+3, SO_4^-2 Al_2(SO_4)_3
NH_4^+1, SO_4^-2 (NH_4)_2SO_4
Hg_2^+2, PO_4^-3 (Hg_2)_3(PO_4)_2
NH_4^+1, OH^-1 NH_4OH
Hg_2^+2, O_2^-2 Hg_2O_2
Como se trata de código de golf , gana la respuesta más corta en bytes.
Fe^+2, OH^-1: Fe(OH)_2
para un ion poliatómico con 1 de cada elemento (OH^-1
).NO_3^-1
. También otro caso de prueba debería ser el primero emparejado con un^-2
, por lo que sería(C(NH_2)_3)_2...
. O un caso donde el ion que se necesita más de una vez comienza con un soporte.Fe_4(Fe(CN)_6)_3
para el azul de Prusia.Respuestas:
APL (Dyalog) ,
605961 bytes+2 ya que los cargos deben entregarse firmados.
Función de infijo anónimo. Toma la lista de iones (anión, catión) como argumento izquierdo y la lista de cargas correspondientes como argumento derecho.
Pruébalo en línea!
{
…}∘|
Funcionan donde⍺
está el argumento izquierdo y⍵
es la magnitud del argumento correcto:∧/⍵
LCM de los cargos⍵÷⍨
dividir los cargos por esos←
almacenar ens
(para s ubscripts)'_',∘⍕¨
formatear (stringify) y anteponer barra inferior a cada(
…)/
Replica cada letra de cada una con el valor correspondiente de:s≠1
Ess
diferente de1
? (da 1 o 0)m←
almacenar enm
(por m ultiple)(
…),¨
Anteponer lo siguiente respectivamente a aquellos:⍺{
...}¨m
para cada uno, llame a esta función con iones ym
como argumentos:⎕D,⎕A
D igits seguida por letras mayúsculas A lphabet⍺∩
intersección de iones y que≢
cuenta el número de caracteres en ese1<
¿Es uno menos que eso? (es decir, ¿tenemos un ion multielemento?)⍵∧
y necesitamos múltiplos de ese ion?:
si es así, entonces:')(',⍺
anteponer la cuerda al ion1⌽
gire cíclicamente un paso hacia la izquierda (se coloca)
a la derecha)⋄
más⍺
devolver el ion sin modificar∊
ϵ nlist (aplanar)fuente
C,
208205175169 bytesargv[1]
: catiónargv[2]
: anión Lascargas de iones se toman en stdin.
fuente
Retina ,
8680 bytesGracias a Neil por guardar 6 bytes.
Pruébalo en línea!
La entrada está separada por salto de línea (el conjunto de pruebas usa separación por comas para mayor comodidad)
Explicación
Comenzamos anteponiendo a
(
a cada molécula. Los^
partidos se inician en línea porquem)
hacia el final del programa establece el modo multilínea para todas las etapas anteriores.Reemplazamos la
^[-+]n
parte con)_
, seguida den
copias de1
(es decir, convertimos los cargos a unarios, dejando caer los signos).Esta etapa hace tres cosas: divide ambas cargas por su MCD, las convierte de nuevo a decimales y las intercambia. El GCD se puede encontrar con bastante facilidad en expresiones regulares, haciendo coincidir el más largo
1+
que nos permite igualar ambas cargas utilizando solo la referencia inversa\1
. Para dividir por esto, hacemos uso de la función "conteo de captura" de Retina, que nos dice con qué frecuencia se ha utilizado un grupo. Entonces,$#2
es la primera carga dividida por el MCD y$#3
es la segunda carga dividida por el MCD (ambos en decimal).Eliminamos
_1
s de los extremos de ambas partes.Y eliminamos los paréntesis de las líneas que terminan en a
)
(es decir, las que tenían un_1
allí), así como las líneas que solo contienen un átomo.Finalmente, concatenamos las dos moléculas dejando caer el salto de línea.
fuente
Haskell ,
10197 bytesPruébalo en línea! Ejemplo de uso:
Fe^+3, O^-2
se toma como("Fe"#"O")3 2
.fuente
Python 3 , 131 bytes
Pruébalo en línea!
Python 2 ,
196174170155149140136 bytesPruébalo en línea!
fuente
Python 3 , 129 bytes
Pruébalo en línea!
Si necesitamos manejar cargas negativas de los aniones, 153 bytes:
Pruébalo en línea!
fuente
RPL (HP48 S / SX), 294,5 bytes
Sí, sumisión ridículamente grande, no estoy seguro de cuán competitivo será ...
3 rutinas perfectamente empaquetadas en un directorio.
M
Es el principal. Espera 2 cadenas en la pila formateadas como iones y empuja una cadena de molécula en la pila.S
divide el ion en carga como un número y la fórmula del elemento como una cadena. Por ejemplo,"PO_4^-3"
se tomaría de la pila-3
y se"PO_4"
empujaría hacia la pila.J
une el número de iones con la fórmula y decide si envolver la fórmula entre paréntesis. El bit anteriorELSE
trata con 1 ion, dejando la cadena como está. Por ejemplo, si1
y"PO_4"
están en la pila, se reemplazan por"PO_4"
.1
y"H"
da"H"
.El resto trata con múltiples iones; si es un átomo único, no está entre paréntesis, de lo contrario lo está. Para decidir si es así, verifico la longitud de la cadena y compruebo si el último carácter es
>"Z"
. Las expresiones booleanas devuelven 1 para verdadero y 0 para falso. Al restar el resultado de esta comparación de la longitud de la cadena, obtengo 1 o menos cuando es un solo átomo; de lo contrario, más: la longitud 1 es un solo átomo; la longitud 2 tendrá una letra como último carácter; para un solo átomo es minúscula, entonces>"Z"
, haciendo el resultado 1, de lo contrario 2; longitud 3 o más significa más de 1 átomo y con 0 o 1 restado de la longitud el resultado será al menos 2. Por ejemplo,3
y"PO_4"
da"(PO_4)_3"
.3
y"Al"
da"Al_3"
.M
primero divide cada ion usandoS
. Después de la primera línea, el nivel 5 de la pila (por lo que el objeto enterrado más profundo) contiene la carga del segundo ion, la fórmula del segundo ion del nivel 4, la fórmula del primer ion del nivel 3, el valor absoluto del nivel 2 de la carga del primer ion y el valor absoluto del nivel 1 de la carga del segundo ion nuevamente. Por ejemplo, si los iones dados en la pila son"Al^+3"
,"SO_4^-2"
obtenemos-2
,"SO_4"
,"Al"
,3
,2
.La segunda línea calcula mcd de los 2 cargos (dejando los cargos intactos)
La tercera línea divide cada carga por el mcd (para calcular los múltiplos) y lo une con la fórmula del ion usando
J
. Entonces tenemos dos cadenas cada una con un ion dado con carga eliminada (o un múltiplo de ella) y una carga de la segunda enterrada detrás de ellas. Por ejemplo,-2
,"Al_2"
,"(SO_4)_3"
(-2 es la carga de SO_4).La cuarta línea libera la carga y, si es positiva, intercambia las dos cadenas (para que el catión aparezca primero) antes de unirlas. Así en el ejemplo anterior, porque es negativo, se unen en el orden en que son:
"Al_2(SO_4)_3"
.fuente
JavaScript, 145 bytes
Toma argumentos
c
es catión,a
es anión,p
es carga positiva,n
es carga negativa.fuente