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 de nombres donné.
numbers = RandomChoice[{1, 2, 3, 5, 7, 10}, 4]
Le total obtenu à partir de ces nombres et de ces opérations est également généré de manière aléatoire.
total = RandomInteger[100]
Construisez toutes les façons possibles d'utiliser chaque nombre une fois, en gardant à l'esprit que l'ordre a de l'importance pour certaines 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 des ComplexInfinity en raison de la division par 0. Ces messages peuvent être éliminés en utilisant 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]
Voici une des combinaisons possibles.
FirstCase[combinations, _ == total]
Dans certains cas, il n'est pas possible d'obtenir le total exact.
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]