Lewis-Strukturen von Alkanen zeichnen


17

Ich hatte gerade eine Lektion in der Schule über Alkane und dachte mir, dass dies wahrscheinlich eine großartige Code-Golf-Herausforderung sein würde! Keine Sorge, es ist nicht so kompliziert, wie es aussehen mag!

Eine schnelle Wiederaufbereitung

(Bitte beachten Sie: Um dies kurz zu halten, sind nicht alle Informationen zu 100% korrekt.)

Alkane sind Ketten aus Kohlenstoff und Wasserstoff. Jedes Kohlenstoffatom hat 4 Bindungen und jedes Wasserstoffatom 1 Bindung. Alle Kohlenstoffatome des Alkans bilden eine Kette, in der jedes C-Atom mit 2 anderen C-Atomen (links und rechts in der Lewis-Struktur) und 2 H-Atomen (oben und unten) verbunden ist, mit Ausnahme der Enden der Kette , wobei das C-Atom nur mit 1 anderen C, aber 3 Hs verbunden ist. Hier ist ein grundlegendes Beispiel für Pentan (ein Alkan mit 5 C-Atomen und 12 H-Atomen):

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

Alkane können auch Verzweigungen aufweisen. Aber keine Sorge, alle Alkane in dieser Herausforderung können mit nur einem Verzweigungsgrad ausgedrückt werden. Beispiel:

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

Um diese Herausforderung zu meistern, müssen Sie auch die IUPAC-Namenskonvention für verzweigte Alkane kennen. Da ist zunächst das Wurzelalkan. In unserem vorherigen Beispiel wäre dies der Teil "CCCCC". Je nachdem, wie lang diese Kette ist, hat sie einen anderen Namen. 1 C heißt Methan, 2 C Ethan, 3 C Propan, dann Butan, Pentan, Hexan, Heptan, Octan, Nonan und Decan (10 C). Dann gibt es für jeden Zweig ein bestimmtes Präfix: Erstens gibt es den Index (Offset) des C-Atoms, an das der Zweig angehängt ist (Zählung von links). Im Beispiel wäre dies 4 (oder das 4. C-Atom von links). Dann gibt es einen Bindestrich (dieses Symbol: "-") und danach einen anderen Namen, der die Größe des Zweigs angibt. Die Benennung der Größe der Verzweigung ist fast identisch mit der Benennung der Größe der Wurzel. nur, dass du anstelle von "ane" "yl" anhängst. Damit wäre der vollständige Name des Beispiels

4-methylpentane

Wenn Sie mehrere Zweige haben, werden diese ebenfalls vorangestellt und durch einen anderen Bindestrich getrennt. Beispiel:

2-butyl-5-methylhexane

Eine letzte Sache: Wenn Sie mehrere Zweige derselben Größe haben, werden diese gruppiert. Ihre Offsets werden durch Komma getrennt und haben denselben Größen-Namen, dem eine zusätzliche Silbe vorangestellt wird, je nachdem, wie viele Zweige gruppiert sind: "di" für 2 Zweige, "tri" für 3, "tetra" für 4 (Sie) brauche nicht mehr für diese Herausforderung). Beispiel:

2-ethyl-2,4,6-trimethyldecane

Zu Ihrer Information, dies könnte ungefähr so ​​aussehen: (Ausgelassene H-Atome)

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

Nomenklatur-Spickzettel

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

Die Regeln

Schreiben Sie ein Programm, das einen solchen IUPAC-Namen aus STDIN, Programmargumenten oder Ähnlichem einliest und als ASCII-artige Lewis-Struktur nach STDOUT (oder Ähnlichem) zeichnet.

  • Der Einfachheit halber müssen Sie die H-Atome NICHT zeichnen (ansonsten treten Abstandsprobleme auf)
  • Es ist NICHT gestattet, leere horizontale Zeilen mit oder ohne Zeilenumbruch zu drucken
  • Die Ketten, die Sie analysieren müssen, dürfen nicht länger als 10 sein, und die maximale Anzahl von Zweigen in einer "Gruppe" ist auf 4 begrenzt.
  • Der maximale "Versatz" eines Zweigs beträgt 9 (was bedeutet, dass Sie nicht mehr als eine Ziffer analysieren müssen).
  • Ihre Filialen müssen nach jeder neuen Filiale abwechselnd auf und ab gehen. Falls dieser Platz bereits von einem anderen Zweig mit demselben Versatz belegt ist, müssen Sie ihn auf der anderen Seite der Wurzel zeichnen. (hoch-> runter, runter-> hoch)
  • Bei beschädigten, nicht korrekt formatierten oder anderweitig nicht darstellbaren Eingaben verhält sich Ihr Programm möglicherweise nicht spezifiziert.

Dies ist Code Golf, der kürzeste Code in Bytes gewinnt!

Viel Spaß beim Golfen! :)


Sollte 4-methylpropanesagen 4-methylpentane? 4-<anything>propanescheint unwahrscheinlich, es sei denn, ich habe etwas völlig missverstanden.
Peter Taylor

Ja, du hast Recht. Bearbeitet es!
Thomas Oltmann

4
Das letzte Molekül, das Sie haben, ist, 3-3-5-7-methyldodecaneweil die längste zusammenhängende Kohlenstoffkette 12 lang ist. Sie sagten auch, dass nicht alle Informationen in der Frage korrekt waren, aber ich denke, es lohnt sich darauf hinzuweisen, dass es sich bei dem zweiten Molekül 2-methylpentanenicht um ein Molekül handelt , 4-methylpentanedas am Kohlenstoff mit der engsten Verzweigung beginnt.
Arcturus,

Ich weiß, aber das war genau die Ungenauigkeit, die ich abgelehnt habe. Das ist nur ein Kompromiss, um es kurz genug für eine Code-Golf-Herausforderung zu halten! :)
Thomas Oltmann

1
1. Your branches have to alternate between going up and down after every new branch.Ihr Beispiel verstößt gegen diese Regel 2. Welche maximale Kettenlänge müssen wir unterstützen (das Parsen der Präfixe ist Teil der Herausforderung.) Sie sollten eine Nomenklaturliste verknüpfen (oder vorzugsweise kopieren).
Level River St

Antworten:


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)

Erläuterung

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

Erste mit Regex zu verarbeitende Parser (letzte Gruppe ist root):

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

Jeder Zweig ist in einem Array von Länge geschrieben len(root)(hier wird abwechselnd hoch / runter gehandhabt):

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

Die Zeichenfolgenverzweigungen 'Left' und 'Right' ( L,R) und 'root' ( C) werden initialisiert.

Jeder Zweig wird dann dem entsprechenden 'String'-Zweig hinzugefügt (große Schleife).

Die beiden Seiten und die Mitte sind am Ende aufgedruckt:

   |   |             
  -C- -C-            
 | | | | | | | | | | 
-C-C-C-C-C-C-C-C-C-C-
 | | | | | | | | | | 
  -C-     -C-        
   |       |         
  -C-                
   |                 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.