В этой задаче ваша задача - взять анион и катион и вывести химическую формулу соединения. Вход следует этим правилам:
- Возьмите в 2 -х строках (в любом порядке) , представляющих анион и катион, например
F
,NH_4
, илиAl
. - Чтобы взять на себя ответственность за каждый ион, вы можете использовать его как часть строки, разделенную кареткой (например
F^-1
), или ввести дополнительные числовые аргументы.- Примечание. Пока ваш тип ввода чисел подписан, заряд аниона будет передаваться как отрицательное число.
- Символы всегда будут настоящими, а расходы точными.
Вывод должен следовать этим правилам:
- Используйте
_
для подписки: Fe 2 O 3 будетFe_2O_3
. - Сначала катион: NaCl, а не ClNa.
- Нейтральная молекула: Li 2 O, а не LiO или LiO - .
- Наименьшие возможные коэффициенты: Fe 2 O 3 , а не Fe 4 O 6 .
- Никаких индексов: NaCl, а не Na 1 Cl 1 .
- Нет переключения: NH 4 OH, а не NH 5 O.
- Условные скобки:
- Не используйте скобки для одноатомного иона: MgCl 2 , а не Mg (Cl) 2 .
- Не используйте скобки, если в молекуле присутствует только один ион: KClO 3 , а не K (ClO 3 ).
- НЕ используйте круглые скобки, если есть два или более многоатомных иона: Be 3 (PO 4 ) 2 , а не Be 3 PO 4 2 или Be 3 P 2 O 8 .
Вот некоторые дополнительные примеры входов и выходов:
Input Output
Fe^+3, O^-2 Fe_2O_3
Fe^+2, O^-2 FeO
H^+1, SO_4^-2 H_2SO_4
Al^+3, SO_4^-2 Al_2(SO_4)_3
NH_4^+1, SO_4^-2 (NH_4)_2SO_4
Hg_2^+2, PO_4^-3 (Hg_2)_3(PO_4)_2
NH_4^+1, OH^-1 NH_4OH
Hg_2^+2, O_2^-2 Hg_2O_2
Поскольку это код-гольф , выигрывает самый короткий ответ в байтах.
Fe^+2, OH^-1: Fe(OH)_2
для многоатомного иона с 1 каждым элементом (OH^-1
).NO_3^-1
. Кроме того, еще один тестовый пример должен быть первым в паре с a^-2
, чтобы он получился(C(NH_2)_3)_2...
. Или случай, когда ион, который нужен более одного раза, начинается со скобки.Fe_4(Fe(CN)_6)_3
для прусского голубого.Ответы:
APL (Дьялог) ,
605961 байт+2, так как обвинения должны быть подписаны.
Анонимная инфиксная функция. Принимает список ионов (анион, катион) в качестве левого аргумента и список соответствующих зарядов в качестве правого аргумента.
Попробуйте онлайн!
{
…}∘|
Функция где⍺
левый аргумент и⍵
величина правого аргумента:∧/⍵
LCM сборов⍵÷⍨
разделите расходы на этоs←
хранить вs
(для з ubscripts)'_',∘⍕¨
форматировать (stringify) и ставить перед каждой чертой(
…)/
Повторить каждую букву каждой с соответствующим значением из:s≠1
Отличаетсяs
от1
? (дает 1 или 0)m←
магазин вm
(для м ультипл)(
…),¨
Добавьте к ним следующее соответственно:⍺{
…}¨m
Для каждого вызовите эту функцию с ионами и вm
качестве аргументов:⎕D,⎕A
D igits с последующим прописной lphabet⍺∩
пересечение иона и что≢
подсчитать количество символов в этом1<
Один меньше этого? (т.е. есть ли у нас многоэлементный ион?)⍵∧
и нам нужно многократное из этого иона?:
если так, то:')(',⍺
подготовить струну к иону1⌽
циклически поворачивать на один шаг влево (ставит)
справа)⋄
еще⍺
вернуть ион немодифицированным∊
ε NLIST (Flatten)источник
C
208205175169 байтargv[1]
: cationargv[2]
: анионЗаряды ионов берут на стандартный ввод.
источник
Сетчатка ,
8680 байтСпасибо Нейлу за сохранение 6 байтов.
Попробуйте онлайн!
Входные данные разделены переводом строки (в тестовом наборе для удобства используется разделение запятыми).
объяснение
Мы начинаем с добавления
(
к каждой молекуле. В^
матчах на линию начала , потому чтоm)
к концу программы устанавливает многострочный режим для всех предыдущих этапов.Мы заменяем
^[-+]n
часть на)_
, а затемn
копируем1
(т.е. мы конвертируем заряды в одинарные, отбрасывая знаки).Этот этап выполняет три вещи: он делит оба заряда по их GCD, преобразует их обратно в десятичную и меняет их местами. GCD можно легко найти в регулярном выражении, сопоставив самое длинное,
1+
что позволяет сопоставить оба заряда, используя только обратную ссылку\1
. Чтобы разделить это, мы используем функцию «подсчета» Retina, которая сообщает нам, как часто используется группа. Таким образом,$#2
первый заряд делится на GCD, а$#3
второй заряд делится на GCD (оба в десятичном виде).Мы удаляем
_1
s с концов обеих частей.И мы убираем скобки из строк, оканчивающихся на a
)
(то есть тех, которые_1
там были), а также строк, которые содержат только один атом.Наконец, мы объединяем две молекулы, отбрасывая перевод строки.
источник
Haskell ,
10197 байтПопробуйте онлайн! Пример использования:
Fe^+3, O^-2
принимается как("Fe"#"O")3 2
.источник
Python 3 , 131 байт
Попробуйте онлайн!
Python 2 ,
196174170155149140136 байтовПопробуйте онлайн!
источник
Python 3 , 129 байт
Попробуйте онлайн!
Если нам нужно обработать отрицательные заряды анионов, то 153 байта:
Попробуйте онлайн!
источник
RPL (HP48 S / SX), 294,5 байта
Да, смехотворно большая подача, не уверен, насколько конкурентоспособной она будет ...
3 подпрограммы аккуратно упакованы в каталоге.
M
является основным. Он ожидает две строки в стеке, отформатированные в виде ионов, и помещает строку молекулы в стек.S
разделяет ион на заряд в виде числа, а формулу элемента - в виде строки. Например,"PO_4^-3"
будет взят из стека и-3
и"PO_4"
помещен в стек.J
объединяет число ионов с формулой и решает, следует ли заключить формулу в скобки. Предыдущий битELSE
имеет дело с 1 ионом, оставляя строку как есть. Например, если1
и"PO_4"
находятся в стеке, они заменяются на"PO_4"
.1
и"H"
дает"H"
.Остальное касается нескольких ионов; если это один атом, он не в скобках, иначе это так. Чтобы решить, так ли это, я проверяю длину строки и проверяю, является ли последний символ
>"Z"
. Булевы выражения возвращают 1 для истины и 0 для ложных. Вычитая результат этого сравнения из длины строки, я получаю 1 или меньше, когда это один атом, иначе больше: длина 1 - один атом; длина 2 будет иметь букву в качестве последнего символа; для одного атома это строчная буква, поэтому>"Z"
результат 1, в противном случае 2; длина 3 или более означает более 1 атома, а с 0 или 1, вычтенным из длины, результат будет не менее 2. Например,3
и"PO_4"
дает"(PO_4)_3"
.3
и"Al"
дает"Al_3"
.M
сначала расщепляет каждый ион с помощьюS
. После первой строки уровень 5 стека (т.е. самый глубокий объект захоронения) содержит заряд второго иона, формулу второго иона уровня 4, формулу первого иона уровня 3, абсолютное значение уровня 2 заряда первого иона и абсолютное значение уровня 1 заряда второго иона снова. Например, если данные ионы на стеке"Al^+3"
,"SO_4^-2"
мы получаем-2
,"SO_4"
,"Al"
,3
,2
.Вторая строка вычисляет gcd из 2 зарядов (оставляя заряды без изменений).
Третья строка делит каждый заряд на gcd (для расчета кратных) и соединяет его с помощью формулы иона с помощью
J
. Таким образом, у нас есть две строки, каждая с одним данным ионом с удаленным зарядом (или кратным ему), а за ним похоронен заряд второго. Так , например,-2
,"Al_2"
,"(SO_4)_3"
(-2 это заряд SO_4).Четвертая строка не скрывает заряд, и, если он положительный, он меняет две строки (так, чтобы катион был первым), прежде чем присоединиться к ним. Таким образом , в приведенном выше примере, потому что он отрицательный, они соединяются в порядке , как они:
"Al_2(SO_4)_3"
.источник
JavaScript, 145 байт
Принимает аргументы
c
катион,a
анион,p
положительный заряд,n
отрицательный заряд.источник