Rysowanie struktur Lewisa alkanów

17

Właśnie miałem lekcję w szkole na temat alkanów i pomyślałem, że prawdopodobnie będzie to świetne wyzwanie dla golfa! Nie martw się, to nie jest tak skomplikowane, jak mogłoby się wydawać!

Szybki powtórka

(Uwaga: aby zachować ten krótki opis, nie wszystkie informacje są w 100% dokładne).

Alkany są łańcuchami węgla i wodoru. Każdy atom węgla ma 4 wiązania, a każde wiązanie atomu wodoru 1. Wszystkie atomy węgla alkanu tworzą łańcuch, w którym każdy atom C jest połączony z 2 innymi atomami C (lewy i prawy w strukturze Lewisa) i 2 atomami H (w górę i w dół), z wyjątkiem końców łańcucha , w którym atom C jest połączony tylko z 1 innym C, ale 3 Hs. Oto podstawowy przykład dla pentanu (alkanu z 5 atomami węgla i 12 atomami wodoru):

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

Alkany mogą również mieć gałęzie. Ale nie martw się, wszystkie alkany w tym wyzwaniu można wyrazić za pomocą tylko 1 poziomu rozgałęzienia. Przykład:

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

Aby ukończyć to wyzwanie, musisz również zrozumieć konwencję nazewnictwa IUPAC dla rozgałęzionych alkanów. Najpierw jest alkan korzeniowy. W naszym poprzednim przykładzie byłaby to część „CCCCC”. W zależności od długości tego łańcucha ma on inną nazwę. 1 C nazywa się metanem, 2 ° C etanem, 3 ° C propanem, a następnie butanem, pentanem, heksanem, heptanem, oktanem, nonanem i dekanem (10 ° C). Następnie, dla każdej gałęzi, jest pewien prefiks: Po pierwsze, jest indeks (przesunięcie) atomu C, do którego dołączona jest gałąź (liczenie od lewej). W tym przykładzie byłoby to 4 (czyli czwarty atom C od lewej). Następnie jest łącznik (ten symbol: „-”), a następnie inna nazwa wskazująca rozmiar gałęzi. Nazewnictwo wielkości gałęzi jest prawie takie samo jak nazewnictwo wielkości katalogu głównego, po prostu zamiast „ane” dodajesz „yl”. Dzięki temu pełna nazwa przykładu będzie

4-methylpentane

Jeśli masz wiele gałęzi, są one również poprzedzone, oddzielone innym łącznikiem. Przykład:

2-butyl-5-methylhexane

I ostatnia rzecz: jeśli masz wiele gałęzi tego samego rozmiaru, zostaną one zgrupowane; ich przesunięcia są oddzielone przecinkiem i mają tę samą nazwę rozmiaru, która jest poprzedzana dodatkową sylabą w zależności od liczby zgrupowanych gałęzi: „di” dla 2 gałęzi, „tri” dla 3, „tetra” dla 4 (ty nie potrzeba więcej na to wyzwanie). Przykład:

2-ethyl-2,4,6-trimethyldecane

Do Twojej wiadomości, może to wyglądać mniej więcej tak: (pominięte atomy H)

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

Nomenklatura Ściągawka

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

Zasady

Napisz program, który wczyta taką nazwę IUPAC ze STDIN, argumenty programu lub równoważny i narysuje go jako strukturę Lewisa w stylu ASCII do STDOUT (lub odpowiednika).

  • Dla uproszczenia NIE musisz rysować atomów H (w przeciwnym razie napotkasz problemy z odstępami)
  • NIE wolno drukować żadnych pustych linii poziomych przednich i końcowych
  • Łańcuchy, które należy przeanalizować, nie będą dłuższe niż 10, a maksymalna liczba rozgałęzień w „grupie” jest ograniczona do 4.
  • Maksymalne „przesunięcie” gałęzi wynosi 9 (co oznacza, że ​​nie trzeba analizować więcej niż 1 cyfry)
  • Twoje gałęzie muszą się naprzemiennie przechodzić w górę i w dół po każdej nowej gałęzi. Jeśli ta przestrzeń jest już zajęta przez inną gałąź o tym samym przesunięciu, musisz narysować ją po drugiej stronie korzenia. (góra-> dół, dół-> góra)
  • W przypadku uszkodzonych, nieprawidłowo sformatowanych lub niemożliwych do wyciągnięcia danych wejściowych program może zachowywać się nieokreślony.

To jest kod golfowy, wygrywa najkrótszy kod w bajtach!

Miłej gry w golfa! :)

Thomas Oltmann
źródło
Powinien 4-methylpropanepowiedzieć 4-methylpentane? 4-<anything>propanewydaje się mało prawdopodobne, chyba że całkowicie coś źle zrozumiałem.
Peter Taylor,
Tak, masz rację. Edytowałem to!
Thomas Oltmann,
4
Ostatnią cząsteczką, którą masz, jest to, 3-3-5-7-methyldodecaneże najdłuższy ciągły łańcuch węglowy ma długość 12. Powiedziałeś też, że nie wszystkie informacje w pytaniu są dokładne, ale myślę, że warto zauważyć, że druga cząsteczka jest 2-methylpentane, nie 4-methylpentanedlatego, że zaczynasz od węgla o najbliższym rozgałęzieniu.
Arcturus,
Wiem, ale to była dokładnie niedokładność, którą odrzucałem. To tylko kompromis za to, że jest wystarczająco krótki, aby wziąć udział w golfowym wyzwaniu! :)
Thomas Oltmann,
1
1. Your branches have to alternate between going up and down after every new branch.Twój przykład narusza tę zasadę 2. Jaką maksymalną długość łańcucha musimy obsługiwać (analizowanie prefiksów będzie częścią wyzwania). Powinieneś połączyć (lub najlepiej skopiować) listę nomenklatury.
Level River St

Odpowiedzi:

3

Python 2, 620 bajtów

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)

Wyjaśnienie

Wejście: '2-ethyl-2,4,6-trimethyldecane'

Pierwsze parsowanie łańcucha z wyrażeniem regularnym (ostatnia grupa to root):

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

Każda gałąź jest zapisana w tablicy długości len(root)(tutaj naprzemiennie góra / dół):

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

„Left” i „Right” ( L,R) oraz „root” (CInicjowane są gałęzie ).

Każda gałąź jest następnie dodawana do odpowiedniej gałęzi „string” (duża pętla).

Dwie strony i środek są wydrukowane na końcu:

   |   |             
  -C- -C-            
 | | | | | | | | | | 
-C-C-C-C-C-C-C-C-C-C-
 | | | | | | | | | | 
  -C-     -C-        
   |       |         
  -C-                
   |                 
TFeld
źródło