Grau de insaturação
Este não é um quebra-cabeça de código particularmente difícil - mas estou interessado em ver suas várias maneiras de resolvê-lo.
O grau de insaturação é o número de ligações químicas duplas entre átomos e / ou o número de anéis em um composto químico.
Você receberá a fórmula molecular de um composto químico na forma XaYbZc (onde a, bec são o número de átomos de X, Y ou Z no composto) - a fórmula pode ter qualquer comprimento e conter qualquer elemento químico na tabela periódica (embora outros elementos que não sejam C, H, N, F, Cl, Br, I possam ser ignorados, pois não aparecem na fórmula). O composto conterá pelo menos um átomo de carbono. Você deve calcular e exibir seu grau de insaturação.
Por exemplo, o composto benzeno (foto abaixo) tem uma DoU de 4, pois possui três ligações duplas (mostradas por uma linha dupla entre átomos) e um único anel (um número de átomos conectados em um loop):
Conforme definido pelo LibreTexts :
DoU = (2C + 2 + N - X - H) / 2
Onde:
C
é o número de átomos de carbonoN
é o número de átomos de nitrogênioX
é o número de átomos de halogénio (F
,Cl
,Br
,I
)H
é o número de átomos de hidrogênio
Casos de teste:
C6H6 --> 4
C9H2O1 --> 0
C9H9N1O4 --> 6
U1Pt1 --> Not a valid input, no carbon
Na2O1 --> Not a valid input, no carbon
C1H1 --> 1.5, although in practice this would be one, but is a part of a compound rather than a compound in entirety.
N1H3 would return 0 - though in practice it isn't an organic compound (in other words it contains no carbon) so the formula wouldn't apply and it isn't a valid input
Para uma explicação sobre CH veja aqui
Em essência, você deve identificar se há algum dos elementos acima (C, H, N, F, Cl, Br, I) no composto e, em caso afirmativo, quantos existem. Em seguida, calcule o grau de insaturação usando a fórmula acima.
Somente C, H, N, F, Cl, Br e I são entradas válidas para a fórmula DoU. Para os propósitos deste quebra-cabeça, quaisquer outros elementos podem ser completamente ignorados (por exemplo, se o composto fosse C6H6Mn, o resultado ainda seria 4). Se não houver nenhum dos compostos acima, a resposta seria zero.
Você pode assumir que todas as entradas de compostos são quimicamente possíveis, contêm pelo menos um átomo de carbono e são conhecidas por existir. Se a entrada for inválida, o programa pode gerar 0 ou -1 ou não produzir nenhum resultado.
Regras
Aplicam -se regras e brechas de IO padrão . A entrada deve ser uma sequência padrão e você pode assumir que a entrada não estará vazia. Este é o codegolf - então o código mais curto em bytes vence.
Na2O
e Metilidino:CH
eCCl4He
. Esses são alguns casos extremos que podem quebrar algumas soluções. A propósito, não que isso importe para alguém que não seja o Mathematica (provavelmente), mas podemos supor que os compostos (possam) existir?C9H2O1 --> 0
. Não deveria ser 9?(2*9+2+0-0-2)/2
Respostas:
JavaScript (ES6),
117112 bytesRetorna
0
para entradas inválidas.Casos de teste
Mostrar snippet de código
Versão alternativa, 103 bytes
Se a entrada fosse garantida como válida - como a introdução do desafio sugere de maneira enganosa -, poderíamos simplesmente:
Demo
Mostrar snippet de código
fonte
Python 3 ,
142 151148 bytesRetorna 0 em erro.
Graças a @HyperNeutrino reduzindo os bytes.
Experimente online!
fonte
dict
lá!Pip ,
7067 bytesAdota a fórmula química como argumento da linha de comando. Saídas
0
para entradas inválidas. Experimente online!Explicação
Usa uma série de substituições regex para transformar a fórmula química em uma fórmula matemática, avalia-a e faz alguns ajustes para obter o valor final.
As substituições (versão ligeiramente não destruída):
Avaliamos a string resultante com
V
. Isso nos dá2C + N − X − H
. Para obter o valor correto, fazemos os seguintes ajustes:fonte
C (gcc) , 195
197202bytesProvavelmente a resposta mais longa.
Experimente online!
Retorna 0 em erro.
fonte