Соревнование
Напишите программу, которая может разбить входную химическую формулу (см. Ниже) и вывести соответствующие атомы в форме element: atom-count
.
вход
Пример ввода:
H2O
Ваш ввод всегда будет содержать хотя бы один элемент, но не более десяти. Ваша программа должна принимать входные данные, которые содержат круглые скобки, которые могут быть вложенными.
Элементы в строках всегда будут совпадать [A-Z][a-z]*
, то есть они всегда будут начинаться с заглавной буквы. Числа всегда будут однозначными.
Выход
Пример вывода (для вышеуказанного ввода):
H: 2
O: 1
Ваш вывод может опционально сопровождаться переводом строки.
Расщепление молекул
Числа справа от набора скобок распределяются по каждому элементу внутри:
Mg(OH)2
Должен вывести:
Mg: 1
O: 2
H: 2
Тот же принцип применим к отдельным атомам:
O2
Должен вывести:
O: 2
А также цепочки:
Ba(NO2)2
Должен вывести:
Ba: 1
N: 2
O: 4
Примеры
> Ba(PO3)2
Ba: 1
P: 2
O: 6
> C13H18O2
C: 13
H: 18
O: 2
> K4(ON(SO3)2)2
K: 4
O: 14
N: 2
S: 4
> (CH3)3COOC(CH3)3
C: 8
H: 18
O: 2
> (C2H5)2NH
C: 4
H: 11
N: 1
> Co3(Fe(CN)6)2
Co: 3
Fe: 2
C: 12
N: 12
Входы обозначены стрелкой (знак больше, чем; >
).
Табло
Чтобы ваш счет отображался на доске, он должен быть в следующем формате:
# Language, Score
Или, если вы заработали бонус:
# Language, Score (Bytes - Bonus%)
function getURL(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:getURL(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),useData(answers)}})}function getOwnerName(e){return e.owner.display_name}function useData(e){var s=[];e.forEach(function(e){var a=e.body.replace(/<s>.*<\/s>/,"").replace(/<strike>.*<\/strike>/,"");console.log(a),VALID_HEAD.test(a)&&s.push({user:getOwnerName(e),language:a.match(VALID_HEAD)[1],score:+a.match(VALID_HEAD)[2],link:e.share_link})}),s.sort(function(e,s){var a=e.score,r=s.score;return a-r}),s.forEach(function(e,s){var a=$("#score-template").html();a=a.replace("{{RANK}}",s+1+"").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SCORE}}",e.score),a=$(a),$("#scores").append(a)})}var QUESTION_ID=58469,ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],answer_ids,answers_hash,answer_page=1;getAnswers();var VALID_HEAD=/<h\d>([^\n,]*)[, ]*(\d+).*<\/h\d>/;
body{text-align:left!important}table thead{font-weight:700}table td{padding:10px 0 0 30px}#scores-cont{padding:10px;width:600px}#scores tr td:first-of-type{padding-left:0}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id="scores-cont"><h2>Scores</h2><table class="score-table"><thead> <tr><td></td><td>User</td><td>Language</td><td>Score</td></tr></thead> <tbody id="scores"></tbody></table></div><table style="display: none"> <tbody id="score-template"><tr><td>{{RANK}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SCORE}}</td></tr></tbody></table>
Изменить: квадратные скобки больше не являются частью вопроса. Любые ответы, опубликованные до 3:00 UTC 23 сентября, являются безопасными и не будут затронуты этим изменением.
[HCl] = 0.01 mol L^-1
.>
.Ответы:
CJam,
5957 байтПопробуйте онлайн в интерпретаторе CJam .
Как это работает
источник
Pyth,
6665 байтПорт моего Python ответа. Поддерживает ввод только с использованием обычных скобок.
источник
Python3,
157154 байтаПоддерживает ввод только с использованием обычных скобок.
Перед созданием решения для игры в гольф, используя
eval
вышеизложенное, я создал это эталонное решение, которое я нашел очень элегантным:источник
JavaScript ES6, 366 байт
JS Fiddle: https://jsfiddle.net/32tunzkr/1/
Я почти уверен, что это можно сократить, но мне нужно вернуться к работе. ;-)
источник
return
утверждение. Этого должно быть достаточно на данный момент.replace
много, чтобы сэкономить несколько байтов, используяxyz[R='replace'](...)
первый раз иabc[R] (...)
каждый последующий раз.SageMath ,
156148 байтПопробуйте онлайн здесь (надеюсь, что ссылка будет работать, возможно, потребуется онлайн-аккаунт)
Примечание: если вы пытаетесь онлайн, вам нужно будет заменить
input()
на строку (например"(CH3)3COOC(CH3)3"
)объяснение
Sage позволяет упростить алгебраические выражения, если они имеют правильный формат (см. «Символические манипуляции» этой ссылки). Регулярные выражения внутри eval () в основном служат для перевода входной строки в правильный формат, например что-то вроде:
eval()
затем упростим это до:,8*C + 18*H + 2*O
и тогда это просто вопрос форматирования вывода с другой подстановкой регулярного выражения.источник
Python 3, 414 байт
Я надеюсь, что порядок результата не учитывается.
источник
Javascript (ES6),
286284Не намного короче, чем другой ES6, но я приложил все усилия. Примечание: это приведет к ошибке, если вы укажете пустую строку или большинство неверных входных данных. Также ожидается, что у всех групп будет больше 1 (т. Е. Нет
CO[OH]
). Если это нарушает какие-либо правила вызова, дайте мне знать.Использует стековый подход. Во-первых, он предварительно обрабатывает строку для добавления
1
к любому элементу без номера, то естьCo3(Fe(CN)6)2
становитсяCo3(Fe1(C1N1)6)2
. Затем он проходит в обратном порядке и накапливает количество элементов.скрипка
источник
Perl,
177172 байта171 байт код + 1 байт параметр командной строки
Хорошо, так что я, возможно, немного увлекся этим регулярным выражением ...
Пример использования:
источник
Mathematica, 152 байта
Выше определяется функция,
f
которая принимает строку в качестве входных данных. Функция берет строку и упаковывает каждое имя элемента в кавычки и добавляет оператор возведения в число infix перед каждым числом, затем интерпретирует строку как выражение:Затем он берет логарифм этого и расширяет его (mathematica не волнует, что взять логарифм :)):
а затем он находит все вхождения умножения a
Log
на число и анализирует его в виде{log-argument, number}
и выводит их в таблицу. Некоторые примеры:источник
Java, 827 байт
Git-репозиторий с исходным кодом (не идеальная четность, ungolfed поддерживает многосимвольные числа).
Давным-давно решил, что я дам представление Java. Определенно не собираюсь выигрывать какие-либо награды :).
источник
ES6, 198 байт
Где
\n
буквальный символ новой строки.Ungolfed:
источник
Пип ,
8577 + 1 = 78 байтНеконкурентный ответ, потому что он использует языковые функции, которые являются более новыми, чем вызов. Принимает формулу в качестве аргумента командной строки и использует
-n
флаг для правильного форматирования вывода.Попробуйте онлайн!
Основная хитрость заключается в том, чтобы преобразовать формулу с помощью замены регулярных выражений в выражение Пипа. Это, когда eval'd, сделает повторение и разрешит скобки для нас. Затем мы немного постобработаем, чтобы получить количество атомов и отформатировать все правильно.
Ungolfed, с комментариями:
Вот как
Co3(Fe(CN)6)2
преобразуется вход :Затем:
источник