Disegno di Lewis Structures of Alkanes


17

Ho appena avuto una lezione a scuola sugli alcani e ho pensato che sarebbe stata una grande sfida per il golf in codice! Non ti preoccupare, non è così complicato come potrebbe sembrare!

Una rapida rehash

(Nota: per farla breve, non tutte le informazioni sono accurate al 100%.)

Gli alcani sono stringhe di carbonio e idrogeno. Ogni atomo di carbonio ha 4 legami e ogni atomo di idrogeno 1 legame. Tutti gli atomi di carbonio dell'alcano formano una stringa in cui ciascun atomo C è collegato ad altri 2 atomi di C (sinistro e destro nella struttura di Lewis) e 2 atomi di H (su e giù), ad eccezione delle estremità della stringa , in cui l'atomo C è collegato solo a 1 altro C ma a 3 H. Ecco un esempio di base per pentano (un alcano con 5 atomi di C e 12 atomi di H):

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

Anche gli alcani possono avere rami. Ma non preoccuparti, tutti gli alcani in questa sfida possono essere espressi con 1 solo livello di ramificazione. Esempio:

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

Per completare questa sfida devi anche comprendere la convenzione di denominazione IUPAC per gli alcani ramificati. Prima di tutto c'è l'alcano alcano. Nel nostro esempio precedente, questa sarebbe la parte "CCCCC". A seconda della lunghezza di questa catena, ha un nome diverso. 1 C è chiamato metano, 2 C etano, 3 C propano, quindi butano, pentano, esano, eptano, ottano, nonano e decano (10 C). Quindi, per ogni ramo, c'è un certo prefisso: prima di tutto, c'è l'indice (offset) dell'atomo C al quale viene aggiunto il ramo (conta da sinistra). Nell'esempio, questo sarebbe 4 (ovvero il 4 ° atomo di C da sinistra). Poi c'è un trattino (questo simbolo: "-") e successivamente un altro nome che indica la dimensione del ramo. La denominazione della dimensione del ramo è quasi uguale alla denominazione della dimensione della radice, solo che invece di "ane" aggiungi "yl". Con ciò il nome completo dell'esempio sarebbe

4-methylpentane

Se hai più rami, anche loro sono anteposti, separati da un altro trattino. Esempio:

2-butyl-5-methylhexane

Un'ultima cosa: se hai più rami della stessa dimensione, vengono raggruppati; i loro offset sono separati da virgola e condividono lo stesso nome-dimensione, che viene preceduto da una sillaba aggiuntiva a seconda di quanti rami sono raggruppati: "di" per 2 rami, "tri" per 3, "tetra" per 4 (tu non ho bisogno di più per questa sfida). Esempio:

2-ethyl-2,4,6-trimethyldecane

Cordiali saluti, questo potrebbe apparire un po 'così: (Omissi H-atoms)

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

Foglio informativo sulla 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

Le regole

Scrivi un programma che legge un tale nome IUPAC da STDIN, argomenti del programma o equivalente e lo disegna come una struttura lewis di arte ASCII su STDOUT (o equivalente).

  • Per semplicità, NON è necessario disegnare gli atomi di H (altrimenti si incontreranno problemi di spaziatura)
  • NON è consentito stampare linee orizzontali iniziali o finali vuote
  • Le catene che devi analizzare non saranno più lunghe di 10 e il numero massimo di rami in un "gruppo" è limitato a 4.
  • Il "offset" massimo di un ramo è 9 (il che significa che non è necessario analizzare più di 1 cifra)
  • I tuoi rami devono alternare andando su e giù dopo ogni nuovo ramo. Nel caso in cui questo spazio sia già occupato da un altro ramo con lo stesso offset, devi disegnarlo sull'altro lato della radice. (su-> giù, giù-> su)
  • In caso di input corrotti, non correttamente formattati o altrimenti non disegnabili, il programma potrebbe comportarsi in modo non specificato.

Questo è il codice golf, vince il codice più corto in byte!

Buon golf! :)


Dovrei 4-methylpropanedire 4-methylpentane? 4-<anything>propanesembra improbabile, a meno che non abbia frainteso completamente qualcosa.
Peter Taylor,

Sì hai ragione. Modificato!
Thomas Oltmann,

4
L'ultima molecola che hai è 3-3-5-7-methyldodecaneperché la catena di carbonio continua più lunga è lunga 12. Inoltre, hai detto che non tutte le informazioni nella domanda erano accurate, ma penso che valga la pena sottolineare che la seconda molecola è 2-methylpentane, non 4-methylpentaneperché inizi dal carbonio con la ramificazione più vicina.
Arcturus,

Lo so, ma era esattamente l'imprecisione che stavo negando. Questo è solo il compromesso per mantenerlo abbastanza corto per una sfida di codice golf! :)
Thomas Oltmann,

1
1. il Your branches have to alternate between going up and down after every new branch.tuo esempio viola questa regola 2. Qual è la lunghezza massima della catena che dobbiamo supportare (l'analisi dei prefissi farà parte della sfida.) Dovresti collegare (o preferibilmente copiare) un elenco di nomenclature.
Level River St,

Risposte:


3

Python 2, 620 byte

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)

Spiegazione

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

Prima analizza la stringa con regex (l'ultimo gruppo è root):

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

Ogni ramo è scritto in una matrice di lunghezza len(root)(L'alternanza su / giù è gestita qui):

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

I rami di stringa 'Left' e 'Right' ( L,R) e 'root' ( C) sono inizializzati.

Ogni ramo viene quindi aggiunto al ramo 'stringa' corrispondente (ciclo grande).

I due lati e il centro sono stampati alla fine:

   |   |             
  -C- -C-            
 | | | | | | | | | | 
-C-C-C-C-C-C-C-C-C-C-
 | | | | | | | | | | 
  -C-     -C-        
   |       |         
  -C-                
   |                 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.