Степень ненасыщенности
Это не особенно сложная головоломка, но мне интересно увидеть ваши многочисленные способы ее решения.
Степень ненасыщенности - это число двойных химических связей между атомами и / или число колец в химическом соединении.
Вам будет дана молекулярная формула химического соединения в форме XaYbZc (где a, b и c - число атомов X, Y или Z в соединении) - формула может иметь любую длину и содержать любой химический элемент в периодической таблице (хотя элементы, отличные от C, H, N, F, Cl, Br, I могут игнорироваться, поскольку они не фигурируют в формуле). Соединение будет содержать по меньшей мере один атом углерода. Вы должны рассчитать и отобразить его степень ненасыщенности.
Например, сложный бензол (изображенный ниже) имеет DoU 4, поскольку он имеет три двойные связи (показаны двойной линией между атомами) и одно кольцо (число атомов, соединенных в петлю):
Как определено LibreTexts :
DoU = (2C + 2 + N - X - H) / 2
Куда:
C
это число атомов углеродаN
это число атомов азотаX
это число атомов галогена (F
,Cl
,Br
,I
)H
это число атомов водорода
Тестовые случаи:
C6H6 --> 4
C9H2O1 --> 0
C9H9N1O4 --> 6
U1Pt1 --> Not a valid input, no carbon
Na2O1 --> Not a valid input, no carbon
C1H1 --> 1.5, although in practice this would be one, but is a part of a compound rather than a compound in entirety.
N1H3 would return 0 - though in practice it isn't an organic compound (in other words it contains no carbon) so the formula wouldn't apply and it isn't a valid input
Для объяснения CH см. Здесь
По сути, вы должны определить, есть ли какие-либо из вышеперечисленных элементов (C, H, N, F, Cl, Br, I) в соединении, и если да, то сколько их. Затем вычислите степень ненасыщенности, используя приведенную выше формулу.
Только C, H, N, F, Cl, Br и I являются допустимыми значениями для формулы DoU. В целях этой загадки любые другие элементы могут быть полностью проигнорированы (например, если соединение было C6H6Mn, результат все равно будет 4). Если нет ни одного из вышеперечисленных соединений, ответ будет нулевым.
Можно предположить, что все вводимые соединения химически возможны, содержат по меньшей мере один атом углерода и, как известно, существуют. Если ввод неверен, программа может вывести либо 0, либо -1, либо не дать результата.
правила
Применяются стандартные правила ввода-вывода и лазейки . Ввод должен быть стандартной строкой, и вы можете предположить, что ввод не будет пустым. Это Codegolf - поэтому выигрывает самый короткий код в байтах.
Na2O
и Метилидин:CH
иCCl4He
. Это некоторые угловые случаи, которые могут сломать несколько решений. Кстати, не то, чтобы это имело значение для кого-либо, кроме Mathematica (вероятно), но можем ли мы предположить, что соединения (могут) существовать?C9H2O1 --> 0
. Разве это не должно быть 9?(2*9+2+0-0-2)/2
Ответы:
JavaScript (ES6),
117112 байтВозвращает
0
для неверных входов.Контрольные примеры
Показать фрагмент кода
Альтернативная версия, 103 байта
Если входные данные гарантированно действительны - как вводит в заблуждение введение в заблуждение - мы могли бы просто сделать:
демонстрация
Показать фрагмент кода
источник
Python 3 ,
142 151148 байтВозвращает 0 при ошибке.
Благодаря @HyperNeutrino, сбивающим байты.
Попробуйте онлайн!
источник
dict
там!Пип ,
7067 байтПринимает химическую формулу в качестве аргумента командной строки. Выходы
0
для неверных входов. Попробуйте онлайн!объяснение
Использует ряд замен регулярных выражений, чтобы превратить химическую формулу в математическую формулу, выявляет ее и вносит пару изменений, чтобы получить окончательное значение.
Замены (слегка негольфированная версия):
Мы оцениваем полученную строку с
V
. Это дает нам2C + N − X − H
. Чтобы получить правильное значение, мы вносим следующие корректировки:источник
C (gcc) , 195
197202байтовВероятно, самый длинный ответ.
Попробуйте онлайн!
Возвращает 0 при ошибке.
источник