Dibujo de estructuras de Lewis de alcanos

17

¡Acabo de recibir una lección en la escuela sobre alcanos y pensé que probablemente sería un gran desafío de golf de código! ¡No se preocupe, no es tan complicado como parece!

Un resumen rápido

(Tenga en cuenta: para mantener este resumen, no toda la información es 100% precisa).

Los alcanos son cadenas de carbono e hidrógeno. Cada átomo de carbono tiene 4 enlaces, y cada átomo de hidrógeno 1 enlace. Todos los átomos de carbono del alcano forman una cadena donde cada átomo C está conectado a otros 2 átomos C (izquierda y derecha en la estructura de Lewis) y 2 átomos H (arriba y abajo), excepto los extremos de la cadena. , donde el átomo de C está conectado a solo 1 C pero a 3 Hs. Aquí hay un ejemplo básico para el pentano (un alcano con 5 átomos de C y 12 átomos de H):

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

Los alcanos también pueden tener ramas. Pero no se preocupe, todos los alcanos en este desafío se pueden expresar con solo 1 nivel de ramificación. Ejemplo:

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

Para completar este desafío, también debe comprender la convención de nomenclatura IUPAC para alcanos ramificados. Primero está el alcano raíz. En nuestro ejemplo anterior, esta sería la parte "CCCCC". Según la longitud de esta cadena, tiene un nombre diferente. 1 C se llama metano, 2 C etano, 3 C propano, luego butano, pentano, hexano, heptano, octano, nonano y decano (10 C). Luego, para cada rama, hay un cierto prefijo: Primero, está el índice (desplazamiento) del átomo de C al que se agrega la rama (cuenta desde la izquierda). En el ejemplo, esto sería 4 (también conocido como el 4to átomo de C desde la izquierda). Luego hay un guión (este símbolo: "-") y luego otro nombre que indica el tamaño de la rama. El nombre del tamaño de la rama es casi igual al nombre del tamaño de la raíz, solo que en lugar de "ane" agregas "yl". Con eso, el nombre completo del ejemplo sería

4-methylpentane

Si tiene varias ramas, también están antepuestas, separadas por otro guión. Ejemplo:

2-butyl-5-methylhexane

Una última cosa: si tiene varias ramas del mismo tamaño, se agrupan; sus desplazamientos están separados por comas y comparten el mismo nombre de tamaño, que se antepone con una sílaba adicional dependiendo de cuántas ramas están agrupadas: "di" para 2 ramas, "tri" para 3, "tetra" para 4 (usted No necesito más para este desafío). Ejemplo:

2-ethyl-2,4,6-trimethyldecane

Para su información, esto podría verse más o menos así: (átomos H omitidos)

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

Hoja de trucos de 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

Las normas

Escriba un programa que lea dicho nombre IUPAC de STDIN, argumentos de programa o equivalente y lo dibuje como una estructura de lewis ASCII-art para STDOUT (o equivalente).

  • Para simplificar, NO tiene que dibujar los átomos H (de lo contrario, se encontrará con problemas de espacio)
  • NO puede imprimir ninguna línea horizontal inicial o posterior vacía
  • Las cadenas que debe analizar no serán más largas que 10, y el máximo de ramas en un "grupo" está limitado a 4.
  • El "desplazamiento" máximo de una rama es 9 (lo que significa que no tiene que analizar más de 1 dígito)
  • Sus ramas tienen que alternar entre subir y bajar después de cada nueva rama. En caso de que este espacio ya esté ocupado por otra rama en el mismo desplazamiento, debe dibujarlo en el otro lado de la raíz. (arriba-> abajo, abajo-> arriba)
  • En una entrada corrupta, no formateada correctamente o no dibujable, su programa puede comportarse sin especificar.

Este es el código de golf, ¡el código más corto en bytes gana!

¡Feliz golf! :)

Thomas Oltmann
fuente
Debería 4-methylpropanedecir 4-methylpentane? 4-<anything>propaneParece improbable, a menos que haya entendido completamente algo mal.
Peter Taylor
Sí tienes razón. Editado!
Thomas Oltmann
44
La última molécula que tienes es 3-3-5-7-methyldodecaneporque la cadena de carbono continua más larga es de 12 de largo. Además, usted dijo que no toda la información en la pregunta era precisa, pero creo que vale la pena señalar que la segunda molécula es 2-methylpentane, no 4-methylpentaneporque comience en el carbono con la ramificación más cercana.
Arcturus
Lo sé, pero esa fue exactamente la imprecisión que estaba negando. ¡Eso es solo una compensación por mantenerlo lo suficientemente corto para un desafío de golf de código! :)
Thomas Oltmann
1
1. Your branches have to alternate between going up and down after every new branch.su ejemplo viola esta regla 2. ¿Cuál es la longitud máxima de cadena que tenemos que admitir?
Level River St el

Respuestas:

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)

Explicación

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

Primer análisis de cadena con expresiones regulares (el último grupo es raíz):

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

Cada rama se escribe en una matriz de longitud len(root)(aquí se maneja alternar arriba / abajo):

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

Las ramas de cadena 'Left' y 'Right' ( L,R) y 'root' ( C) se inicializan.

Cada rama se agrega a la rama correspondiente 'cadena' (bucle grande).

Los dos lados y el centro están impresos al final:

   |   |             
  -C- -C-            
 | | | | | | | | | | 
-C-C-C-C-C-C-C-C-C-C-
 | | | | | | | | | | 
  -C-     -C-        
   |       |         
  -C-                
   |                 
TFeld
fuente