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/