W tym wyzwaniu Twoim zadaniem jest zabranie anionu i kationu i dostarczenie wzoru chemicznego związku. Dane wejściowe są zgodne z następującymi zasadami:
- Objąć 2 łańcuchów (w dowolnej kolejności) reprezentujących anionu i kationu, na przykład
F
,NH_4
, lubAl
. - Aby przejąć kontrolę nad każdym jonem, możesz albo umieścić go jako część łańcucha oddzielonego znakiem karetki (np.
F^-1
), Albo wziąć dodatkowe argumenty liczbowe.- Uwaga: tak długo, jak długo wprowadzany jest typ numeryczny, ładunek anionu będzie przekazywany jako liczba ujemna.
- Symbole zawsze będą prawdziwe, a opłaty dokładne.
Dane wyjściowe powinny być zgodne z następującymi regułami:
- Użyj
_
dla indeksów dolnych: byłoby Fe 2 O 3Fe_2O_3
. - Najpierw kation: NaCl, a nie ClNa.
- Cząsteczka neutralna: Li 2 O, nie LiO ani LiO - .
- Najniższe możliwe współczynniki: Fe 2 O 3 , a nie Fe 4 O 6 .
- Brak indeksów dolnych: NaCl, nie Na 1 Cl 1 .
- Bez zmian: NH 4 OH, nie NH 5 O.
- Nawiasy warunkowe:
- Nie należy stosować w nawiasach na jon pojedynczego atomu: MgCl 2 , nie mg (Cl) 2 .
- Nie używaj nawiasów, jeśli na cząsteczkę przypada tylko jeden jon: KClO 3 , a nie K (ClO 3 ).
- NALEŻY używać nawiasów, jeśli występują dwa lub więcej jonów wieloatomowych: Be 3 (PO 4 ) 2 , a nie Be 3 PO 4 2 lub Be 3 P 2 O 8 .
Oto kilka dodatkowych przykładowych danych wejściowych i wyjściowych:
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
Ponieważ jest to gra w golfa , wygrywa najkrótsza odpowiedź w bajtach.
Fe^+2, OH^-1: Fe(OH)_2
dla jonu poliatomowego z 1 każdego elementu (OH^-1
).NO_3^-1
. Również inny przypadek testowy powinien być pierwszy w połączeniu z^-2
, więc tak by się stało(C(NH_2)_3)_2...
. Lub przypadek, w którym jon, który jest potrzebny więcej niż jeden raz, zaczyna się od wspornika.Fe_4(Fe(CN)_6)_3
dla pruskiego błękitu.Odpowiedzi:
APL (Dyalog) ,
605961 bajtów+2, ponieważ opłaty muszą być podpisane.
Anonimowa funkcja poprawki. Pobiera listę jonów (anion, kation) jako lewy argument i listę odpowiadających ładunków jako prawy argument.
Wypróbuj online!
{
…}∘|
Funkcja, w której⍺
argument jest lewy, a⍵
wielkość argumentu prawy:∧/⍵
LCM opłat⍵÷⍨
podziel przez to opłatys←
przechowuj ws
(dla s skryptu)'_',∘⍕¨
sformatuj (stringify) i wstaw do każdego z nich podkreślenie(
…)/
Powiel każdą literę z odpowiednią wartością z:s≠1
Czys
różni się od1
? (daje 1 lub 0)m←
przechowuj wm
(dla m ultiple)(
…),¨
Dołącz odpowiednio następujące:⍺{
…}¨m
Dla każdego wywołaj tę funkcję z jonami im
jako argumentami:⎕D,⎕A
D igits następnie wielkie lphabet⍺∩
przecięcie jonu i tamto≢
oblicz liczbę znaków w tym1<
Czy jest jeden mniej niż to? (tj. czy mamy jon wieloelementowy?)⍵∧
i czy potrzebujemy wielokrotności tego jonu?:
jeśli tak, to:')(',⍺
przyłóż łańcuch do jonu1⌽
cyklicznie obracaj jeden krok w lewo (kładzie)
się po prawej)⋄
jeszcze⍺
zwróć jon niezmodyfikowany∊
ε nlist (spłaszczyć)źródło
C
208205175169 bajtówargv[1]
: kationargv[2]
: anionŁadunki jonów są pobierane na standardowe stdin.
źródło
Siatkówka ,
8680 bajtówDzięki Neil za oszczędność 6 bajtów.
Wypróbuj online!
Dane wejściowe są oddzielone od linii (zestaw testowy wykorzystuje separację przecinkową dla wygody).
Wyjaśnienie
Zaczynamy od przygotowania
(
do każdej cząsteczki. Te^
mecze na linii początków ponieważm)
kierunku końca programu ustawia tryb wielowierszowego na wszystkich poprzednich etapach.Zamieniamy
^[-+]n
część na)_
, a następnien
kopie1
(tj. Przekształcamy opłaty na jednostkowe, zrzucając znaki).Ten etap robi trzy rzeczy: dzieli oba ładunki przez ich GCD, konwertuje je z powrotem na dziesiętne i zamienia. GCD można dość łatwo znaleźć w wyrażeniu regularnym, dopasowując najdłuższy,
1+
który pozwala dopasować oba ładunki przy użyciu tylko referencji wstecznej\1
. Aby to podzielić, korzystamy z funkcji „liczby przechwytywania” Retiny, która mówi nam, jak często grupa była używana. Podobnie$#2
jest z pierwszym ładunkiem podzielonym przez GCD i$#3
drugim ładunkiem podzielonym przez GCD (oba w systemie dziesiętnym).Usuwamy
_1
s z końców obu części.I usuwamy nawiasy z linii, które kończą się na a
)
(tj. Tych, które miały_1
tam), a także linii, które zawierają tylko jeden atom.Na koniec łączymy dwie cząsteczki przez upuszczenie linii.
źródło
Haskell ,
10197 bajtówWypróbuj online! Przykładowe użycie:
Fe^+3, O^-2
przyjmuje się jako("Fe"#"O")3 2
.źródło
Python 3 , 131 bajtów
Wypróbuj online!
Python 2 ,
196174170155149140136 bajtówWypróbuj online!
źródło
Python 3 , 129 bajtów
Wypróbuj online!
Jeśli musimy poradzić sobie z ujemnymi ładunkami anionów, to 153 bajty:
Wypróbuj online!
źródło
RPL (HP48 S / SX), 294,5 bajtów
Tak, absurdalnie duże zgłoszenie, nie jestem pewien, czy będzie konkurencyjne ...
3 procedury starannie zapakowane w katalogu.
M
jest główny. Oczekuje 2 łańcuchów na stosie sformatowanych jako jony i popycha łańcuch cząsteczek na stos.S
dzieli jon na ładunek jako liczbę, a formułę elementu jako ciąg. Na przykład"PO_4^-3"
byłby wzięty ze stosu-3
i"PO_4"
wrzucony na stos.J
łączy liczbę jonów ze wzorem i decyduje, czy zawinąć wzór w nawiasy. Trochę wcześniejELSE
dotyczy 1 jonu, pozostawiając ciąg bez zmian. Na przykład, jeśli1
i"PO_4"
są na stosie, są one zastępowane przez"PO_4"
.1
i"H"
daje"H"
.Reszta dotyczy wielu jonów; jeśli jest to pojedynczy atom, nie ma go w nawiasach, w przeciwnym razie jest. Aby zdecydować, czy tak jest, sprawdzam długość łańcucha i sprawdzam, czy jest to ostatni znak
>"Z"
. Wyrażenia logiczne zwracają 1 dla wartości true i 0 dla wartości false. Odejmując wynik tego porównania od długości łańcucha, otrzymuję 1 lub mniej, gdy jest to pojedynczy atom, w przeciwnym razie więcej: długość 1 to pojedynczy atom; długość 2 będzie miała literę jako ostatni znak; dla pojedynczego atomu jest to mała litera, więc>"Z"
wynik 1, w przeciwnym razie 2; długość 3 lub więcej oznacza więcej niż 1 atom, a po odjęciu 0 lub 1 od długości wynik będzie wynosił co najmniej 2. Na przykład3
i"PO_4"
daje"(PO_4)_3"
.3
i"Al"
daje"Al_3"
.M
najpierw dzieli każdy jon za pomocąS
. Po pierwszym wierszu poziom 5 stosu (czyli najgłębiej zakopanego obiektu) zawiera ładunek drugiego jonu, wzór drugiego jonu poziomu 4, wzór pierwszego jonu poziomu 3, wartość bezwzględna poziomu 2 ładunku pierwszego jonu i wartość bezwzględna poziomu 1 ponownie ładunku drugiego jonu. Na przykład, jeśli podane jony są na stosie"Al^+3"
,"SO_4^-2"
otrzymujemy-2
,"SO_4"
,"Al"
,3
,2
.Druga linia oblicza gcd z 2 opłat (pozostawiając nienaruszone opłaty).
Trzecia linia dzieli każdy ładunek przez gcd (w celu obliczenia wielokrotności) i łączy go ze wzorem jonów za pomocą
J
. Mamy więc dwa łańcuchy, każdy z jednym danym jonem z usuniętym ładunkiem (lub jego wielokrotnością) i ładunkiem drugiego z nich zakopany za nimi. Na przykład-2
,"Al_2"
,"(SO_4)_3"
(-2 to ładunek SO_4).Czwarta linia rozładowuje ładunek, a jeśli jest dodatnia, zamienia dwa łańcuchy (tak, aby kation był pierwszy) przed dołączeniem do nich. Tak więc w powyższym przykładzie, bo to negatywne, są one połączone w kolejności są:
"Al_2(SO_4)_3"
.źródło
JavaScript, 145 bajtów
Bierze argumenty, że
c
jest kationem,a
jest anionem,p
jest ładunkiem dodatnim,n
jest ładunkiem ujemnym.źródło