Bernd est un lycéen qui a des problèmes de chimie. En classe, il doit concevoir des équations chimiques pour certaines expériences qu'ils font, telles que la combustion de l'heptane:
C 7 H 16 + 11O 2 → 7CO 2 + 8H 2 O
Comme les mathématiques ne sont pas exactement le sujet le plus solide de Bernd, il a souvent du mal à trouver les rapports exacts entre les pro- et les produits de la réaction. Puisque vous êtes le tuteur de Bernd, c'est votre travail de l'aider! Écrivez un programme qui calcule la quantité de chaque substance nécessaire pour obtenir une équation chimique valide.
Contribution
L'entrée est une équation chimique sans quantités. Afin de rendre cela possible en ASCII pur, nous écrivons tous les abonnements sous forme de nombres ordinaires. Les noms d'élément commencent toujours par une majuscule et peuvent être suivis d'une minuscule. Les molécules sont séparées par des +
signes, une flèche de type ASCII ->
est insérée entre les deux côtés de l'équation:
Al+Fe2O4->Fe+Al2O3
L'entrée se termine par une nouvelle ligne et ne contiendra aucun espace. Si l'entrée n'est pas valide, votre programme peut faire ce que vous voulez.
Vous pouvez supposer que l'entrée ne dépasse jamais 1024 caractères. Votre programme peut soit lire l'entrée à partir de l'entrée standard, du premier argument ou d'une manière définie par l'implémentation lors de l'exécution si aucun n'est possible.
Sortie
La sortie de votre programme est l'équation d'entrée augmentée de nombres supplémentaires. Le nombre d'atomes pour chaque élément doit être le même des deux côtés de la flèche. Pour l'exemple ci-dessus, une sortie valide est:
2Al+Fe2O3->2Fe+Al2O3
Si le nombre d'une molécule est 1, laissez-le tomber. Un nombre doit toujours être un entier positif. Votre programme doit produire des nombres tels que leur somme soit minimale. Par exemple, ce qui suit est illégal:
40Al+20Fe2O3->40Fe+20Al2O3
S'il n'y a pas de solution, imprimez
Nope!
au lieu. Un exemple d'entrée qui n'a pas de solution est
Pb->Au
Règles
- C'est du code-golf. Le code le plus court gagne.
- Votre programme doit se terminer dans un délai raisonnable pour toutes les entrées raisonnables.
Cas de test
Chaque scénario de test a deux lignes: une entrée et une sortie correcte.
C7H16+O2->CO2+H2O
C7H16+11O2->7CO2+8H2O
Al+Fe2O3->Fe+Al2O3
2Al+Fe2O3->2Fe+Al2O3
Pb->Au
Nope!
solve(
fonction intégrée eteval(
pour interpréter l'entrée :)Réponses:
C, 442
505caractèresCourir comme:
Résultats:
la source
Mathematica 507
J'ai utilisé l'approche de la matrice de composition chimique augmentée décrite dans
LRThorne, Une approche innovante pour équilibrer les équations de réaction chimique: une technique matrice-inverse simplifiée pour déterminer l'espace nul de la matrice. Chem.Educator , 2010, 15, 304-308 .
Un léger ajustement a été ajouté: j'ai divisé la transposition du vecteur d'espace nul par le plus grand diviseur commun des éléments pour garantir des valeurs entières dans toutes les solutions. Mon implémentation ne gère pas encore les cas où il existe plusieurs solutions pour équilibrer l'équation.
Les tests
Une analyse
Il fonctionne en créant le tableau de composition chimique suivant, composé d'espèces chimiques par éléments, auquel un vecteur de nullité d'addition est ajouté (devenant le tableau de composition chimique augmentée:
Les cellules internes sont retirées sous forme de matrice et inversées, ce qui donne.
La colonne la plus à droite est extraite, donnant:
Chaque élément du vecteur est divisé par le pgcd des éléments (1/8), donnant:
où les valeurs négatives seront placées sur le côté gauche de la flèche. Les valeurs absolues de ceux-ci sont les nombres nécessaires pour équilibrer l'équation originale:
la source
Python, 880 caractères
Tests:
Sortie:
Ça pourrait être bien moins que 880, mais mes yeux me tuent déjà ...
la source
Python 2, 635 octets
nombre d'octets précédents: 794, 776, 774, 765, 759, 747, 735, 734, 720, 683, 658, 655, 654, 653, 651, 638, 637, 636 octets.
Le deuxième niveau d'indentation n'est qu'un onglet, le troisième est un onglet puis un espace.
Pour être honnête, c'est la réponse de jadkik94, mais tant d'octets ont été rasés, j'ai dû le faire. Dites-moi si je peux raser des octets!
la source
''.join(map(chr,range(97,122)))
Dmap(chr,range(97,123))
fonctionne pour 12 octets enregistrés.JavaScript, 682 octets
C'est une réponse beaucoup plus golfée (des décennies de personnages!) De Kuilin. Peut ne pas être compétitif car certaines fonctionnalités JS sont postérieures au défi.
la source
Javascript, 705 octets
(non compétitif, certaines fonctionnalités sont postérieures au défi)
D'autres solutions comportaient toutes des éléments de forçage brutal. J'ai essayé une approche plus déterministe en représentant l'équation chimique comme un ensemble d'équations linéaires, puis en résolvant en utilisant l'algorithme de Gauss-Jordan pour prendre la forme réduite en échelons de rangées de cette matrice. Afin d'isoler le cas trivial où tout est zéro, je suppose que l'un des éléments est un nombre constant - et ce nombre est déterminé par seulement tous les nombres multipliés ensemble, afin de ne pas avoir de fractions. Ensuite, comme étape finale, nous diviserons chacun par le pgcd pour satisfaire la dernière condition.
Non golfé:
Golfé
la source