Nesse desafio, sua tarefa é pegar um ânion e um cátion e produzir a fórmula química do composto. A entrada segue estas regras:
- Tome em 2 cadeias (em qualquer ordem) que representam o ani e cati, por exemplo
F
,NH_4
, ouAl
. - Para assumir a carga de cada íon, você pode tê-lo como parte da cadeia de caracteres separada por um sinal de intercalação (por exemplo
F^-1
) ou receber argumentos numéricos adicionais.- Nota: Enquanto seu tipo de entrada numérica for assinado, a carga do ânion será repassada como um número negativo.
- Os símbolos sempre serão reais e cobram com precisão.
A saída deve seguir estas regras:
- Use
_
para subscritos: Fe 2 O 3 seriaFe_2O_3
. - Catião primeiro: NaCl, não ClNa.
- Molécula neutra: Li 2 O, não LiO ou LiO - .
- Coeficientes mais baixos possíveis: Fe 2 O 3 , não Fe 4 O 6 .
- Nenhum subscrito: NaCl, não Na 1 Cl 1 .
- Sem mudança: NH 4 OH, não NH 5 O.
- Parênteses condicionais:
- Não use parênteses em um íon de átomo único: MgCl 2 , não Mg (Cl) 2 .
- Não use parênteses se houver apenas um íon por molécula: KClO 3 , não K (ClO 3 ).
- NÃO use parênteses se houver dois ou mais íons poliatômicos: Seja 3 (PO 4 ) 2 , não seja 3 PO 4 2 ou Seja 3 P 2 O 8 .
Aqui estão algumas entradas e saídas de amostra adicionais:
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 esse é o código-golfe , a resposta mais curta em bytes vence.
Fe^+2, OH^-1: Fe(OH)_2
para um íon poliatômico com 1 de cada elemento (OH^-1
).NO_3^-1
. Outro caso de teste também deve ser o primeiro emparelhado com um^-2
, assim seria(C(NH_2)_3)_2...
. Ou um caso em que o íon necessário mais de uma vez começa com um suporte.Fe_4(Fe(CN)_6)_3
para o azul da Prússia.Respostas:
APL (Dyalog) ,
605961 bytes+2, pois as cobranças devem ser assinadas.
Função de infixo anônimo. Toma a lista de íons (ânion, cátion) como argumento à esquerda e lista de cargas correspondentes como argumento à direita.
Experimente online!
{
…}∘|
Funciona onde⍺
fica o argumento esquerdo e⍵
a magnitude do argumento direito:∧/⍵
LCM das cobranças⍵÷⍨
dividir as acusações por ques←
armazenar ems
(para s ubscripts)'_',∘⍕¨
formato (stringify) e acrescente a barra inferior a cada(
…)/
Replique cada letra de cada uma com o valor correspondente de:s≠1
És
diferente de1
? (dá 1 ou 0)m←
armazenar emm
(para m últiplo)(
…),¨
Acrescente o seguinte, respectivamente, aos seguintes:⍺{
…}¨m
Para cada um, chame essa função com íons em
como argumentos:⎕D,⎕A
D igits seguido por letras maiúsculas A lphabet⍺∩
interseção de íons e que≢
contabilizar o número de caracteres nesse1<
Um a menos que isso? (ou seja, temos um íon de vários elementos?)⍵∧
e precisamos de múltiplos desse íon?:
Se sim, então:')(',⍺
coloque a corda no íon1⌽
gire ciclicamente um passo para a esquerda (coloca)
à direita)⋄
outro⍺
devolver o íon não modificado∊
ε nlist (achatar)fonte
C,
208205175169 bytesargv[1]
: cationargv[2]
: anion Ascargas de íons são cobradas em stdin.
fonte
Retina ,
8680 bytesAgradecimentos a Neil por salvar 6 bytes.
Experimente online!
A entrada é separada por alimentação de linha (a suíte de testes usa separação por vírgula por conveniência).
Explicação
Começamos anexando a
(
a cada molécula. As^
correspondências no início da linha porque, nom)
final do programa, define o modo de múltiplas linhas para todas as etapas anteriores.Substituímos a
^[-+]n
peça por)_
, seguida den
cópias de1
(ou seja, convertemos as cobranças em unárias, eliminando os sinais).Essa etapa faz três coisas: divide as duas cargas pelo seu CDG, converte-as novamente em decimal e as troca. O GCD pode ser encontrado facilmente no regex, correspondendo ao mais longo
1+
que permite combinar as duas cobranças usando apenas a referência anterior\1
. Para dividir por isso, usamos o recurso "contagem de capturas" de Retina, que nos diz com que frequência um grupo foi usado. Assim$#2
é a primeira carga dividida pelo GCD e$#3
a segunda carga dividida pelo GCD (ambos em decimal).Removemos
_1
s das extremidades de ambas as partes.E eliminamos os parênteses das linhas que terminam em a
)
(ou seja, aquelas que tinham um_1
lá), bem como as linhas que contêm apenas um único átomo.Por fim, concatenamos as duas moléculas soltando o avanço de linha.
fonte
Haskell ,
10197 bytesExperimente online! Exemplo de uso:
Fe^+3, O^-2
é tomado como("Fe"#"O")3 2
.fonte
Python 3 , 131 bytes
Experimente online!
Python 2 ,
196174170155149140136 bytesExperimente online!
fonte
Python 3 , 129 bytes
Experimente online!
Se precisarmos lidar com cargas negativas dos ânions, então 153 bytes:
Experimente online!
fonte
RPL (HP48 S / SX), 294,5 bytes
Sim, envio ridiculamente grande, não tenho certeza de quão competitivo será ...
3 rotinas empacotadas ordenadamente em um diretório.
M
é o principal. Ele espera duas strings na pilha formatadas como íons e empurra uma string de molécula para a pilha.S
divide o íon em carga como um número e a fórmula do elemento como uma string. Por exemplo,"PO_4^-3"
seria retirado da pilha-3
e"PO_4"
empurrado para a pilha.J
une o número de íons à fórmula e decide se a fórmula deve ser colocada entre colchetes. O bit anteriorELSE
trata de 1 íon, deixando a corda como está. Por exemplo, se1
e"PO_4"
estiverem na pilha, eles serão substituídos por"PO_4"
.1
e"H"
dá"H"
.O resto lida com vários íons; se é um átomo único, não está entre parênteses, caso contrário, é. Para decidir se é, verifico o comprimento da sequência e verifico se o último caractere é
>"Z"
. Expressões booleanas retornam 1 para verdadeiro e 0 para falso. Subtraindo o resultado dessa comparação do comprimento da string, obtenho 1 ou menos quando é único átomo, caso contrário, mais: length 1 é um único átomo; o comprimento 2 terá uma letra como último caractere; para um único átomo, está em minúsculas,>"Z"
resultando em 1, caso contrário 2; comprimento 3 ou mais significa mais de 1 átomo e com 0 ou 1 subtraído do comprimento, o resultado será pelo menos 2. Por exemplo,3
e"PO_4"
dá"(PO_4)_3"
.3
e"Al"
dá"Al_3"
.M
primeiro divide cada íon usandoS
. Após a primeira linha, o nível 5 da pilha (portanto, o objeto mais profundo do corpo) contém carga do segundo íon, fórmula do segundo íon nível 4, fórmula do primeiro íon nível 3, valor absoluto do nível 2 da carga do primeiro íon e valor absoluto do nível 1 da carga do segundo íon novamente. Por exemplo, se dadas íons na pilha são"Al^+3"
,"SO_4^-2"
, obtemos-2
,"SO_4"
,"Al"
,3
,2
.A segunda linha calcula o MDC das 2 cobranças (deixando as cobranças intactas).
A terceira linha divide cada carga pelo MDC (para calcular os múltiplos) e a une à fórmula do íon usando
J
. Portanto, temos duas cordas, cada uma com um dado íon com carga removida (ou um múltiplo) e uma carga da segunda enterrada atrás deles. Por exemplo,-2
,"Al_2"
,"(SO_4)_3"
(-2 é a carga de SO_4).A quarta linha libera a carga e, se for positiva, troca as duas cordas (para que o cátion seja o primeiro) antes de se juntar a elas. Assim, no exemplo acima, porque é negativo, eles são unidos na ordem em que são:
"Al_2(SO_4)_3"
.fonte
JavaScript, 145 bytes
Toma argumentos
c
é cátion,a
é ânion,p
é carga positiva,n
é carga negativa.fonte