Кодіум Гольфід


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(для s підписок)

'_',∘⍕¨ формат (розшифруйте) та додайте підрядний знак до кожного

()/ Копіювати кожну букву кожної з відповідним значенням з:

  s≠1 Чи sвідрізняється від 1? (дає 1 або 0)

  m← зберігати в m(для м ultiple)

(),¨ Додайте наступні відповідно до таких:

  ⍺{}¨m Для кожного називайте цю функцію іонами та mяк аргументи:

   ⎕D,⎕AD загорається з наступним великим буквою A lphabet

   ⍺∩ перетин іона та того

    підрахуйте кількість символів у цьому

   1< Це один менше, ніж це? (тобто у нас є багатоелементний іон?)

   ⍵∧ і чи потрібен нам кратний цей іон?

   : якщо так, то:

    ')(',⍺ додайте рядок до іона

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

    ще

     повернути іон немодифікованим

ϵ список (згладити)


6

C, 208 205 175 169 байт

argv[1]: катіон
argv[2]: аніон
Заряди іонів приймаються на stdin.

#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)}

Зазначені ОП іони можуть бути задані в будь-якому порядку.
Хеймдалл

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, перетворює їх назад на десяткові та замінює їх. У Gge можна легко знайти Gge, зіставивши найдовший, 1+який дозволяє нам порівнювати обидва заряди, використовуючи лише зворотну референцію \1. Для поділу на це ми використовуємо функцію "кількість підхоплення" Retina, яка повідомляє нам про те, як часто використовується група. Таким чином $#2, перший заряд ділиться на GCD і $#3другий заряд ділиться на GCD (обидва в десятковій).

_1$

Видаляємо _1s кінці обох частин.

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

І ми скидаємо круглі дужки з рядків, які закінчуються на )(тобто з тих, які були _1там), а також з рядків, що містять лише один атом.

Нарешті, ми поєднуємо дві молекули, скидаючи лінійку.



2

Python 3 , 131 байт

lambda c,a,C,A:g(c,A/gcd(C,A))+g(a,C/gcd(C,A))
from math import*
g=lambda s,n:[s,[s,'(%s)'%s][sum(c<'`'for c in s)>1]+'_%d'%n][n>1]

Спробуйте в Інтернеті!

Пітон 2 , 196 174 170 155 149 140 136 байт

lambda c,a,C,A:g(c,A/gcd(C,A))+g(a,C/gcd(C,A))
from fractions import*
g=lambda s,n:[s,[s,'(%s)'%s][sum(c<'`'for c in s)>1]+'_'+`n`][n>1]

Спробуйте в Інтернеті!


Python 3 на 131 байт
pizzapants184

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*

Спробуйте в Інтернеті!


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є основним. Він очікує 2 рядки на стеку, форматованих у вигляді іонів, і натискає на стек молекули.

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 з двох зарядів (залишаючи заряди недоторканими).

Третій рядок ділить кожен заряд на 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негативний заряд.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.