• # Python 3

    Posté par (site web personnel) . En réponse au journal résoudre "trouve 24". Évalué à 4.

    En Python 3 :

    #! /usr/bin/python3
    import argparse
    add = int.__add__
    sub = int.__sub__
    mul = int.__mul__
    div = lambda a, b: a // b
    signes = {add: '+', sub: '-', mul: ×ばつ', div: '/'}
    class Operation:
     def __init__(self, a, b, op):
     self.a = a
     self.b = b
     self.op = op
     self._int = None
     def __int__(self):
     if self._int is None:
     self._int = self.op(int(self.a), int(self.b))
     return self._int
     def __str__(self):
     return '(%s%s%s)' % (self.a, signes[self.op], self.b)
    # Génère toutes les opérations faisables avec deux entiers ou opérations
    def operations(a, b):
     yield Operation(a, b, add)
     yield Operation(a, b, mul)
     yield Operation(a, b, sub)
     if int(b) != 0 and int(a) % int(b) == 0:
     yield Operation(a, b, div)
    # Génère tous les calculs faisables avec des entiers ou opérations
    def calculs(*termes):
     l = len(termes)
     if l == 1:
     # Un seul terme, rien à faire à part le renvoyer tel quel !
     yield termes[0]
     else:
     # Au moins deux termes: on en prend un...
     for i in range(l):
     a = termes[i]
     # ... puis un autre
     for j in range(l):
     if i == j:
     # Pas le même !
     continue
     b = termes[j]
     # On parcours les opérations possibles entre eux
     for ab in operations(a, b):
     # On considère le résultat de cette opération comme un nouveu terme
     # remplaçant les deux choisis.
     yield from calculs(ab, *[termes[k] for k in range(l) if k != i and k != j])
    def trouve(nombres, target):
     for calcul in calculs(*nombres):
     if int(calcul) == target:
     yield calcul
    def main(args=None):
     parser = argparse.ArgumentParser(description="Trouve un ou des moyens d'obtenir 24 avec les nombres donnés")
     parser.add_argument("--all", action='store_true', help="affiche tous les calculs donnant ce résultat, plutôt que seulement le premier trouvé")
     parser.add_argument("--target", type=int, default=24, help="cherche un résultat autre que 24")
     parser.add_argument("numbers", nargs='+', help="nombres à utiliser")
     args = parser.parse_args(args)
     calculs = trouve(args.numbers, args.target)
     for calcul in calculs:
     print('%s = %d' % (calcul, int(calcul)))
     if not args.all:
     break
    if __name__ == '__main__':
     main()

    Le site du jeu m'a proposé les nombres suivants : 1 4 5 6, ce qui m'amène à douter un peu de la garantie que « 100 % des parties ont une ou plusieurs solutions ».