Codeium Golfide

28

В этой задаче ваша задача - взять анион и катион и вывести химическую формулу соединения. Вход следует этим правилам:

  • Возьмите в 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

Поскольку это , выигрывает самый короткий ответ в байтах.

Нисса
источник
3
Рекомендуемый контрольный пример: Fe^+2, OH^-1: Fe(OH)_2для многоатомного иона с 1 каждым элементом ( OH^-1).
pizzapants184
1
@ Адам второй ион заряжен: NO_3^-1. Кроме того, еще один тестовый пример должен быть первым в паре с a ^-2, чтобы он получился (C(NH_2)_3)_2.... Или случай, когда ион, который нужен более одного раза, начинается со скобки.
Heimdall
1
@ Adám Fe_4(Fe(CN)_6)_3для прусского голубого.
Колера Су
3
Это может быть самый забавный заголовок, который я когда-либо видел на этом сайте, и это многое говорит о ppcg-вопросе. Спасибо за хороший смех
osuka_
1
@osuka_ Вы видели "каков самый быстрый способ убить мою семью" на Аркаде? Или мой другой вызов PPCG, «подтвердить иллюминатов»?
Нисса

Ответы:

4

APL (Дьялог) , 60 59 61 байт

+2, так как обвинения должны быть подписаны.

Анонимная инфиксная функция. Принимает список ионов (анион, катион) в качестве левого аргумента и список соответствующих зарядов в качестве правого аргумента.

{∊(⍺{⍵∧1<≢⍺∩⎕D,⎕A:1')(',⍺⋄⍺}¨m),¨(ms1)/¨'_',∘⍕¨s←⍵÷⍨∧/⍵}∘|

Попробуйте онлайн!

{}∘| Функция где левый аргумент и величина правого аргумента:

∧/⍵ LCM сборов

⍵÷⍨ разделите расходы на это

s← хранить в s(для з ubscripts)

'_',∘⍕¨ форматировать (stringify) и ставить перед каждой чертой

()/ Повторить каждую букву каждой с соответствующим значением из:

  s≠1 Отличается sот 1? (дает 1 или 0)

  m← магазин в m(для м ультипл)

(),¨ Добавьте к ним следующее соответственно:

  ⍺{}¨m Для каждого вызовите эту функцию с ионами и в mкачестве аргументов:

   ⎕D,⎕AD igits с последующим прописной lphabet

   ⍺∩ пересечение иона и что

    подсчитать количество символов в этом

   1< Один меньше этого? (т.е. есть ли у нас многоэлементный ион?)

   ⍵∧ и нам нужно многократное из этого иона?

   : если так, то:

    ')(',⍺ подготовить струну к иону

    1⌽ циклически поворачивать на один шаг влево (ставит )справа)

    еще

     вернуть ион немодифицированным

ε NLIST (Flatten)

Адам
источник
6

C 208 205 175 169 байт

argv[1]: cation
argv[2]: анион
Заряды ионов берут на стандартный ввод.

#define z(b)for(i=*++v;*++i>95;);printf(b>1?*i?"(%s)_%d":"%s_%d":"%s",*v,b);
main(c,v,d,e,g,h,i)char**v,*i;{scanf("%d%d",&c,&d);for(e=c,h=-d;g=h;e=g)h=e%g;z(-d/e)z(c/e)}
Колера Су
источник
ОП указанным ионам можно задавать в любом порядке.
Heimdall
6

Сетчатка , 86 80 байт

Спасибо Нейлу за сохранение 6 байтов.

^
(
\^.+
)_$&$*
(1+)(\1|¶.+)+_(\1)+$
$#3$2_$#2
_1$

m)T`()``.+\)$|\(.[a-z]?\)
¶

Попробуйте онлайн!

Входные данные разделены переводом строки (в тестовом наборе для удобства используется разделение запятыми).

объяснение

^
(

Мы начинаем с добавления (к каждой молекуле. В ^матчах на линию начала , потому что m)к концу программы устанавливает многострочный режим для всех предыдущих этапов.

\^.+
)_$&$*

Мы заменяем ^[-+]nчасть на )_, а затем nкопируем 1(т.е. мы конвертируем заряды в одинарные, отбрасывая знаки).

(1+)(\1|¶.+)+_(\1)+$
$#3$2_$#2

Этот этап выполняет три вещи: он делит оба заряда по их GCD, преобразует их обратно в десятичную и меняет их местами. GCD можно легко найти в регулярном выражении, сопоставив самое длинное, 1+что позволяет сопоставить оба заряда, используя только обратную ссылку \1. Чтобы разделить это, мы используем функцию «подсчета» Retina, которая сообщает нам, как часто используется группа. Таким образом, $#2первый заряд делится на GCD, а $#3второй заряд делится на GCD (оба в десятичном виде).

_1$

Мы удаляем _1s с концов обеих частей.

m)T`()``.+\)$|\(.[a-z]?\)

И мы убираем скобки из строк, оканчивающихся на a )(то есть тех, которые _1там были), а также строк, которые содержат только один атом.

Наконец, мы объединяем две молекулы, отбрасывая перевод строки.

Мартин Эндер
источник
2

Python 3 , 129 байт

lambda E,e,I,i,m=lambda e,i:(len(e)>2<=i)*"("+e+(len(e)>2<=i)*")"+"_%d"%i*(i>1):m(E,i/gcd(i,I))+m(e,I/gcd(i,I))
from math import*

Попробуйте онлайн!


Если нам нужно обработать отрицательные заряды анионов, то 153 байта:

lambda E,e,I,i,a=abs,m=lambda e,i:(len(e)>2<=i)*"("+e+(len(e)>2<=i)*")"+"_%d"%i*(i>1):m(E,a(i)/gcd(a(i),a(I)))+m(e,a(I)/gcd(a(i),a(I)))
from math import*

Попробуйте онлайн!

Мистер Xcoder
источник
2

RPL (HP48 S / SX), 294,5 байта

Да, смехотворно большая подача, не уверен, насколько конкурентоспособной она будет ...

DIR
  M
    « S ROT S SWAP ABS 4 PICK ABS
      DUP2 WHILE DUP2 REPEAT MOD SWAP END DROP2
      SWAP OVER / 4 ROLL J 3 ROLLD / ROT J
      ROT 0 > IF THEN SWAP END + »
  S
    « DUP "^" POS DUP2 1 + OVER SIZE SUB OBJ🡢
      3 ROLLD 1 - 1 SWAP SUB »
  J
    IF OVER 1 ==
    THEN SWAP DROP
    ELSE DUP SIZE DUP2 DUP SUB "Z" > - 1 >
      IF
      THEN "(" SWAP + ")" +
      END
      "_" + SWAP +
    END
END

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".

Хеймдалль
источник
1

JavaScript, 145 байт

(c,a,p,n,g=(a,b)=>b?g(b,a%b):a)=>`(${c})_${n/-g(p,-n)}(${a})_${p/g(p,-n)}`.replace(/\(((\w+)\)(?=_1)|([A-Z][a-z]*)\))/g,"$2$3").replace(/_1/g,"")

Принимает аргументы cкатион, aанион, pположительный заряд, nотрицательный заряд.

ericw31415
источник