O desafio
Escreva um programa que possa quebrar uma fórmula química de entrada (veja abaixo) e produza seus respectivos átomos no formulário element: atom-count
.
Entrada
Entrada de amostra:
H2O
Sua entrada sempre conterá pelo menos um elemento, mas não mais que dez. Seu programa deve aceitar entradas que contenham parênteses, que podem estar aninhados.
Os elementos nas seqüências sempre corresponderão [A-Z][a-z]*
, o que significa que sempre começarão com uma letra maiúscula. Os números sempre terão um dígito.
Resultado
Saída de amostra (para a entrada acima):
H: 2
O: 1
Sua saída pode ser opcionalmente seguida por uma nova linha.
Quebrando Moléculas
Os números à direita de um conjunto de parênteses são distribuídos para cada elemento dentro:
Mg(OH)2
Saída deve:
Mg: 1
O: 2
H: 2
O mesmo princípio se aplica aos átomos individuais:
O2
Saída deve:
O: 2
E também encadeamento:
Ba(NO2)2
Saída deve:
Ba: 1
N: 2
O: 4
Exemplos
> 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
As entradas são indicadas por uma seta (sinal maior que; >
).
Placar
Para que sua pontuação apareça no quadro, ela deve estar neste formato:
# Language, Score
Ou se você ganhou um bônus:
# Language, Score (Bytes - Bonus%)
Editar: colchetes não fazem mais parte da pergunta. Todas as respostas postadas antes das 3:00 UTC, 23 de setembro, são seguras e não serão afetadas por esta alteração.
[HCl] = 0.01 mol L^-1
.>
.Respostas:
CJam,
5957 bytesExperimente online no intérprete CJam .
Como funciona
fonte
Pitão,
6665 bytesPorta da minha resposta Python. Só suporta entrada usando colchetes regulares.
fonte
Python3,
157154 bytesSó suporta entrada usando colchetes regulares.
Antes de criar a solução golfed usando
eval
acima, criei esta solução de referência, que achei muito elegante:fonte
JavaScript ES6, 366 bytes
JS Fiddle: https://jsfiddle.net/32tunzkr/1/
Tenho certeza de que isso pode ser reduzido, mas preciso voltar ao trabalho. ;-)
fonte
return
declaração implícita . Isso deve ser suficiente por enquanto.replace
muito para poder salvar alguns bytes usandoxyz[R='replace'](...)
a primeira vez eabc[R] (...)
cada vez subseqüente.SageMath ,
156148 bytesExperimente on-line aqui (espero que o link funcione, talvez seja necessário ter uma conta on-line)
Nota: Se tentar online, será necessário substituí-lo
input()
pela string (por exemplo"(CH3)3COOC(CH3)3"
)Explicação
O Sage permite simplificar expressões algébricas, desde que estejam no formato correto (consulte 'manipulação simbólica' deste link). As expressões regulares dentro de eval () servem basicamente para colocar a string de entrada no formato correto, por exemplo, algo como:
eval()
simplificará isso para:8*C + 18*H + 2*O
e, então, é apenas uma questão de formatar a saída com outra substituição de regex.fonte
Python 3, 414 bytes
Espero que a ordem do resultado não conte.
fonte
Javascript (ES6),
286284Não muito mais curto que o outro ES6, mas dei o meu melhor. Nota: isso resultará em erro se você fornecer uma string vazia ou a maioria das entradas inválidas. Também espera que todos os grupos tenham uma contagem superior a 1 (ou seja, não
CO[OH]
). Se isso quebrar alguma regra de desafio, me avise.Usa uma abordagem baseada em pilha. Primeiro, ele processa previamente a string para adicionar
1
a qualquer elemento sem um número, ou seja,Co3(Fe(CN)6)2
torna-seCo3(Fe1(C1N1)6)2
. Em seguida, ele percorre a ordem inversa e acumula a contagem de elementos.Violino
fonte
Perl,
177172 bytesCódigo de 171 bytes + parâmetro de linha de comando de 1 byte
Ok, então eu pode ter conseguido um pouco levado com regex em um presente ...
Exemplo de uso:
fonte
Mathematica, 152 bytes
O acima define uma função
f
que recebe uma string como entrada. A função pega a string e agrupa cada nome de elemento entre aspas e adiciona um operador de exponenciação de infix antes de cada número e interpreta a string como uma expressão:Então ele pega o logaritmo disso e o expande (o mathematica não se importa, o que levar o logaritmo de :)):
e, em seguida, encontra todas as ocorrências de multiplicação de a
Log
por um número e a analisa na forma de{log-argument, number}
e as gera em uma tabela. Alguns exemplos:fonte
Java, 827 bytes
Repositório Git com fonte não- bloqueada (paridade não perfeita, não-suportado suporta números com vários caracteres).
Já faz um tempo, achei que eu daria alguma representação a Java. Definitivamente não vou ganhar nenhum prêmio :).
fonte
ES6, 198 bytes
Onde
\n
está um caractere literal de nova linha.Ungolfed:
fonte
Pip ,
8577 + 1 = 78 bytesResposta não concorrente porque usa recursos de idioma mais recentes que o desafio. Toma a fórmula como um argumento da linha de comando e usa o
-n
sinalizador para formatar a saída corretamente.Experimente online!
O principal truque é transformar a fórmula via substituições de expressões regulares em uma expressão Pip. Isso, quando avaliado, fará a repetição e resolverá os parênteses para nós. Depois, processamos um pouco para obter as contagens de átomos e formatar tudo corretamente.
Ungolfed, com comentários:
Veja como a entrada
Co3(Fe(CN)6)2
é transformada:Então:
fonte