Desenho de estruturas de alcanos de Lewis

17

Acabei de ter uma aula na escola sobre alcanos e achei que provavelmente seria um grande desafio para o código de golfe! Não se preocupe, não é tão complicado quanto pode parecer!

Uma rápida reformulação

(Observação: para manter esse resumo, nem todas as informações são 100% precisas.)

Os alcanos são cadeias de carbono e hidrogênio. Todo átomo de carbono tem 4 ligações, e todo átomo de hidrogênio 1 ligação. Todos os átomos de carbono do alcano formam uma cadeia onde cada átomo C está conectado a 2 outros átomos C (esquerdo e direito na estrutura de Lewis) e 2 átomos H (para cima e para baixo), exceto nas extremidades da cadeia , onde o átomo C está conectado a apenas 1 outro C, mas 3 Hs. Aqui está um exemplo básico de pentano (um alcano com 5 átomos de C e 12 átomos de H):

  H H H H H
  | | | | |
H-C-C-C-C-C-H
  | | | | |
  H H H H H

Os alcanos também podem ter ramos. Mas não se preocupe, todos os alcanos nesse desafio podem ser expressos com apenas 1 nível de ramificação. Exemplo:

        H
        |
      H-C-H
  H H H | H
  | | | | |
H-C-C-C-C-C-H
  | | | | |
  H H H H H

Para concluir esse desafio, você também deve entender a convenção de nomenclatura IUPAC para alcanos ramificados. Primeiro, há o alcano raiz. No nosso exemplo anterior, essa seria a parte "CC0C". Dependendo do tamanho dessa cadeia, ela tem um nome diferente. 1 C é chamado metano, 2 C etano, 3 C propano, depois butano, pentano, hexano, heptano, octano, nonano e decano (10 C). Então, para cada ramificação, existe um certo prefixo para isso: primeiro, há o índice (deslocamento) do átomo C ao qual a ramificação é anexada (contagem da esquerda). No exemplo, este seria 4 (também conhecido como o quarto átomo C da esquerda). Depois, há um hífen (este símbolo: "-") e depois outro nome indicando o tamanho do ramo. A nomeação do tamanho da ramificação é quase a mesma que a nomeação do tamanho da raiz, apenas que em vez de "ane" você acrescenta "yl". Com isso, o nome completo do exemplo seria

4-methylpentane

Se você tiver várias ramificações, elas também serão anexadas, separadas por outro hífen. Exemplo:

2-butyl-5-methylhexane

Uma última coisa: se você tiver vários ramos do mesmo tamanho, eles serão agrupados; suas compensações são separadas por vírgula e compartilham o mesmo nome de tamanho, que é anexado por uma sílaba extra, dependendo de quantas ramificações estão agrupadas: "di" para 2 ramificações, "tri" para 3, "tetra" para 4 (você não precisa de mais para este desafio). Exemplo:

2-ethyl-2,4,6-trimethyldecane

Para sua informação, isso poderia se parecer com algo assim: (omitidos átomos-H)

   |
  -C-
   |       |
  -C-     -C-
 | | | | | | | | | |
-C-C-C-C-C-C-C-C-C-C-
 | | | | | | | | | |
  -C- -C-
   |   |

Cheatsheet da nomenclatura

Prefixes indicating numbers:
| Num  | Prefix |
|------|--------|
| 1    | meth   |
| 2    | eth    |
| 3    | prop   |
| 4    | but    |
| 5    | pent   |
| 6    | hex    |
| 7    | hept   |
| 8    | oct    |
| 9    | non    |
| 10   | dec    |
Suffix root:   ane
Suffix branch: yl
Prefixes grouping: di, tri, tetra

As regras

Escreva um programa que leia esse nome IUPAC em STDIN, argumentos do programa ou equivalente e o desenhe como uma estrutura de arte ASCII para STDOUT (ou equivalente).

  • Para simplificar, você NÃO precisa desenhar os átomos de H (senão você terá problemas de espaçamento)
  • NÃO é permitido imprimir linhas horizontais iniciais ou finais vazias
  • As cadeias que você precisa analisar não terão mais que 10 e o máximo de ramificações em um "grupo" é limitado a 4.
  • O "deslocamento" máximo de uma ramificação é 9 (o que significa que você não precisa analisar mais de um dígito)
  • Seus ramos precisam alternar entre subir e descer após cada novo ramo. Caso esse espaço já seja ocupado por outra ramificação no mesmo deslocamento, é necessário desenhá-lo do outro lado da raiz. (cima-> baixo, baixo-> cima)
  • Na entrada corrompida, não formatada corretamente ou não extraível, seu programa pode se comportar não especificado.

Este é o código de golfe, o código mais curto em bytes vence!

Feliz golfe! :)

Thomas Oltmann
fonte
Deveria 4-methylpropanedizer 4-methylpentane? 4-<anything>propaneparece improvável, a menos que eu tenha entendido algo completamente errado.
Peter Taylor
Sim, você está certo. Editado!
Thomas Oltmann
4
A última molécula que você possui é 3-3-5-7-methyldodecaneporque a cadeia de carbono contínua mais longa tem 12 anos. Além disso, você disse que nem todas as informações da pergunta eram precisas, mas acho que vale a pena ressaltar que a segunda molécula é 2-methylpentane, não 4-methylpentaneporque você começa no carbono com a ramificação mais próxima.
Arcturus
Eu sei, mas essa era exatamente a imprecisão que eu estava negando. Essa é apenas a vantagem de mantê-lo curto o suficiente para um desafio de golfe com código! :)
Thomas Oltmann
11
1. Your branches have to alternate between going up and down after every new branch.seu exemplo viola esta regra 2. Qual é o comprimento máximo da cadeia que temos de suportar (analisar os prefixos fará parte do desafio). Você deve vincular (ou preferencialmente copiar) uma lista de nomenclatura.
Level River St

Respostas:

3

Python 2, 620 bytes

import re
i=input()
s='m|e|pr|b|p|hex|h|o|n|de';d=dict(zip(s.split('|'),range(1,11)))
z=[[eval('['+a+']'),d[b]]for a,b in re.findall('(?:(\d[,\d]*).*?[\-ia]|l)('+s+')',i[:-3])]
v=z[-1][1]
l=[[0,0]for _ in range(v)]
c=0
for a,b in sorted([(i,b)for a,b in z[:-1]for i in a]):l[a-1][c]=b;c=~c
m=[max(x) for x in zip(*l)]
L,R=[[[' 'for _ in '_'*2*i]for _ in '_'*(2*v+1)]for i in m]
c=[' |'*v+' ']
C=c+['-C'*v+'-']+c
for i in range(len(l)):
 X=L;q=2*i+1
 for a in l[i]:
  if a>0:
   for j in range(0,2*a,2):
    X[q][j]='C'
    X[q-1][j]=X[q+1][j]='-'
    X[q][j+1]='|'
  X=R
for l in zip(*L)[::-1]+C+zip(*R):print ''.join(l)

Explicação

Entrada: '2-ethyl-2,4,6-trimethyldecane'

Primeiro analisa a string com regex (o último grupo é root):

[[[2], 2], [[2, 4, 6], 1], [[], 10]]

Cada ramificação é escrita em uma matriz de comprimento len(root)(alternar para cima / para baixo é tratado aqui):

[[0, 0], [1, 2], [0, 0], [1, 0], [0, 0], [0, 1], [0, 0], [0, 0], [0, 0], [0, 0]]

Os ramos de seqüência de caracteres 'Left' e 'Right' ( L,R) e 'root' ( C) são inicializados.

Cada ramificação é então adicionada à ramificação 'string' correspondente (loop grande).

Os dois lados e o centro são impressos no final:

   |   |             
  -C- -C-            
 | | | | | | | | | | 
-C-C-C-C-C-C-C-C-C-C-
 | | | | | | | | | | 
  -C-     -C-        
   |       |         
  -C-                
   |                 
TFeld
fonte