Рисование Льюиса Структуры Алканов

17

Я только что провел в школе урок об алканах и подумал, что это, вероятно, послужит отличным испытанием для игры в гольф! Не волнуйтесь, это не так сложно, как может показаться!

Быстрая перефразировка

(Обратите внимание: для краткости, не вся информация на 100% точна.)

Алканы являются нитями углерода и водорода. Каждый атом углерода имеет 4 связи, а каждый атом водорода 1 связь. Все атомы углерода алкана образуют цепочку, где каждый атом C связан с 2 другими атомами C (слева и справа в структуре Льюиса) и 2 атомами H (вверх и вниз), за исключением концов цепочки где атом C связан только с 1 другим C, но с 3 Hs. Вот основной пример для пентана (алкана с 5 атомами углерода и 12 атомами водорода):

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

Алканы также могут иметь ветви. Но не волнуйтесь, все алканы в этой задаче могут быть выражены только с 1 уровнем ветвления. Пример:

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

Для выполнения этой задачи вы также должны понимать соглашение о присвоении имен IUPAC для разветвленных алканов. Во-первых, это корневой алкан. В нашем предыдущем примере это была часть "CCCCC". В зависимости от длины этой цепочки она может иметь другое имя. 1 C называется метаном, 2 C этаном, 3 C пропаном, затем бутаном, пентаном, гексаном, гептаном, октаном, нонаном и деканом (10 C). Затем для каждой ветви есть определенный префикс к этому: во-первых, есть индекс (смещение) атома C, к которому добавляется ветвь (считайте слева). В примере это было бы 4 (иначе это 4-й атом C слева). Затем есть дефис (этот символ: «-»), и после этого другое имя, указывающее размер ветви. Наименование размера ветви почти такое же, как наименование размера корня, просто вместо "ane" вы добавляете "yl". При этом полное имя примера будет

4-methylpentane

Если у вас есть несколько ветвей, то они также добавляются через другой дефис. Пример:

2-butyl-5-methylhexane

И последнее: если у вас несколько ветвей одинакового размера, они группируются; их смещения разделены запятой, и они имеют одно и то же имя размера, к которому добавляется дополнительный слог в зависимости от того, сколько веток сгруппировано: «ди» для 2 веток, «три» для 3, «тетра» для 4 (вы не нужно больше для этого вызова). Пример:

2-ethyl-2,4,6-trimethyldecane

К вашему сведению, это может выглядеть примерно так: (Пропущенные атомы водорода)

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

Номенклатура Шпаргалка

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

Правила

Напишите программу, которая читает такое имя IUPAC из STDIN, аргументы программы или эквивалентные элементы и рисует ее как структуру Льюиса ASCII-art в STDOUT (или эквивалентную).

  • Для простоты вам НЕ нужно рисовать атомы водорода (иначе у вас возникнут проблемы с пространством)
  • Вам НЕ разрешено печатать пустые начальные или конечные горизонтальные линии
  • Цепочки, которые вы должны проанализировать, не будут длиннее 10, а максимальное количество ветвей в «группе» ограничено 4.
  • Максимальное «смещение» ветви равно 9 (это означает, что вам не нужно анализировать более 1 цифры)
  • Ваши ветви должны чередоваться, поднимаясь и опускаясь после каждой новой ветви. Если это пространство уже занято другой ветвью с тем же смещением, вы должны нарисовать его на другой стороне корня. (вверх-> вниз, вниз-> вверх)
  • При поврежденном, неправильно отформатированном или не отрисовываемом вводе ваша программа может вести себя неопределенно.

Это код гольф, выигрывает самый короткий код в байтах!

Удачного игры в гольф! :)

Томас Олтманн
источник
Должен 4-methylpropaneсказать 4-methylpentane? 4-<anything>propaneкажется маловероятным, если я полностью не понял что-то.
Питер Тейлор
Да, ты прав. Отредактировал это!
Томас Олтманн
4
Последняя молекула у вас есть, 3-3-5-7-methyldodecaneпотому что самая длинная непрерывная углеродная цепь имеет длину 12. Кроме того, вы сказали, что не вся информация в вопросе была точной, но я думаю, что стоит указать, что вторая молекула 2-methylpentaneне 4-methylpentaneпотому , что вы начинаете с углерода с ближайшим разветвлением.
Арктур
Я знаю, но это была именно та неточность, которую я отвергал. Это всего лишь компромисс за то, что он достаточно короткий для игры в гольф! :)
Томас Олтманн
1
1. Your branches have to alternate between going up and down after every new branch.ваш пример нарушает это правило 2. Какова максимальная длина цепочки, которую мы должны поддерживать (разбор префиксов будет частью задачи.) Вам следует связать (или предпочтительно скопировать) список номенклатуры.
Уровень Река St

Ответы:

3

Python 2, 620 байт

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)

объяснение

Входные данные: '2-ethyl-2,4,6-trimethyldecane'

Сначала анализирует строку с помощью регулярного выражения (последняя группа - root):

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

Каждая ветвь записывается в виде массива длины len(root)(здесь чередуются переменные вверх / вниз):

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

«Левый» и «Правый» ( L,R) и «корень» (CИнициализируются ветви строк ).

Затем каждая ветвь добавляется к соответствующей ветке 'string' (большой цикл).

Две стороны и центр напечатаны в конце:

   |   |             
  -C- -C-            
 | | | | | | | | | | 
-C-C-C-C-C-C-C-C-C-C-
 | | | | | | | | | | 
  -C-     -C-        
   |       |         
  -C-                
   |                 
TFeld
источник