Бернд - ученик средней школы, у которого есть проблемы с химией. В классе он должен разработать химические уравнения для некоторых экспериментов, которые они проводят, таких как сжигание гептана:
C 7 H 16 + 11O 2 → 7CO 2 + 8H 2 O
Поскольку математика не является самым сильным предметом Бернда, ему часто бывает трудно найти точные соотношения между продуктами и продуктами реакции. Поскольку вы наставник Бернда, ваша работа - помочь ему! Напишите программу, которая рассчитывает количество каждого вещества, необходимое для получения правильного химического уравнения.
вход
Ввод представляет собой химическое уравнение без количеств. Чтобы сделать это возможным в чистом ASCII, мы пишем любые подписки как обычные числа. Имена элементов всегда начинаются с заглавной буквы и могут сопровождаться крошечной. Молекулы разделены +
знаками, стрелка ASCII-art ->
вставлена между обеими сторонами уравнения:
Al+Fe2O4->Fe+Al2O3
Ввод завершается новой строкой и не содержит пробелов. Если ввод неверен, ваша программа может делать все что угодно.
Вы можете предположить, что ввод никогда не будет длиннее 1024 символов. Ваша программа может либо прочитать входные данные из стандартного ввода, из первого аргумента, либо заданным реализацией способом во время выполнения, если это невозможно.
Выход
Результатом вашей программы является входное уравнение, дополненное дополнительными числами. Количество атомов для каждого элемента должно быть одинаковым с обеих сторон стрелки. Для приведенного выше примера допустимый вывод:
2Al+Fe2O3->2Fe+Al2O3
Если число для молекулы - 1, отбросьте это. Число всегда должно быть положительным целым числом. Ваша программа должна выдавать числа такие, чтобы их сумма была минимальной. Например, следующее недопустимо:
40Al+20Fe2O3->40Fe+20Al2O3
Если решения не существует, распечатайте
Nope!
вместо. Пример ввода, который не имеет решения
Pb->Au
правила
- Это код-гольф. Самый короткий код выигрывает.
- Ваша программа должна завершиться в разумные сроки для всех разумных вводов.
Тестовые случаи
Каждый тестовый пример имеет две строки: вход и правильный выход.
C7H16+O2->CO2+H2O
C7H16+11O2->7CO2+8H2O
Al+Fe2O3->Fe+Al2O3
2Al+Fe2O3->2Fe+Al2O3
Pb->Au
Nope!
solve(
функцию иeval(
интерпретацию входных данных :)Ответы:
C 442
505символовБеги как:
Полученные результаты:
источник
Mathematica 507
Я использовал матричный подход с расширенным химическим составом, описанный в
Л.Р.Торн, Инновационный подход к уравновешиванию уравнений химических реакций: упрощенная матрично-обратная техника для определения нулевого пространства матрицы. Chem.Educator , 2010, 15, 304 - 308.
Был добавлен один небольшой трюк: я разделил транспонирование пустого вектора на наибольший общий делитель элементов, чтобы обеспечить целочисленные значения в любых решениях. Моя реализация еще не обрабатывает случаи, когда существует более одного решения для уравновешивания уравнения.
тесты
Анализ
Он работает, создавая следующую таблицу химического состава, состоящую из химических элементов по элементам, к которой добавлен вектор нулевой добавки (ставший таблицей дополненного химического состава:
Внутренние клетки удаляются в виде матрицы и переворачиваются, давая.
Самый правый столбец извлекается, давая:
Каждый элемент вектора делится на gcd элементов (1/8), давая:
где отрицательные значения будут размещены на левой стороне стрелки. Абсолютными значениями являются числа, необходимые для баланса исходного уравнения:
источник
Питон, 880 символов
тесты:
Выход:
Может быть гораздо меньше, чем 880, но мои глаза уже убивают меня ...
источник
Python 2, 635 байт
количество предыдущих байтов: 794, 776, 774, 765, 759, 747, 735, 734, 720, 683, 658, 655, 654, 653, 651, 638, 637, 636 байтов.
Второй уровень отступа - только вкладка, третий - вкладка, затем пробел.
Если честно, это ответ jadkik94, но побрилось так много байтов, что мне пришлось это сделать. Скажи мне, могу ли я сбрить байты!
источник
''.join(map(chr,range(97,122)))
Dmap(chr,range(97,123))
работает на 12 байтов сохранено.JavaScript, 682 байта
Это гораздо более удачный (десятилетия символов!) Ответ Куйлина. Может быть неконкурентоспособным, потому что некоторые функции JS устарели.
источник
Javascript, 705 байт
(не конкурирует, некоторые функции устарели)
Все остальные решения имели элементы грубой силы. Я попытался использовать более детерминированный подход, представив химическое уравнение в виде набора линейных уравнений, а затем решив, используя алгоритм Гаусса-Джордана, чтобы получить приведенную форму ряда строк в этой матрице. Чтобы выделить тривиальный случай, когда все равно нулю, я предполагаю, что один из элементов является постоянным числом - и это число определяется только всеми числами, умноженными вместе, чтобы не иметь дробей. Затем в качестве последнего шага мы разделим каждый на gcd, чтобы выполнить последнее условие.
Ungolfed:
Golfed
источник