(Eu não sou químico! Posso estar errado em algumas coisas, estou escrevendo o que aprendi no ensino médio)
Os átomos de carbono têm um atributo especial: eles podem se ligar a outros 4 átomos (o que não é tão especial) e permanecem estáveis mesmo em cadeias longas, o que é muito único. Como eles podem ser encadeados e combinados de várias maneiras diferentes, precisamos de algum tipo de convenção de nomes para nomeá-los.
Esta é a menor molécula que podemos fazer:
CH4
Chama-se metano. Consiste em apenas um carbono e 4 átomos de hidrogênio. O próximo é:
CH3 - CH3
Isso é chamado etano. É composto de 2 átomos de carbono e 6 de hidrogênio.
Os próximos 2 são:
CH3 - CH2 - CH3
CH3 - CH2 - CH2 - CH3
Eles são propano e butano. Os problemas começam com as cadeias com 4 átomos de carbono, pois podem ser construídas de duas maneiras diferentes. Um é mostrado acima e o outro é:
CH3 - CH - CH3
|
CH3
Obviamente, isso não é o mesmo que o outro. O número de átomos e as ligações são diferentes. É claro que apenas dobrar as ligações e girar a molécula não a tornará diferente! Então, é isso:
CH3 - CH2 - CH2 - CH3
E isto:
CH3 - CH2
|
CH3 - CH2
São os mesmos (se você gosta da teoria dos grafos, pode dizer que, se houver isomorfismo entre duas moléculas; elas são iguais). De agora em diante, não escreverei átomos de hidrogênio, pois eles não são essenciais para esse desafio.
Como você odeia química orgânica e tem muitos átomos de carbono diferentes para citar, você decide escrever um programa que faz isso por você. Você não tem muito espaço no disco rígido, portanto o programa deve ser o menor possível.
O desafio
Escreva um programa que receba um texto de várias linhas como entrada (uma cadeia de carbono) e emita o nome da cadeia de carbono. A entrada conterá apenas espaços, caracteres 'c' maiúsculos e '|' e '-' que representa uma ligação. A cadeia de entrada nunca conterá ciclos! Exemplo:
Entrada:
C-C-C-C-C-C
| |
C C-C
Saída:
4-etil-2-metil-hexano
Qualquer saída é aceitável desde que seja legível por humanos e essencialmente a mesma (portanto, você pode usar separadores diferentes, por exemplo, se desejar).
A convenção de nomenclatura:
(Veja: regras da IUPAC )
Identifique a cadeia de carbono mais longa. Essa cadeia é chamada de cadeia pai.
Identifique todos os substituintes (grupos anexados à cadeia parental).
Numere os carbonos da cadeia parental a partir do final que fornece aos substituintes os números mais baixos. Ao comparar uma série de números, a série que é a "mais baixa" é aquela que contém o número mais baixo na ocasião da primeira diferença. Se duas ou mais cadeias laterais estiverem em posições equivalentes, atribua o número mais baixo àquele que virá primeiro no nome.
Se o mesmo substituinte ocorrer mais de uma vez, é dada a localização de cada ponto em que o substituinte ocorre. Além disso, o número de vezes que o grupo substituinte ocorre é indicado por um prefixo (di, tri, tetra, etc.).
Se houver dois ou mais substituintes diferentes, eles serão listados em ordem alfabética usando o nome da base (ignore os prefixos). O único prefixo que é usado ao colocar os substituintes em ordem alfabética é iso como em isopropil ou isobutil. Os prefixos sec e tert- não são usados para determinar a ordem alfabética, exceto quando comparados entre si.
Se cadeias de comprimento igual estão competindo pela seleção como a cadeia pai, a escolha vai em série para:
- a corrente que tem o maior número de cadeias laterais.
- a cadeia cujos substituintes têm os números mais baixos.
- a cadeia com o maior número de átomos de carbono na menor cadeia lateral.
- a cadeia com as cadeias laterais menos ramificadas (um gráfico com o menor número de folhas).
Para a cadeia pai, a nomeação é:
Number of carbons Name
1 methane
2 ethane
3 propane
4 butane
5 pentane
6 hexane
7 heptane
8 octane
9 nonane
10 decane
11 undecane
12 dodecane
Nenhuma corrente terá mais de 12 anos, portanto isso será suficiente. Para as sub-cadeias é o mesmo, mas em vez de 'ane' no final, temos 'yl'.
Você pode assumir que os C
s estão nas colunas ímpares e as ligações ( |
e -
caracteres) têm 1 comprimento entre os átomos de carbono.
Casos de teste:
Entrada:
C-C-C-C
Saída:
butano
Entrada:
C-C-C
|
C
Saída:
2-metilpropano
Entrada:
C-C-C-C
|
C
|
C-C
Saída:
3-metilhexano
Entrada:
C-C-C-C-C
|
C
|
C
Saída:
3-metilhexano
Entrada:
C
|
C
|
C-C-C-C
|
C-C-C
|
C-C
Saída:
3,4-dimetil-5-etil-heptano
Edit: Desculpe pelos exemplos errados. Eu não era um bom aluno :(. Eles devem ser corrigidos agora.
If the same substituent occurs more than once, the location of each point on which the substituent occurs is given. In addition, the number of times the substituent group occurs is indicated by a prefix (di, tri, tetra, etc.).
o último exemplo não deveria ser chamado de 3,4- di -metil-5-etil-heptano? (nós estamos apenas começando a química orgânica, eu poderia estar errado: P)Respostas:
Python 2 ,
187618711870185918461830182619001932191318471833163516131596 bytesExperimente online!
Bem, lá vai você. Certamente não é o golfiest, mas funciona (espero): D
Levei cerca de 10 horas, talvez? Provavelmente o meu golfe mais longo, tanto em tamanho quanto em tempo, e isso está dizendo algo, considerando que eu costumava usar o Java D:
Lógica:
EDIT : Corrigido o erro em que costumava causar erros se não houvesse cadeias laterais.
EDIT : Agradecimentos ao MD XF por observar alguns espaços extras (recuo para o loop for).
EDIT : Esqueci completamente o prefixo por ter o mesmo substituinte.
NOTA : Cada linha precisa ter a mesma largura para que isso funcione. Ou seja, são necessários espaços à direita.
Curiosidade: a maioria dos hidrocarbonetos cíclicos será determinada como "metano"
Curiosidade: se você fizer
C-C-...-C-C
13 Cs, ele daráethane
, entãothane
, 14,ropane
15, etc.-79 bytes graças a Jonathan Frech
-119 bytes graças a NieDzejkob
-17 bytes graças a ovs
fonte