Вызов
Учитывая формулу химического вещества, выведите M r соединения.
Уравнение
За каждым элементом в соединении следует число, которое обозначает номер указанного атома в соединении. Если числа нет, то в соединении есть только один атом.
Вот некоторые примеры:
- Этанол (C 2 H 6 O) будет
C2H6O
там, где есть два атома углерода, 6 атомов водорода и 1 атом кислорода - Гидроксид магния (MgO 2 H 2 ) будет
MgO2H2
там, где есть один атом магния, два атома кислорода и два атома водорода.
Обратите внимание, что вам никогда не придется обрабатывать скобки, и каждый элемент включается в формулу только один раз.
Хотя большинство людей, вероятно, будут придерживаться порядка, в котором они чувствуют себя наиболее комфортно, строгой системы заказов не существует. Например, вода может быть дана как H2O
или OH2
.
М р
Примечание: здесь предположим, что формула масса совпадает с молекулярной массой
M r соединения, молекулярная масса, является суммой атомных весов атомов в молекуле.
Единственные элементы и их атомные веса с точностью до 1 знака после запятой (водород до кальция, не считая благородных газов) заключаются в следующем. Их также можно найти здесь
H - 1.0 Li - 6.9 Be - 9.0
B - 10.8 C - 12.0 N - 14.0
O - 16.0 F - 19.0 Na - 23.0
Mg - 24.3 Al - 27.0 Si - 28.1
P - 31.0 S - 32.1 Cl - 35.5
K - 39.1 Ca - 40.1
Вы должны всегда давать выходные данные с одним десятичным знаком.
Так , например, этанол ( C2H6O
) имеет М р о , 46.0
как это сумма атомных весов элементов в нем:
12.0 + 12.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 16.0
(2*C + 6*H + 1*O)
вход
Одна строка в вышеуказанном формате. Вы можете гарантировать, что элементы, включенные в уравнение, будут фактическими элементарными символами.
Данное соединение не гарантированно существует в реальности.
Выход
Общая сумма M r соединения, с точностью до 1 знака после запятой.
правила
Встроенные элементы, которым запрещен доступ к элементам или химическим данным (извините Mathematica)
Примеры
Input > Output
CaCO3 > 100.1
H2SO4 > 98.1
SF6 > 146.1
C100H202O53 > 2250.0
выигрыш
Самый короткий код в байтах побеждает.
Этот пост был принят с разрешения Кэрда . (Сообщение удалено)
источник
2H2O
?NumberForm[#&@@#~ChemicalData~"MolecularMass",{9,1}]&
Ответы:
Желе , 63 байта
Монадическая ссылка, принимающая список символов и возвращающая число.
Попробуйте онлайн!
Как?
источник
Python 3 ,
189 182168 байт-14 байт, используя хэш из ответа Джастина Маринера JavaScript (ES6) .
Попробуйте онлайн!
Ниже приведена 182-байтовая версия, я оставлю объяснение этой - выше просто изменяет порядок весов, использует
int
для преобразования имени элемента из базы29
и использует различные дивиденды для сжатия диапазона целых чисел вниз - см. Джастин Ответ моряка .Безымянная функция, принимающая строку
s
и возвращающая число.Попробуйте онлайн!
Как?
Использует регулярное выражение, чтобы разделить входные данные,
s
на элементы и их количество, используя:re.findall("(\D[a-z]?)(\d*)",s)
\D
соответствует ровно одной не цифре и[a-z]?
соответствует 0 или 1 строчной букве, вместе сопоставляя элементы.\d*
соответствует 0 или более цифрам. Скобки превращают их в две группы и, как таковые,findall("...",s)
возвращают список кортежей строк[(element, number),...]
.Количество просто в экстракт, единственным , что ручка является то , что пустая строка означает 1, это достигается с логическим ,
or
поскольку строками Python являются falsey:int(n or 1)
.Строка элемента получает уникальное число, беря произведение его первого и последнего порядковых чисел (обычно это те же самые, например, S или C, но нам нужно различать Cl, C, Ca и Na, поэтому мы не можем просто использовать один персонаж).
Эти числа затем хэшируются, чтобы покрыть гораздо меньший диапазон [0,18], найденный путем поиска по модулю пространства, в результате чего
%1135%98%19
. Например"Cl"
есть порядковые67
и108
, что многократно давать7736
, что, по модулю1135
является426
, по модулю , который98
является34
, по модулю которого19
является15
; это число используется для индексации в списке целых чисел - 15-е (0-индексированное) значение в списке:[16,31,40.1,32.1,0,24.3,12,39.1,28.1,19,0,9,10.8,23,27,35.5,6.9,14,1]
это
35.5
атомный вес Cl, который затем умножается на количество таких элементов (как показано выше).Эти продукты затем добавляются вместе с помощью
sum(...)
.источник
PHP , 235 байт
Попробуйте онлайн!
Вместо этого
array_combine([H,Li,Be,B,C,N,O,F,Na,Mg,Al,Si,P,S,Cl,K,Ca],[1,6.9,9,10.8,12,14,16,19,23,24.3,27,28.1,31,32.1,35.5,39.1,40.1])
вы можете использовать[H=>1,Li=>6.9,Be=>9,B=>10.8,C=>12,N=>14,O=>16,F=>19,Na=>23,Mg=>24.3,Al=>27,Si=>28.1,P=>31,S=>32.1,Cl=>35.5,K=>39.1,Ca=>40.1]
с тем же количеством байтовисточник
JavaScript (ES6), 150 байт
Вдохновлен ответом Джонатана Аллана на Python , где он объяснил, как дать каждому элементу уникальное число и хэшировать эти числа, чтобы они находились в меньшем диапазоне.
Элементы были превращены в уникальные числа, интерпретируя их как base-29 (0-9 и AS). Затем я обнаружил, что
%633%35%18
сужает значения до диапазона[0, 17]
при сохранении уникальности.Тестовый фрагмент
источник
Clojure,
198194 байтаОбновление: лучше
for
чемreduce
.Оригинал:
Мне интересно, есть ли более компактный способ кодирования справочной таблицы.
источник
Python 3 , 253 байта
Попробуйте онлайн!
источник
Mathematica,
390338329 байтСохранено 9 байтов благодаря тому, что я действительно проснулся и использовал то сокращение, которое я намеревался.
Версия 2.1:
Объяснение: Найти положение всех заглавных букв. Поставь точку перед каждым. Разделите строку в каждой точке. Для этого списка подстрок сделайте следующее разделите его на буквы и разделите на основе цифр. Для разделенных по буквам конвертируйте строку в числа. Для тех, которые разделены цифрами, замените каждый химикат его молекулярным весом. Для любого с молекулярной массой и числом атомов замените его продуктом их. Их найти всего.
Версия 1:
Я уверен, что это может быть много в гольфе (или просто полностью переписан). Я просто хотел выяснить, как это сделать. (Задумается об этом утром.)
Объяснение: Сначала разбейте строку на символы. Затем сверните массив, объединяя строчные буквы и цифры обратно в заглавную. Затем добавьте 1 к любому химическому веществу без номера на конце. Затем выполните два разбиения терминов в массиве - одно разбиение по всем числам и одно разбиение по всем буквам. Для первого замените буквы их молярными массами, затем найдите произведение этих двух списков.
источник
Python 3 - 408 байт
В основном это решение @ovs, поскольку он проиграл более 120 байтов ... См. Первоначальное решение ниже.
Попробуйте онлайн!
Python 3 -
550 548535 байт (потерял счет с отступом)Сохранено 10 байтов благодаря @cairdcoinheringaahing и 3 сохранено благодаря ovs
У меня была личная цель - не использовать регулярные выражения и сделать это забавным способом старой школы ... Оказалось, что он на 350 байт длиннее решения регулярных выражений, но использует только стандартную библиотеку Python ...
Попробуйте онлайн!
Если кто-то захочет сыграть в гольф (с исправлениями отступов и другими хитростями ...), он будет принят на 100%, так как есть лучший способ сделать это ...
источник
for y in g: if str(y[0])==h[i][:h[i].index('-')]:x+=y[1]
наfor y in g:x+=y[1]*(str(y[0])==h[i][:h[i].index('-')])
if/for/while
на следующей строке. Так как это имеет место в каждой строке с отступом, вы не можете сохранить байты этим.