Вы должны получить строку химического уравнения (без пробелов, только буквы (в верхнем и нижнем регистре), цифры, скобки и математические знаки) от пользователя и распечатать ответ, если уравнение сбалансировано или нет (любая пара положительных / отрицательных ответов : Да / Нет, правда / ложь, 1/0). Чтобы сделать код короче, вы можете предположить, что входные строки могут содержать только эти элементы: Al, Ar, B, Be, C, Cl, Cr, Cu, Fe, H, He, K, N, O, S. И еще одна вещь : могут быть -
признаки. Это все о математике: +
означает сложение, -
означает вычитание.
Примеры:
Входные данные:
C6H5COOH-O2=7CO2+3H2O
Вывод:
No
Входные данные:
2Fe(CN)6+2SO2+202=Fe2(SO4)2+6C2N2
Вывод:
Yes
Входные данные:
2SO2=2SO4-2O2
Вывод:
Yes
Самый короткий код выигрывает.
2O2
вместо202
(двести два).Ответы:
Mathematica 152
Результат:
Я рассматриваю химическую формулу как полином, например,
Тогда я просто посчитал коэффициенты.
источник
Tr@CoefficientRules
а затем умножаю их на коэффициенты сTimes@@@
. ДляO
:,2*2+2*2=4*2
дляC
:2*6 = 6*2
и т. Д.Python 2,7,
316276 символовОн делает много регулярных переписываний, чтобы преобразовать входное уравнение в нечто
eval
способное. Затем он проверяет уравнение для каждого элемента в отдельности.Например, уравнения примера переписывают в (
t
переменную):Я уверен, что в области регулярных выражений есть еще гольф.
источник
Haskell,
400351308 символовЭто просто могло бы выжать из нее весь гольф. Я не знаю, есть ли еще
100518 символов для сохранения!Вот версия без правил, на случай, если кто-нибудь захочет следовать. Это простой
Parsec
основанный парсер:источник