(Я не химик! Я могу ошибаться в некоторых вещах, я пишу то, что я узнал в старшей школе)
Атомы углерода имеют особый атрибут: они могут связываться с 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 )
Определите самую длинную углеродную цепь. Эта цепочка называется родительской цепочкой.
Определите все заместители (группы, присоединяющиеся к родительской цепочке).
Пронумеруйте атомы углерода родительской цепи с конца, который дает заместителям наименьшее число. При сравнении ряда чисел серия, которая является «самой низкой», является той, которая содержит наименьшее число в случае первого различия. Если две или более боковые цепи находятся в эквивалентных позициях, присвойте младший номер тому, который будет первым в имени.
Если один и тот же заместитель встречается более одного раза, указывается местоположение каждой точки, в которой встречается заместитель. Кроме того, количество раз, когда встречается группа заместителей, указывается с помощью префикса (ди, три, тетра и т. Д.).
Если есть два или более различных заместителей, они перечислены в алфавитном порядке с использованием базового имени (игнорируйте префиксы). Единственный префикс, который используется при расположении заместителей в алфавитном порядке, это изо, как в изопропиле или изобутиле. Префиксы sec- и tert- не используются при определении алфавитного порядка, за исключением случаев, когда они сравниваются друг с другом.
Если цепочки равной длины конкурируют за выбор в качестве родительской цепочки, то выбор выполняется последовательно:
- цепь, которая имеет наибольшее количество боковых цепей.
- цепь, заместители которой имеют наименьшие числа.
- цепь, имеющая наибольшее количество атомов углерода в наименьшей боковой цепи.
- цепь, имеющая наименее разветвленные боковые цепи (график, имеющий наименьшее количество листьев).
Для родительской цепочки наименование:
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'.
Можно предположить, что C
s находятся в нечетных столбцах, а привязки ( |
и -
символы) 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-этилгептан
Изменить: Извините за неправильные примеры. Я не был хорошим учеником :(. Они должны быть исправлены сейчас.
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)Ответы:
Питон 2 ,
187618711870185918461830182619001932191318471833163516131596 байтПопробуйте онлайн!
Ну вот и все. Конечно, не самый удачный, но он работает (я надеюсь): D
Может у меня ушло около 10 часов? Вероятно, мой самый длинный гольф по размеру и времени, и это говорит о чем-то, учитывая, что я использовал Java D:
Логика:
РЕДАКТИРОВАТЬ : Исправлена ошибка, когда он вызывал ошибки, если не было боковых цепей.
РЕДАКТИРОВАТЬ : Спасибо MD XF за то, что заметил несколько лишних пробелов (отступ для цикла for).
РЕДАКТИРОВАТЬ : я полностью забыл о префиксе для того же заместителя.
ПРИМЕЧАНИЕ . Каждая строка должна иметь одинаковую ширину, чтобы это работало. То есть конечные пробелы обязательны.
Интересный факт: большинство циклических углеводородов будет определяться как «метан»
Забавный факт: если вы сделаете
C-C-...-C-C
с 13 Cs, он дастethane
, затемthane
для 14,ropane
для 15 и т. Д.-79 байт благодаря Джонатану Фреху
-119 байт благодаря NieDzejkob
-17 байт благодаря овсу
источник