Наименование нециклических углеродных цепей


30

(Я не химик! Я могу ошибаться в некоторых вещах, я пишу то, что я узнал в старшей школе)

Атомы углерода имеют особый атрибут: они могут связываться с 4 другими атомами (что не так уж и особенно), и они остаются стабильными даже в длинных цепях, что очень уникально. Поскольку они могут быть объединены в цепочку и объединены различными способами, нам нужно какое-то соглашение об именах, чтобы назвать их.

Это самая маленькая молекула, которую мы можем сделать:

CH4

Это называется метаном. Он состоит только из одного углерода и 4 атомов водорода. Следующий:

CH3 - CH3

Это называется этаном. Он состоит из 2 атомов углерода и 6 атомов водорода.

Следующие 2 являются:

CH3 - CH2 - CH3
CH3 - CH2 - CH2 - CH3

Это пропан и бутан. Проблемы начинаются с цепочек с 4 атомами углерода, поскольку их можно построить двумя различными способами. Один показан выше, а другой:

CH3 - CH - CH3
       |
      CH3

Это явно не то же самое, что и другие. Количество атомов и связей различны. Конечно, простое связывание и вращение молекулы не сделают ее другой! Итак, это:

CH3 - CH2 - CH2 - CH3

И это:

CH3 - CH2
       |
CH3 - CH2

То же самое (Если вы в теории графов, вы можете сказать, что если есть изоморфизм между 2 молекулами; они одинаковы). Отныне я не буду выписывать атомы водорода, поскольку они не являются необходимыми для этой задачи.

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

Соревнование

Напишите программу, которая принимает многострочный текст в качестве входных данных (углеродная цепь) и выводит имя углеродной цепи. Входные данные будут содержать только пробелы, заглавные буквы 'c' и '|' и «-», который представляет собой связывание. Цепочка ввода никогда не будет содержать циклы! Пример:

Входные данные:

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

Выход:

4-этил-2-метилгексан

Любые выходные данные приемлемы, если они удобочитаемы и по существу одинаковы (так что вы можете использовать разные разделители, например, если хотите).

Соглашение об именах:

(См .: правила IUPAC )

  1. Определите самую длинную углеродную цепь. Эта цепочка называется родительской цепочкой.

  2. Определите все заместители (группы, присоединяющиеся к родительской цепочке).

  3. Пронумеруйте атомы углерода родительской цепи с конца, который дает заместителям наименьшее число. При сравнении ряда чисел серия, которая является «самой низкой», является той, которая содержит наименьшее число в случае первого различия. Если две или более боковые цепи находятся в эквивалентных позициях, присвойте младший номер тому, который будет первым в имени.

  4. Если один и тот же заместитель встречается более одного раза, указывается местоположение каждой точки, в которой встречается заместитель. Кроме того, количество раз, когда встречается группа заместителей, указывается с помощью префикса (ди, три, тетра и т. Д.).

  5. Если есть два или более различных заместителей, они перечислены в алфавитном порядке с использованием базового имени (игнорируйте префиксы). Единственный префикс, который используется при расположении заместителей в алфавитном порядке, это изо, как в изопропиле или изобутиле. Префиксы sec- и tert- не используются при определении алфавитного порядка, за исключением случаев, когда они сравниваются друг с другом.

  6. Если цепочки равной длины конкурируют за выбор в качестве родительской цепочки, то выбор выполняется последовательно:

    • цепь, которая имеет наибольшее количество боковых цепей.
    • цепь, заместители которой имеют наименьшие числа.
    • цепь, имеющая наибольшее количество атомов углерода в наименьшей боковой цепи.
    • цепь, имеющая наименее разветвленные боковые цепи (график, имеющий наименьшее количество листьев).

Для родительской цепочки наименование:

Number of carbons   Name
1                  methane
2                  ethane
3                  propane
4                  butane
5                  pentane
6                  hexane
7                  heptane
8                  octane
9                  nonane
10                 decane
11                 undecane
12                 dodecane

Ни одна цепь не будет длиннее 12, так что этого будет достаточно. Для подсетей это то же самое, но вместо 'ane' в конце мы имеем 'yl'.

Можно предположить, что Cs находятся в нечетных столбцах, а привязки ( |и -символы) 1 длинны между атомами углерода.

Тестовые случаи:

Входные данные:

C-C-C-C

Выход:

бутан

Входные данные:

C-C-C
  |
  C

Выход:

2-метилпропан

Входные данные:

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

Выход:

3-метилгексан

Входные данные:

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

Выход:

3-метилгексан

Входные данные:

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

Выход:

3,4-диметил-5-этилгептан

Изменить: Извините за неправильные примеры. Я не был хорошим учеником :(. Они должны быть исправлены сейчас.


Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Деннис

2
Согласно этому правилу, If the same substituent occurs more than once, the location of each point on which the substituent occurs is given. In addition, the number of times the substituent group occurs is indicated by a prefix (di, tri, tetra, etc.).следует не последний пример можно назвать 3,4- ди - метил-5-этилгептан? (мы только начинаем органическую химию, я могу ошибаться: P)
NieDzejkob

@NieDzejkob Я бы согласился, так как есть две метильные цепи.
Джонатан Фрех

@NieDzejkob Действительно, исправлено.
Петр Ленкефи

Ответы:


18

Питон 2 , 1876 1871 1870 1859 1846 1830 1826 1900 1932 1913 1847 1833 1635 1613 1596 байт

s=input().split('\n')
W=enumerate
J=len
Y=sorted
l=J(s[0])
s=''.join(s)
S=set
M=max
A=min
p=map
f=lambda k:[(x/l,x%l)for x,V in W(s)if V==k]
g=lambda x,i,h=lambda x,i,j:x[:i]+(x[i]+j,)+x[i+1:]:[(h(q,i,-1),h(q,i,1))for q in x]
v=f('C');e=g(f('-'),1)+g(f('|'),0)
E=[V for V in v if sum(e,()).count(V)==1]
o=lambda v:[E[~E.index(v)]for E in e if v in E]
T=lambda a:lambda b:z((a,b))
Z=lambda a:p(T(a[0]),a[1])
n=lambda R:'mepbphhondudetrueeeco nothotnxptn ddh p t t'[R-1::12].strip()+(R>9)*'ec'
G=lambda K:[H[i]for i,V in W(K)if V==A(K)]
q=lambda x:[`k[0]`for k in H if k[1]==x]
B='-'.join
def z(n,c=[]):k=[x for x in S(o(n[0]))-S(c)];p=[z((j,n[1]),c+k)for j in k];return 1-~-(n[0]==n[1])*(p and A(p)or J(v))
C=[(a,b)for a in E for b in E]
a=p(z,C)
s=[(k,[E for E in v if~-z((k[0],E))+z((k[1],E))==z((k[0],k[1]))])for k in[C[x]for x,V in W(a)if V==M(a)]]
H=[]
R=0
for k,_ in s:R=M(J(_),R);_.sort(key=T(k[0]));a=sum([list(S(o(k))-S(_))for k in _],[]);H+=zip(p(lambda a:Z((a,_)).index(2),a),p(Z,[(O,[x for x in S(v)-S(_)if z((x,O),_)<J(v)])for O in a])),
X=n(R)
U=any(H)
if U:H=G([[h[0]for h in Q]for Q in H if J(Q)==M(p(J,H))]);K=[[J(Q[1])for Q in j]for j in H];H=[H[i]for i,V in W(K)if A(V)==A(sum(K,[]))];K=[J([Q[1]for Q in j if J(S(Q[1]))-J(Q[1])])for j in H];H=[[p[0]+1,n(M(p[1]))+[['isopropyl','butyl-tert','butyl-sec','isobutyl'][J(p[1])+p[1].count(3)-3],'yl'][Y(p[1])==range(1,1+M(p[1]))]]for p in G(K)[0]]
print(U and B([','.join(q(x))+'-'+'dttphhondireeeecoe itnxptnc  rtataaa  aa a '[J(q(x))-2::9].strip()+B(x.split('-')[::-1])for x in Y(list(S(zip(*H)[1])))])+X or[X,'meth']['t'==X])+'ane'

Попробуйте онлайн!

Ну вот и все. Конечно, не самый удачный, но он работает (я надеюсь): D

Может у меня ушло около 10 часов? Вероятно, мой самый длинный гольф по размеру и времени, и это говорит о чем-то, учитывая, что я использовал Java D:

Логика:

  1. Преобразование из представления ASCII в представление графа с каждым атомом углерода в качестве узла и каждой связью в качестве ребра, представленного в форме смежности.
  2. Найти все листья; то есть узлы только с одной связью. Самая длинная цепь гарантированно будет от одного из них к другому.
  3. Найдите диадическое произведение листьев; то есть все пары краевых узлов. Затем возьмите длину всех этих цепочек.
  4. Для каждой цепочки найдите ее подцепи.
  5. Делайте вещи, чтобы выбрать правильную цепь. Если есть связи, то это не имеет значения. Интересный факт: всегда будет ничья, потому что каждая цепочка считается дважды, один раз в обратном порядке.
  6. Распечатайте это правильно.

РЕДАКТИРОВАТЬ : Исправлена ​​ошибка, когда он вызывал ошибки, если не было боковых цепей.

РЕДАКТИРОВАТЬ : Спасибо MD XF за то, что заметил несколько лишних пробелов (отступ для цикла for).

РЕДАКТИРОВАТЬ : я полностью забыл о префиксе для того же заместителя.

ПРИМЕЧАНИЕ . Каждая строка должна иметь одинаковую ширину, чтобы это работало. То есть конечные пробелы обязательны.

Интересный факт: большинство циклических углеводородов будет определяться как «метан»

Забавный факт: если вы сделаете C-C-...-C-Cс 13 Cs, он даст ethane, затем thaneдля 14, ropaneдля 15 и т. Д.

-79 байт благодаря Джонатану Фреху
-119 байт благодаря NieDzejkob
-17 байт благодаря овсу

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.