Codeium Golfide

28

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_4oder Al.
  • 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äre Fe_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 , die kürzeste Antwort in Bytes gewinnt.

Nissa
quelle
3
Empfohlener Testfall: Fe^+2, OH^-1: Fe(OH)_2Für ein mehratomiges Ion mit 1 Element pro Element ( OH^-1).
Pizzapants184
1
@ Adám zweite Ionen geladen: 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.
Heimdall
1
@Adám Fe_4(Fe(CN)_6)_3für preußisch blau.
Colera So
3
Dies könnte der lustigste Herausforderungstitel sein, den ich bisher auf dieser Website gesehen habe, und das sagt viel für eine PPCG-Frage aus. Vielen Dank für das gute Lachen
osuka_
1
@osuka_ Hast du bei Arqade gesehen, wie ich meine Familie am schnellsten töte? Oder meine andere PPCG-Herausforderung "Illuminati bestätigen"?
Nissa

Antworten:

4

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.

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

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 das

s← store in s(für s ubscripts)

'_',∘⍕¨ formatieren (stringify) und voranstellen

()/ Wiederholen Sie jeden Buchstaben mit dem entsprechenden Wert von:

  s≠1 Ist sanders 1? (gibt 1 oder 0)

  m← Speichern in m(für m ultiple)

(),¨ Denen jeweils Folgendes voranstellen:

  ⍺{... }¨m für jede, bezeichnen diese Funktion mit Ionen und mals Argument:

   ⎕D,⎕AD igits gefolgt von A lphabet in Großbuchstaben

   ⍺∩ Schnittpunkt von Ion und dem

    stimmen Sie mit der Anzahl der Zeichen überein

   1< 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 Ion

    1⌽ zyklisch einen Schritt nach links drehen ( )rechts setzen)

    sonst

     gib das Ion unverändert zurück

ϵ nlist (Abflachen)

Adam
quelle
6

C 208 205 175 169 Bytes

argv[1]: Kation
argv[2]: Anion
Ionen werden über Stdin geladen.

#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)}
Colera Su
quelle
OP angegeben die Ionen können in beliebiger Reihenfolge angegeben werden.
Heimdall
6

Retina , 86 80 Bytes

Vielen Dank an Neil für das Speichern von 6 Bytes.

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

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

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, da m)gegen Ende des Programms der Multiline-Modus für alle vorhergehenden Phasen festgelegt wird.

\^.+
)_$&$*

Wir ersetzen das ^[-+]nTeil durch )_, gefolgt von nKopien von 1(dh wir wandeln die Gebühren in unäre um und lassen die Zeichen fallen).

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

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 $#2also die erste Ladung geteilt durch die GCD und $#3ist die zweite Ladung geteilt durch die GCD (beide in Dezimalzahl).

_1$

Wir entfernen _1s von den Enden beider Teile.

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

Und wir lassen die Klammern von Zeilen, die auf a enden )(dh die, die ein _1dort 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.

Martin Ender
quelle
3

Haskell , 101 bis 97 Bytes

(s#t)n m|let x#i|j<-div(lcm n m)i=l$x:[l(x:['(':x++")"|l x<':'])++'_':show j|j>1]=s#n++t#m
l=last

Probieren Sie es online! Anwendungsbeispiel: Fe^+3, O^-2wird als genommen ("Fe"#"O")3 2.

Laikoni
quelle
2

Python 3 , 131 Bytes

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]

Probieren Sie es online!

Python 2 , 196 174 170 155 149 140 136 Bytes

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]

Probieren Sie es online!

TFeld
quelle
Python 3 für 131 Bytes
Pizzapants184
2

Python 3 , 129 Bytes

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*

Probieren Sie es online!


Wenn wir mit negativen Ladungen der Anionen umgehen müssen, dann 153 Bytes:

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*

Probieren Sie es online!

Mr. Xcoder
quelle
2

RPL (HP48 S / SX), 294,5 Byte

Ja, lächerlich große Einreichung, nicht sicher, wie wettbewerbsfähig es sein wird ...

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 Routinen ordentlich in ein Verzeichnis gepackt. Mist der wichtigste. Es werden 2 Strings auf dem Stapel erwartet, die als Ionen formatiert sind, und ein Molekülstring wird auf den Stapel geschoben.

Steilt das Ion als Zahl in Ladung und die Elementformel als Zeichenfolge auf. Zum Beispiel "PO_4^-3"würde aus dem Stapel genommen und -3und "PO_4"auf den Stapel geschoben.

JVerbindet die Anzahl der Ionen mit der Formel und entscheidet, ob die Formel in Klammern eingeschlossen wird. Das Bit davor ELSEbehandelt 1 Ion, wobei die Zeichenfolge unverändert bleibt. Wenn sich beispielsweise 1und "PO_4"auf dem Stapel befinden, werden sie durch ersetzt "PO_4". 1und "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 Beispiel 3und "PO_4"ergibt "(PO_4)_3". 3und "Al"gibt "Al_3".

Mteilt zuerst jedes Ion mit S. 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".

Heimdall
quelle
1

JavaScript, 145 Bytes

(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,"")

Argumentiert cwird, ist Kation, aist Anion, pist positive Ladung, nist negative Ladung.

ericw31415
quelle