Tarefa
Escreva um programa que absorva um composto composto apenas de elementos com um número atômico menor ou igual a 92 (Urânio) e produz a massa molar do composto em grams/mole
.
Regras e Restrições
- Você não pode usar uma função que calcule diretamente massas molares para você.
- Seu programa deve ser capaz de executar em uma máquina offline.
- Você pode usar um arquivo de dados separado. O conteúdo deste arquivo deve ser fornecido.
- Sua pontuação é o comprimento do seu programa em bytes, mais o tamanho do seu arquivo de dados em bytes, se você optar por usá-lo.
- Este é o código-golfe , portanto, a pontuação mais baixa vence.
Entrada
Uma sequência contendo o composto. Essa string pode ser lida STDIN
, passada como argumento ou definida como uma variável (especifique qual). A seguir estão todas as entradas válidas:
CH2
(um carbono, dois hidrogênios)(CH2)8
(8 carbonos, 16 hidrogênios)U
(1 urânio)
Não é necessário que o seu programa funcione entre parênteses incorporados (ie ((CH3)2N4)4
) nem em qualquer composto que contenha um elemento com número atômico maior que 92. Se o seu programa não funcionar em nenhum dos dois casos acima, ele deve gerar saída Invalid formula
para esses casos - nenhum comportamento indefinido.
Resultado
Você deve produzir, para STDOUT
ou para uma variável, a massa molar do composto em grams/mole
. Uma lista de massas atômicas de elementos está disponível aqui (Wikipedia) . Sua resposta deve ser precisa com a casa decimal para compostos que contenham menos de 100 átomos (arredondado).
Se a entrada for inválida, Invalid formula
deve ser emitida.
Informações sobre o cálculo da massa molar de um composto em grams/mole
(Wikipedia).
Exemplos
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
é mais difícil determinar até o ponto decimal do que a massa deU2
13
se a massa atômica é12.999
?Respostas:
Bater,
978 708 675 673 650 636 632 631 598594211 bytes para o programa e 382 bytes para os dados.
A entrada está em STDIN, a saída está em STDOUT. AVISO: cria arquivos chamados
g
ea
, se existirem, serão substituídos!Arquivo de dados
Isso requer um arquivo chamado
y
, que é a forma compactada por zopfli desses dados (sem nova linha à direita). O zopfli é um algoritmo de compactação compatível com gzip e pode ser descompactado com as ferramentas gzip padrão. Foi executado com 1024 iterações (isso provavelmente é demais). Os últimos 8 bytes foram removidos.A base64 de
y
é (usebase64 -d
para reproduzir o arquivo original):O md5sum é
d392b0f5516033f2ae0985745f299efd
.Explicação
Os números no arquivo são incrementos da massa atômica relativa (portanto, a massa atômica relativa do lítio é
1.008 + 0 + 2.995 + 2.937
).Esse script funciona convertendo a fórmula química em uma expressão aritmética com
+
e*
, substituindo cada símbolo por sua massa atômica relativa, e depois alimentando a expressãobc
. Se a fórmula contiver símbolos inválidos,bc
ocorrerá um erro de sintaxe e não produzirá nada para STDOUT; nesse caso, a saída éInvalid formula
.Se STDIN estiver vazio, a saída será
0
. Parênteses aninhados são suportados.Exemplo
fonte
Perl - 924
Ele usa uma série de operações de substituição de regex na fórmula inserida para expandir os elementos e grupos inscritos, substituir os elementos por pesos atômicos e transformá-lo em uma sequência de adições que ele avalia.
fonte
Mathematica 9 -
247227Isso é claramente trapaça, pois estou usando uma função que calcula diretamente massas atômicas (mas não massas molares!):
Uso: Chame a função
f
com uma string contendo a fórmula, a saída será a massa.Teste:
O Mathematica 10 não gera um número bruto, mas um número com uma unidade, portanto isso pode não ser aceitável.
fonte
Javascript, 1002
A entrada está dentro
q
e a saída está dentroa
. Como eu não tinha certeza de quais eram as regras para arredondamento, truncei para três casas após o decimal (ou menos, se os dígitos não estivessem disponíveis na Wikipedia).fonte
q
, embora tudo o mais pareça bem. 1Javascript (E6) 1231
Como uma função com a entrada como argumento e retornando a saída. Precisão: 3 dígitos decimais
Use regexp para transformar a fórmula química em uma expressão aritmética simples, com somas e produtos, substituindo:
(
com+(
Em seguida, a expressão é avaliada e o valor retornado. Em caso de erros ou se o valor for NaN (ou zero), a função retornará 'Fórmula inválida'
Agora vejo que todas as outras respostas usam o mesmo método ... oh, aqui está a versão javascript
fonte
PHP - 793 (583 + 210)
Distanciado em grande parte pela resposta do professorfish , que usa um método semelhante, mas ei ... Os símbolos e as massas são compactados com gzip no arquivo
a
obtido com o seguinte código:A fórmula deve ser armazenada na
$f
variável:Aqui está a versão não-gasta e comentada:
fonte
Scala, 1077
Vejo todas as suas soluções em linguagens dinamicamente tipadas com cop-outs como
eval
ou função de massa atômica incorporada e levanto a você uma solução de linguagem tipicamente estatizada:Eu deveria considerar alguma compactação para os dados, mas por enquanto vamos apenas ter as massas atômicas na base 94, descomprimidas.
fonte
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}