Dans ce défi, votre tâche consiste à prendre un anion et un cation et à produire la formule chimique du composé. L'entrée suit ces règles:
- Prendre en 2 chaînes (dans un ordre quelconque) représentant l'anion et cation, par exemple
F
,NH_4
ouAl
. - Pour prendre en charge chaque ion, vous pouvez soit l'avoir dans le cadre de la chaîne séparée par un caret (par exemple
F^-1
) ou prendre des arguments numériques supplémentaires.- Remarque: Tant que votre type d'entrée numérique est signé, la charge de l'anion sera transmise sous forme de nombre négatif.
- Les symboles seront toujours réels et les charges précises.
La sortie doit suivre ces règles:
- Utilisation
_
pour les indices: Fe 2 O 3 seraitFe_2O_3
. - Cation d'abord: NaCl, pas ClNa.
- Molécule neutre: Li 2 O, pas LiO ou LiO - .
- Coefficients les plus bas possibles: Fe 2 O 3 , pas Fe 4 O 6 .
- Aucun indice: NaCl, pas Na 1 Cl 1 .
- Pas de décalage: NH 4 OH, pas NH 5 O.
- Parenthèses conditionnelles:
- N'utilisez pas de parenthèses sur un ion à un seul atome: MgCl 2 , pas Mg (Cl) 2 .
- N'utilisez pas de parenthèses s'il n'y a qu'un seul des ions par molécule: KClO 3 , pas K (ClO 3 ).
- UTILISER des parenthèses s'il y a deux ou plus d'un ion polyatomique: être 3 (PO 4 ) 2 , pas être 3 PO 4 2 ou être 3 P 2 O 8 .
Voici quelques exemples d'entrées et de sorties supplémentaires:
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
Puisqu'il s'agit de code-golf , la réponse la plus courte en octets l'emporte.
Fe^+2, OH^-1: Fe(OH)_2
pour un ion polyatomique avec 1 de chaque élément (OH^-1
).NO_3^-1
. Un autre cas de test devrait également être le premier couplé avec un^-2
, donc cela ferait l'affaire(C(NH_2)_3)_2...
. Ou un cas où l'ion dont vous avez besoin plus d'une fois commence par un support.Fe_4(Fe(CN)_6)_3
pour le bleu de Prusse.Réponses:
APL (Dyalog) ,
605961 octets+2 car les charges doivent être données signées.
Fonction d'infixation anonyme. Prend la liste des ions (anion, cation) comme argument de gauche et la liste des charges correspondantes comme argument de droite.
Essayez-le en ligne!
{
…}∘|
Fonction où⍺
est l'argument gauche et⍵
la magnitude de l'argument droit:∧/⍵
LCM des charges⍵÷⍨
diviser les frais par celuis←
stocker danss
(pour les scripts)'_',∘⍕¨
formater (stringify) et ajouter une barre inférieure à chaque(
…)/
Reproduisez chaque lettre de chacune avec la valeur correspondante de:s≠1
Ests
différent de1
? (donne 1 ou 0)m←
stocker dansm
(pour m ultiple)(
…),¨
Ajouter respectivement à ceux-ci:⍺{
…}¨m
Pour chacun, appelez cette fonction avec des ions etm
comme arguments:⎕D,⎕A
D igits suivie par les majuscules A lphabet⍺∩
intersection d'ions et que≢
compter le nombre de caractères dans ce1<
Est-ce un de moins que ça? (c.-à-d. avons-nous un ion multi-éléments?)⍵∧
et avons-nous besoin de multiples de cet ion?:
si oui, alors:')(',⍺
ajouter la chaîne à l'ion1⌽
faire pivoter cycliquement un pas vers la gauche (place)
à droite)⋄
autre⍺
retourner l'ion non modifié∊
ϵ nlist (aplatir)la source
C,
208205175169 169 octetsargv[1]
: cationargv[2]
: anion Lescharges d'ions sont prises sur stdin.
la source
Rétine ,
8680 octetsMerci à Neil d'avoir économisé 6 octets.
Essayez-le en ligne!
L'entrée est séparée par un saut de ligne (la suite de tests utilise la séparation par virgule pour plus de commodité).
Explication
Nous commençons par ajouter un
(
à chaque molécule. Les^
correspondances commencent en ligne carm)
vers la fin du programme définit le mode multiligne pour toutes les étapes précédentes.Nous remplaçons la
^[-+]n
partie par)_
, suivie den
copies de1
(c'est-à-dire que nous convertissons les frais en unaire, en laissant tomber les signes).Cette étape fait trois choses: elle divise les deux charges par leur GCD, les reconvertit en décimales et les échange. Le GCD peut être trouvé assez facilement dans l'expression régulière, en faisant correspondre le plus long
1+
qui nous permet de faire correspondre les deux charges en utilisant uniquement la référence arrière\1
. Pour diviser par ceci, nous utilisons la fonction "nombre de captures" de Retina, qui nous indique combien de fois un groupe a été utilisé. Il en$#2
est de même de la première charge divisée par le GCD et de$#3
la deuxième charge divisée par le GCD (tous les deux en décimal).Nous retirons les
_1
s des extrémités des deux parties.Et nous supprimons les parenthèses des lignes qui se terminent par un
)
(c'est-à-dire celles qui en avaient un_1
), ainsi que des lignes qui ne contiennent qu'un seul atome.Enfin, nous concaténons les deux molécules en supprimant le saut de ligne.
la source
Haskell ,
10197 octetsEssayez-le en ligne! Exemple d'utilisation:
Fe^+3, O^-2
est pris comme("Fe"#"O")3 2
.la source
Python 3 , 131 octets
Essayez-le en ligne!
Python 2 ,
196174 174170155149140136 octetsEssayez-le en ligne!
la source
Python 3 , 129 octets
Essayez-le en ligne!
Si nous devons gérer des charges négatives des anions, alors 153 octets:
Essayez-le en ligne!
la source
RPL (HP48 S / SX), 294,5 octets
Oui, une soumission ridiculement grande, je ne sais pas à quel point elle sera compétitive ...
3 routines soigneusement emballées dans un répertoire.
M
est le principal. Il attend 2 chaînes sur la pile au format ion et pousse une chaîne de molécules sur la pile.S
divise l'ion en charge sous forme de nombre et la formule de l'élément sous forme de chaîne. Par exemple,"PO_4^-3"
serait pris de la pile-3
et"PO_4"
poussé sur la pile.J
joint le nombre d'ions à la formule et décide d'envelopper ou non la formule entre parenthèses. Le bit précédentELSE
concerne 1 ion, laissant la chaîne telle quelle. Par exemple, si1
et se"PO_4"
trouvent sur la pile, ils sont remplacés par"PO_4"
.1
et"H"
donne"H"
.Le reste concerne plusieurs ions; si c'est un seul atome, ce n'est pas entre parenthèses, sinon c'est le cas. Pour décider si c'est le cas, je vérifie la longueur de la chaîne et vérifie si le dernier caractère est
>"Z"
. Les expressions booléennes renvoient 1 pour vrai et 0 pour faux. En soustrayant le résultat de cette comparaison de la longueur de la chaîne, j'obtiens 1 ou moins quand c'est un seul atome, sinon plus: la longueur 1 est un seul atome; la longueur 2 aura une lettre comme dernier caractère; pour un seul atome, il est en minuscules, ce>"Z"
qui donne le résultat 1, sinon 2; longueur 3 ou plus signifie plus de 1 atome et avec 0 ou 1 soustrait de la longueur, le résultat sera au moins 2. Par exemple,3
et"PO_4"
donne"(PO_4)_3"
.3
et"Al"
donne"Al_3"
.M
divise d'abord chaque ion en utilisantS
. Après la première ligne, le niveau 5 de la pile (donc l'objet le plus profondément enfoui) contient la charge du deuxième ion, la formule du deuxième ion de niveau 4, la formule du premier ion de niveau 3, la valeur absolue de niveau 2 de la charge du premier ion et la valeur absolue de niveau 1 de la charge du second ion à nouveau. Par exemple, si des ions donnés sur la pile sont"Al^+3"
,"SO_4^-2"
nous obtenons-2
,"SO_4"
,"Al"
,3
,2
.La deuxième ligne calcule le pgcd des 2 charges (en laissant les charges intactes).
La troisième ligne divise chaque charge par le pgcd (pour calculer les multiples) et la joint à la formule de l'ion en utilisant
J
. Nous avons donc deux cordes chacune avec un ion donné sans charge (ou un multiple) et une charge de la seconde enfouie derrière eux. Par exemple,-2
,"Al_2"
,"(SO_4)_3"
(-2 est la charge de SO_4).La quatrième ligne décharge la charge et si elle est positive, elle échange les deux chaînes (de sorte que le cation vient en premier) avant de les rejoindre. Ainsi , dans l' exemple ci - dessus, parce qu'il est négatif, ils sont rejoints dans l'ordre qu'ils sont:
"Al_2(SO_4)_3"
.la source
JavaScript, 145 octets
Prend des arguments
c
est un cation,a
est un anion,p
est une charge positive,n
est une charge négative.la source