Testez vos compétences en numératie
Le programme de télévision française Des chiffres et des lettres et son adaptation anglaise "Countdown" testent les compétences en numératie des concurrents. Construisons une version simple de ce jeu, et résolvons-le avec la nouvelle fonction Groupings.
Spécifiez les opérations arithmétiques qui peuvent être utilisées pour effectuer les calculs.

ops = {Plus, Subtract, Times, Divide};
Générez une liste de 4 nombres choisis au hasard à partir d'un ensemble donné de nombres.

numbers = RandomChoice[{1, 2, 3, 5, 7, 10}, 4]

Le total à obtenir à partir de ces nombres et des opérations est également généré de façon aléatoire.

total = RandomInteger[100]

Construisez tous les moyens possibles de l'utilisation de chaque nombre au plus une fois, en gardant à l'esprit que l'ordre est important pour certaines des opérations arithmétiques.

orderings = Flatten[Permutations /@ Subsets[numbers, {4}], 1]

Générez ensuite toutes les combinaisons possibles de chaque ordre avec les opérations binaires données.

candidates = Groupings[orderings, ops -> 2, HoldForm];
Certains candidats produisent ComplexInfinity en raison de la division par zéro, donc nous évaluons tous les groupements avec un Quiet.

results = Quiet@ReleaseHold[candidates];
Voici le nombre de combinaisons produisant le total demandé.

combinations = Thread[Equal[candidates, results]];
Count[Thread[Equal[candidates, results]], _ == total]

Ceci est une des combinaisons possibles.

FirstCase[combinations, _ == total]

Il peut ne pas être possible d'obtenir le total exact dans certains cas.

total2 = 76;
Count[combinations, _ == total2]

Mais nous pouvons chercher les meilleures approximations parmi les résultats en utilisant la fonction Nearest.

total2 = 76;
Count[combinations, _ == total2];
DeleteCases[results, ComplexInfinity];
DeleteDuplicates@Nearest[%, total2]
