Малювання Льюїсових структур Алкана


17

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

Швидкий перегвал

(Будь ласка, зауважте: щоб не було цієї інформації, не вся інформація є на 100% точною.)

Алкани - це струни вуглецю та водню. Кожен атом вуглецю має 4 зв’язки, а кожен атом водню - 1 зв’язок. Всі атоми вуглецю алкану утворюють рядок, де кожен атом C пов'язаний з 2 іншими атомами С (ліворуч і праворуч у структурі Льюїса) та 2 -ми атомами Н (вгору і вниз), за винятком кінців рядка , де C-атом з'єднаний лише з 1 іншим С, але 3 Гс. Ось основний приклад пентану (алкан з 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). Потім для кожної гілки є певний префікс до цього: По-перше, є індекс (зміщення) атома С, до якого додається гілка (рахується зліва). У прикладі це було б 4 (він же 4-й атом С зліва). Потім з'являється дефіс (цей символ: "-"), а після цього ще одна назва, що вказує розмір гілки. Іменування розміру гілки майже таке ж, як іменування розміру кореня, тільки що замість "ане" ви додаєте "іл". З цим буде повна назва прикладу

4-methylpentane

Якщо у вас є кілька гілок, то вони також попередньо відокремлені дефісом. Приклад:

2-butyl-5-methylhexane

Останнє: якщо у вас є кілька гілок одного розміру, вони групуються; їхні зсуви розділені комою і вони мають однакову назву розміру, яка стає попередньою додатковою складовою залежно від того, скільки гілок згруповано: "di" для 2 гілок, "tri" для 3, "tetra" для 4 (ви не потрібно більше для цього виклику). Приклад:

2-ethyl-2,4,6-trimethyldecane

FYI, це може виглядати приблизно так: (Опущені Н-атоми)

   |
  -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 lewis структура до 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. Яка максимальна довжина ланцюга, яку ми маємо підтримувати (аналіз префіксів буде частиною виклику.) Ви повинні зв’язати (або бажано скопіювати) список номенклатури.
Рівень р. Св.

Відповіді:


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'

Перший розбір до рядка з регулярним виразом (остання група є коренем):

[[[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-                
   |                 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.