Correction, en utilisant les rationnels du module standard fractions :
#! /usr/bin/python3importargparsefromfractionsimportFractionadd=Fraction.__add__sub=Fraction.__sub__mul=Fraction.__mul__div=Fractionsignes={add:'+',sub:'-',mul:×ばつ',div:'/'}classOperation:"""An operation between two integers, fractions or operations"""def__init__(self,a,b,op):"""Return an operation representing 'a op b': a, b integers, fractions or operations op operator"""self.a=aself.b=bself.op=opself._result=Nonedefresult(self):"""Return the result of the operation, as a fraction"""ifself._resultisNone:a=value(self.a)b=value(self.b)self._result=self.op(a,b)returnself._resultdef__str__(self):return'(%s%s%s)'%(self.a,signes[self.op],self.b)defvalue(a):"""Return the value of an integer, a fraction, or the result of an operation"""ifisinstance(a,Operation):returna.result()else:returnadefoperations(a,b):"""Yields of feasible operations between two integers, fractions or operations"""yieldOperation(a,b,add)yieldOperation(a,b,mul)yieldOperation(a,b,sub)ifvalue(b)!=0:yieldOperation(a,b,div)defcalculs(*termes):"""Yields all feasible computations with multiple integers or fractions"""l=len(termes)ifl==1:# Un seul terme, rien à faire à part le renvoyer tel quel !yieldtermes[0]else:# Au moins deux termes: on en prend un...foriinrange(l):a=termes[i]# ... puis un autreforjinrange(l):ifi==j:# Ce sont les mêmes termes, ce n'est pas ce qu'on recherchecontinueb=termes[j]# On parcours les opérations possibles entre euxforabinoperations(a,b):# On considère le résultat de cette opération comme un nouveu terme# remplaçant les deux choisis.yield fromcalculs(ab,*[termes[k]forkinrange(l)ifk!=iandk!=j])deftrouve(nombres,target):"""Yields all computations of multiple integers or fractions, which result in the given target"""forcalculincalculs(*nombres):ifvalue(calcul)==target:yieldcalculdefmain(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='+',type=int,help="nombres à utiliser")args=parser.parse_args(args)calculs=trouve(args.numbers,args.target)forcalculincalculs:print('%s = %d'%(calcul,value(calcul)))ifnotargs.all:breakif__name__=='__main__':main()
[^] # Re: Python 3
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au journal résoudre "trouve 24". Évalué à 5.
Correction, en utilisant les rationnels du module standard
fractions: