Si vous avez lu le livre Contact de Carl Sagan, ce défi peut vous sembler familier.
Étant donné l'entrée d'un ensemble d'équations mathématiques consistant en un nombre, un opérateur inconnu, un autre nombre et un résultat, déduisez quels opérateurs représentent l'addition, la soustraction, la multiplication ou la division.
Chaque équation d'entrée sera toujours composée de
- un entier non négatif
- une des lettres
A
,B
,C
ouD
- un autre entier non négatif
- le personnage
=
- un entier non négatif final
concaténés ensemble. Par exemple, une entrée possible est 1A2=3
, dont vous pouvez déduire que A
représente l'addition. Chacun des entiers satisfera 0 ≤ x ≤ 1,000
.
Cependant, ce n'est pas toujours aussi simple que cela. Il est possible qu'il y ait ambiguïté entre:
5A0=5
: addition soustraction1A1=1
: multiplication / division0A5=0
: multiplication / division2A2=4
: addition / multiplication4A2=2
: soustraction / division0A0=0
: addition / soustraction / multiplication
etc. Le défi consiste à utiliser cette capacité à affiner les choix, combinée à un processus d'élimination, pour déterminer quel opérateur chaque lettre représente. (Il y aura toujours au moins une équation d'entrée, et il sera toujours possible de faire correspondre sans ambiguïté et de façon unique chaque lettre utilisée dans l'entrée avec un seul opérateur.)
Par exemple, supposons que l'entrée soit les équations suivantes:
0A0=0
: cela réduit A à l'addition, la soustraction ou la multiplication (ne peut pas diviser par 0).10B0=10
: B doit être soit une addition soit une soustraction.5C5=10
: C est évidemment l'addition, ce qui fait la soustraction B, ce qui fait la multiplication A.
Par conséquent, la sortie de ces équations d'entrée doit correspondre A
avec *
, B
avec -
et C
avec +
.
L'entrée peut être donnée sous la forme d'une chaîne unique séparée par des espaces / virgules ou d'un tableau de chaînes, chacune représentant une équation. La sortie peut être une chaîne unique ( "A*B-C+"
), un tableau ( ["A*", "B-", "C+"]
) ou un tableau 2D de type dictionnaire / dict ( {"A": "*", ...}
ou [["A", "*"], ...]
).
Vous pouvez supposer qu'un nombre ne sera jamais divisé par un autre nombre auquel il n'est pas divisible (vous n'avez donc pas à vous soucier de savoir si la division doit être flottante ou tronquée).
Puisque c'est du code-golf , le code le plus court en octets l'emporte.
Cas de test:
In Out
-------------------------------
0A0=0 10B0=10 5C5=10 A*B-C+
100D100=10000 D*
4A2=2 4B2=2 0A0=0 A-B/
15A0=15 4B2=2 2C2=0 A+B/C-
1A1=1 0A0=0 A*
0A0=0 2A2=4 5B0=5 2B2=4 A*B+
2A2=4 0C0=0 5B0=5 5A0=5 A+B-C*
0A1000=0 4A2=2 A/
la source
Réponses:
MATL , 53 octets
Utilise la version actuelle (10.1.0)
EDIT (12 juin 2016): pour s'adapter aux changements de langue, remplacer
Y}
parg
et1L3$)
parY)
. Le lien ci-dessous intègre ces modificationsEssayez-le en ligne!
Explication
Cela teste toutes les permutations possibles des quatre opérateurs dans une boucle jusqu'à ce qu'une permutation rend toutes les équations vraies.
Pour tester si les équations sont vraies, une expression régulière est appliquée pour remplacer les quatre lettres par les opérateurs (dans l'ordre dicté par la permutation actuelle), et la chaîne est convertie en nombres (évalués). Cela donne un tableau avec autant de nombres que d'équations, dans lequel les équations qui sont vraies deviennent
1
et les équations qui sont fausses deviennent0
. Si ce vecteur ne contient que1
valeurs, nous avons terminé.La solution trouvée attribue des opérateurs aux quatre lettres, mais elles n'apparaissent pas toutes nécessairement dans l'entrée. Un dernier test est donc effectué pour éliminer les lettres non utilisées (et leurs opérateurs correspondants).
la source
Python, 278 caractères
Ma première réponse sur le code golf ...
C'est juste une fonction implémentant un algorithme de force brute, vous l'appelez en passant comme argument la chaîne d'équations.
la source
["A","B","C","D"]
parlist("ABCD")
?=
dans la définition del
.4A2=2 4B3=1
).JavaScript (ES6),
213208 octetsExplication
L'entrée et la sortie sont des chaînes.
Définit une fonction
f
qui se double d'une fonction récursive pour générer toutes les permutations des opérateurs et teste les permutations complètes avec les équations d'entrée à l'aideeval
.Tester
Le test n'utilise pas d'arguments par défaut pour la compatibilité du navigateur.
Afficher l'extrait de code
la source