In dieser Herausforderung besteht Ihre Aufgabe darin, ein Anion und ein Kation aufzunehmen und die chemische Formel der Verbindung auszugeben. Die Eingabe folgt diesen Regeln:
- Nehmen in 2 Strings (in beliebiger Reihenfolge) , die das Anion und Kation, zB
F
,NH_4
oderAl
. - Um die Ladung jedes Ions aufzunehmen, können Sie es entweder als Teil des Strings durch ein Caret (z. B.
F^-1
) trennen lassen oder zusätzliche numerische Argumente eingeben.- Hinweis: Solange Ihr numerischer Eingabetyp signiert ist, wird die Ladung des Anions als negative Zahl übergeben.
- Die Symbole sind immer echt und die Gebühren sind korrekt.
Die Ausgabe sollte diesen Regeln folgen:
- Verwendung
_
für Indizes: Fe 2 O 3 wäreFe_2O_3
. - Kation zuerst: NaCl, nicht ClNa.
- Neutrales Molekül: Li 2 O, nicht LiO oder LiO - .
- Niedrigstmögliche Koeffizienten: Fe 2 O 3 , nicht Fe 4 O 6 .
- Keine tiefgestellten: NaCl, nicht Na 1 Cl 1 .
- Keine Verschiebung: NH 4 OH, nicht NH 5 O.
- Bedingte Klammern:
- Verwenden Sie keine Klammern an einem einzelnen Atom: MgCl 2 , nicht Mg (Cl) 2 .
- Verwenden Sie keine Klammern, wenn nur eines der Ionen pro Molekül vorhanden ist: KClO 3 , nicht K (ClO 3 ).
- Verwenden Sie keine Klammern, wenn zwei oder mehr mehratomige Ionen vorhanden sind: Be 3 (PO 4 ) 2 , nicht Be 3 PO 4 2 oder Be 3 P 2 O 8 .
Hier sind einige zusätzliche Beispieleingaben und -ausgaben:
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
Da es sich um Code-Golf , die kürzeste Antwort in Bytes gewinnt.
Fe^+2, OH^-1: Fe(OH)_2
Für ein mehratomiges Ion mit 1 Element pro Element (OH^-1
).NO_3^-1
. Auch ein weiterer Testfall sollte der erste sein, der mit einem gepaart ist^-2
, damit es klappt(C(NH_2)_3)_2...
. Oder ein Fall, in dem das Ion, das mehr als einmal benötigt wird, mit einer Klammer beginnt.Fe_4(Fe(CN)_6)_3
für preußisch blau.Antworten:
APL (Dyalog) ,
60,59,61 Bytes+2 da Gebühren unterschrieben angegeben werden müssen.
Anonyme Infix-Funktion. Nimmt die Liste der Ionen (Anion, Kation) als linkes Argument und die Liste der entsprechenden Ladungen als rechtes Argument.
Probieren Sie es online!
{
…}∘|
Funktion, bei der⍺
das linke Argument und⍵
die Größe des rechten Arguments angegeben sind:∧/⍵
LCM der Gebühren⍵÷⍨
Teilen Sie die Gebühren durch dass←
store ins
(für s ubscripts)'_',∘⍕¨
formatieren (stringify) und voranstellen(
…)/
Wiederholen Sie jeden Buchstaben mit dem entsprechenden Wert von:s≠1
Ists
anders1
? (gibt 1 oder 0)m←
Speichern inm
(für m ultiple)(
…),¨
Denen jeweils Folgendes voranstellen:⍺{
...}¨m
für jede, bezeichnen diese Funktion mit Ionen undm
als Argument:⎕D,⎕A
D igits gefolgt von A lphabet in Großbuchstaben⍺∩
Schnittpunkt von Ion und dem≢
stimmen Sie mit der Anzahl der Zeichen überein1<
Ist man weniger als das? (dh haben wir ein Multi-Element-Ion?)⍵∧
Und brauchen wir ein Vielfaches dieses Ions?:
wenn ja, dann:')(',⍺
Stellen Sie die Zeichenfolge vor das Ion1⌽
zyklisch einen Schritt nach links drehen ()
rechts setzen)⋄
sonst⍺
gib das Ion unverändert zurück∊
ϵ nlist (Abflachen)quelle
C
208205175169 Bytesargv[1]
: Kationargv[2]
: AnionIonen werden über Stdin geladen.
quelle
Retina ,
8680 BytesVielen Dank an Neil für das Speichern von 6 Bytes.
Probieren Sie es online!
Die Eingabe erfolgt durch Zeilenvorschub getrennt (die Testsuite verwendet zur Vereinfachung die Kommatrennung).
Erläuterung
Wir beginnen, indem wir
(
jedem Molekül ein voranstellen . Die^
Übereinstimmungen beginnen online, dam)
gegen Ende des Programms der Multiline-Modus für alle vorhergehenden Phasen festgelegt wird.Wir ersetzen das
^[-+]n
Teil durch)_
, gefolgt vonn
Kopien von1
(dh wir wandeln die Gebühren in unäre um und lassen die Zeichen fallen).In dieser Phase werden drei Dinge ausgeführt: Beide Ladungen werden durch ihre GCD geteilt, in Dezimalzahlen zurückgewandelt und ausgetauscht. Die GCD kann in
1+
regulären Ausdrücken leicht gefunden werden, indem die längste angeglichen wird, mit der beide Gebühren nur unter Verwendung der Rückreferenz angeglichen werden\1
. Um dies zu teilen, verwenden wir die "Capture Count" -Funktion von Retina, die uns sagt, wie oft eine Gruppe verwendet wurde. Ist$#2
also die erste Ladung geteilt durch die GCD und$#3
ist die zweite Ladung geteilt durch die GCD (beide in Dezimalzahl).Wir entfernen
_1
s von den Enden beider Teile.Und wir lassen die Klammern von Zeilen, die auf a enden
)
(dh die, die ein_1
dort hatten), sowie von Zeilen, die nur ein einzelnes Atom enthalten, fallen.Schließlich verknüpfen wir die beiden Moleküle, indem wir den Zeilenvorschub löschen.
quelle
Haskell ,
101 bis97 BytesProbieren Sie es online! Anwendungsbeispiel:
Fe^+3, O^-2
wird als genommen("Fe"#"O")3 2
.quelle
Python 3 , 131 Bytes
Probieren Sie es online!
Python 2 ,
196174170155149140136 BytesProbieren Sie es online!
quelle
Python 3 , 129 Bytes
Probieren Sie es online!
Wenn wir mit negativen Ladungen der Anionen umgehen müssen, dann 153 Bytes:
Probieren Sie es online!
quelle
RPL (HP48 S / SX), 294,5 Byte
Ja, lächerlich große Einreichung, nicht sicher, wie wettbewerbsfähig es sein wird ...
3 Routinen ordentlich in ein Verzeichnis gepackt.
M
ist der wichtigste. Es werden 2 Strings auf dem Stapel erwartet, die als Ionen formatiert sind, und ein Molekülstring wird auf den Stapel geschoben.S
teilt das Ion als Zahl in Ladung und die Elementformel als Zeichenfolge auf. Zum Beispiel"PO_4^-3"
würde aus dem Stapel genommen und-3
und"PO_4"
auf den Stapel geschoben.J
Verbindet die Anzahl der Ionen mit der Formel und entscheidet, ob die Formel in Klammern eingeschlossen wird. Das Bit davorELSE
behandelt 1 Ion, wobei die Zeichenfolge unverändert bleibt. Wenn sich beispielsweise1
und"PO_4"
auf dem Stapel befinden, werden sie durch ersetzt"PO_4"
.1
und"H"
gibt"H"
.Der Rest beschäftigt sich mit mehreren Ionen; Wenn es ein einzelnes Atom ist, steht es nicht in Klammern, sonst ist es es. Um zu entscheiden, ob dies der Fall ist, überprüfe ich die Länge der Zeichenfolge und das letzte Zeichen
>"Z"
. Boolesche Ausdrücke geben 1 für wahr und 0 für falsch zurück. Wenn Sie das Ergebnis dieses Vergleichs von der Länge der Zeichenfolge subtrahieren, erhalte ich 1 oder weniger, wenn es sich um ein einzelnes Atom handelt, andernfalls mehr: Länge 1 ist ein einzelnes Atom; Länge 2 hat einen Buchstaben als letztes Zeichen; Für ein einzelnes Atom ist es in Kleinbuchstaben, also>"Z"
ergibt sich 1, andernfalls 2; Länge 3 oder mehr bedeutet mehr als 1 Atom, und wenn 0 oder 1 von der Länge abgezogen wird, ist das Ergebnis mindestens 2. Zum Beispiel3
und"PO_4"
ergibt"(PO_4)_3"
.3
und"Al"
gibt"Al_3"
.M
teilt zuerst jedes Ion mitS
. Nach der ersten Zeile enthält die Ebene 5 des Stapels (also das tiefste vergrabene Objekt) die Ladung des zweiten Ions, die Formel des zweiten Ions der Ebene 4, die Formel des ersten Ions der Ebene 3, den Absolutwert der Ladung des ersten Ions der Ebene 2 und den Absolutwert der Ebene 1 der Ladung des zweiten Ions wieder. Wenn beispielsweise gegeben Ionen auf dem Stapel sind"Al^+3"
,"SO_4^-2"
bekommen wir-2
,"SO_4"
,"Al"
,3
,2
.Die zweite Zeile berechnet den GCD der 2 Ladungen (wobei die Ladungen intakt bleiben).
Die dritte Zeile teilt jede Ladung durch den GCD (um die Vielfachen zu berechnen) und verbindet sie mit der Formel des Ions unter Verwendung von
J
. Wir haben also zwei Ketten mit jeweils einem bestimmten Ion, wobei die Ladung entfernt wurde (oder ein Vielfaches davon), und eine Ladung des zweiten ist dahinter vergraben. Zum Beispiel-2
,"Al_2"
,"(SO_4)_3"
(-2 ist die Ladung von SO_4).Die vierte Linie trennt die Ladung und vertauscht, wenn sie positiv ist, die beiden Saiten (so dass das Kation an erster Stelle steht), bevor sie zusammengefügt werden. So in obigem Beispiel, weil es negativ ist , werden sie in der Reihenfolge verbunden , wie sie sind:
"Al_2(SO_4)_3"
.quelle
JavaScript, 145 Bytes
Argumentiert
c
wird, ist Kation,a
ist Anion,p
ist positive Ladung,n
ist negative Ladung.quelle