Desafio
Dada a massa molecular de alta resolução de uma molécula orgânica, produz a fórmula molecular da molécula.
Explicação
A entrada será um número único com três casas decimais de precisão, a massa molecular relativa da molécula.
Aqui, a massa molecular é definida como a soma das massas dos átomos no composto. Como você só encontra as fórmulas moleculares dos compostos orgânicos, as massas atômicas que você precisa conhecer são:
- C , carbono: 12.011
- H , hidrogênio: 1.008
- O , oxigênio: 15.999
- N , nitrogênio: 14.007
Sua fórmula deve sempre conter apenas carbono, hidrogênio, oxigênio ou nitrogênio.
Ao escrever a fórmula, ela deve assumir a forma:
CaHbOcNd
Onde os elementos devem estar nessa ordem ( C -> H -> O -> N
, por isso C2O8N4H6
deve ser C2H6O8N4
) e a
, b
, c
ed
são números do elemento precedente na molécula (isto é, C2
significa que há dois átomos de carbono na molécula).
Se a
, b
, c
ou d
são iguais a zero, este elemento não deve ser incluído na fórmula geral (por exemplo, C2H6O2N0
deve ser C2H6O2
). Finalmente, se a
, b
, c
ou d
é um, você não deve incluir o número na fórmula (por exemplo, C1H4
deve serCH4
).
A entrada sempre será válida (ou seja, haverá uma molécula com essa massa). Se a entrada for ambígua (várias moléculas têm a mesma massa), você deve produzir apenas uma das moléculas. Como você escolhe esta molécula é com você.
Exemplo Trabalhado
Suponha que a entrada seja 180.156
, existe apenas uma combinação dos elementos que podem ter essa massa molecular:
12.011*6 + 1.008*12 + 15.999*6 + 14.007*0 = 180.156
Então existem:
- 6 carbonos
- 12 Hidrogênios
- 6 Oxygens
- 0 nitrogênio
Portanto, sua saída deve ser:
C6H12O6
Mais exemplos
Input -> Output
28.054 -> C2H4
74.079 -> C3H6O2
75.067 -> C2H5O2N
18.015 -> H2O
Ganhando
O menor código em bytes vence.
28054
)12.011
é a massa atômica relativa do carbono, que é uma média ponderada das massas isotópicas relativas dos isótopos. Em um espectrômetro de massa, onde diferentes isótopos são distinguidos, você deve ver exatamente12
. Semelhante para outros átomos.672.336
possui 24 soluções possíveis, incluindo uma solução de nitrogênio puro e uma de hidrogênio puro.Respostas:
Mathematica, 108 bytes
Função pura, esperando a entrada como um número inteiro (1000 vezes a massa molecular relativa); imprime todas as respostas possíveis para STOUD (e retorna uma matriz de
Null
s).O trabalho pesado é feito pelo built-in
{12011,1008,15999,14007}~FrobeniusSolve~#
, que encontra todas as combinações inteiras não-negativas dos pesos codificados que são iguais à entrada.{Characters@"CHON",#}ᵀ
coloca cada combinação em uma forma como{{"C", 0}, {"H", 1}, {"O", 2}, {"N", 3}}
. (ᵀ
na verdade, é o caractere privado do Mathematica de 3 bytes U + F3C7.)A regra de transformação
/.a_/;Last@a<2:>Table@@a
altera pares do formulário{x, 0}
para{}
e pares do formulário{x, 1}
para{x}
(e cospe erros ao tentar aplicar-se a toda a expressão). Em seguida,Print@@Join@@
imprime o resultado na forma correta, evitando a necessidade de converter os números inteiros como seqüências de caracteres e concatenar.fonte
ᵀ
parece ser o personagem errado. Deveria ser
.Python 2 , 242 bytes
Experimente online!
Função recursiva, a entrada é um número inteiro (1000 vezes a massa molecular relativa), graças a Stephen S pela ideia
Minha máquina levou 40 segs para ligar
672336
paraC33H115O3N8
com este código modificado . Ele contém uma tabela de pesquisa de ocorrências / falhas para reduzir a quantidade de chamadas recursivas e uma otimização para contar um elemento várias vezes (se a massa for alta o suficiente)fonte
180156
tempo limite é excedido quando todos os casos de teste são tão rápidos? (sem o acerto do cache)18015
?18015
éH2O
, nãoC6H12O6
JavaScript (ES6),
159158 bytesNão é exatamente rápido ...
Demo
Mostrar snippet de código
Versão mais rápida,
174173 bytesTodos os casos de teste
Mostrar snippet de código
fonte