задача
Напишите программу, которая принимает соединение, состоящее исключительно из элементов с атомным номером, меньшим или равным 92 (уран), и выводит молярную массу соединения в grams/mole
.
Правила и ограничения
- Вы не можете использовать функцию, которая напрямую рассчитывает молярную массу для вас.
- Ваша программа должна быть в состоянии работать на автономном компьютере.
- Вы МОЖЕТЕ использовать отдельный файл данных. Содержимое этого файла должно быть предоставлено.
- Ваша оценка - это длина вашей программы в байтах, плюс длина вашего файла данных в байтах, если вы решите ее использовать.
- Это код-гольф , поэтому выигрывает самый низкий балл.
вход
Строка, содержащая соединение. Эта строка может быть прочитан через STDIN
, передается в качестве аргумента, или установить переменную (просьба указать , какие). Ниже приведены все действительные данные:
CH2
(один углерод, два водорода)(CH2)8
(8 атомов углерода, 16 атомов водорода)U
(1 уран)
Ваша программа не обязана функционировать для встроенных скобок (то есть ((CH3)2N4)4
), а также для любого соединения, которое содержит элемент с атомным номером больше 92. Если ваша программа не работает ни в одном из двух вышеупомянутых случаев, она должна вывести Invalid formula
для таких случаев - нет неопределенного поведения.
Выход
Вы должны вывести, в STDOUT
или в переменную, молярную массу соединения в grams/mole
. Список атомных масс элементов доступен здесь (Википедия) . Ваш ответ должен быть точным с точностью до десятичного знака для соединений, содержащих менее 100 атомов (округлено).
Если ввод неверен, Invalid formula
должен быть выведен.
Информация о расчете молярной массы соединения в grams/mole
(Википедия).
Примеры
Input Output
H2O 18.015
O 15.999 (16 acceptable)
C6H2(NO2)3CH3 227.132
FOOF 69.995
C6H12Op3 Invalid formula
Np 237 (or Invalid formula)
((C)3)4 144.132 (or Invalid formula)
CodeGolf Invalid formula
U1000000
в десятичной запятой определить труднее, чем массуU2
13
если атомная масса равна12.999
?Ответы:
Bash,
978 708 675 673 650 636 632 631 598594211 байт для программы и 382 байт для данных.
Вход на STDIN, выход на STDOUT. ВНИМАНИЕ: создает вызываемые файлы
g
иa
, если они существуют, они будут перезаписаны!Файл данных
Для этого требуется файл с именем
y
, который является zopfli- сжатой формой этих данных (без завершающей строки). zopfli является gzip-совместимым алгоритмом сжатия и может быть распакован стандартными инструментами gzip. Он был запущен с 1024 итерациями (это, вероятно, слишком много). Последние 8 байтов были удалены.Base64 of
y
is (использоватьbase64 -d
для воспроизведения оригинального файла):Сумма md5 есть
d392b0f5516033f2ae0985745f299efd
.объяснение
Числа в файле являются приращениями относительной атомной массы (поэтому относительная атомная масса лития равна
1.008 + 0 + 2.995 + 2.937
).Этот скрипт работает, преобразовывая химическую формулу в арифметическое выражение с
+
и*
, заменяя каждый символ его относительной атомной массой, а затем передавая выражение вbc
. Если формула содержит недопустимые символы,bc
выдает синтаксическую ошибку и ничего не выводит в STDOUT; в этом случае выводInvalid formula
.Если STDIN пусто, вывод
0
. Вложенные скобки поддерживаются.пример
источник
Perl - 924
Он использует серию операций подстановки регулярных выражений для введенной формулы, чтобы развернуть подписанные элементы и группы, заменить элементы атомными весами и преобразовать их в последовательность дополнений, которую он затем оценивает.
источник
Mathematica 9 -
247227Это явно обманывает, так как я использую функцию, которая напрямую вычисляет физические массы (но не молярные массы!):
Использование: вызов функции
f
со строкой, содержащей формулу, на выходе будет масса.Тестовое задание:
Mathematica 10 выводит не сырое число, а число с единицей, поэтому это может быть неприемлемо.
источник
Javascript, 1002
Вход в
q
и выход вa
. Я не был уверен в том, каковы правила округления, поэтому я урезал до 3 знаков после запятой (или меньше, если цифры не были доступны из Википедии).источник
q
, хотя все остальное кажется в порядке. +1Javascript (E6) 1231
Как функция с вводом в качестве аргумента и возвращением вывода. Точность: 3 десятичных знака
Используйте regexp для преобразования химической формулы в простое арифметическое выражение с суммами и продуктами, заменяя:
(
с+(
Затем выражение оценивается и возвращается значение. В случае ошибок или если значение равно NaN (или ноль), функция возвращает «Неверная формула»
Теперь я вижу, что все остальные ответы используют один и тот же метод ... ну, вот версия javascript
источник
PHP - 793 (583 + 210)
В значительной степени опередил ответ Professorfish , который использует аналогичный метод, но эй ... Символы и массы сжаты gzip в файле,
a
полученном с помощью следующего кода:Формула должна храниться в
$f
переменной:Вот версия без комментариев и комментариев:
источник
Скала, 1077
Я вижу все ваши решения на языках с динамической типизацией с подобными отступами
eval
или встроенной функцией атомной массы и предлагаю вам статически типизированное языковое решение:Я должен рассмотреть некоторое сжатие для данных, но сейчас давайте просто сохраним атомные массы в базе 94.
источник
molarmass.scala:5: error: ';' expected but identifier found. def a(m:S)={var(r,s)=(m,0);do{val(y,z)=o(r);r=z;s+=y}while(r!=""&&r(0)!=41)s->r}