2015-01-22 25 views
9

Ich habe ein Mind Challenge-Rätsel, das ich mit Python auflösen will. Sie geben 4 Zahlen (25, 28, 38, 35) und sie wollen, dass wir die Zahlen in ... + ...-... = ... setzen. Eine mögliche Lösung ist 25 + 38-35 = 28. Ive versuchte, eine Liste von den Zahlen zu machen, durchläuft sie mit einigen Schleifen und ein, wenn: lst = [25, 28, 38, 35]Python: durch eine Liste iterieren

for z in lst: 
    for x in lst: 
     for c in lst: 
      for v in lst: 
       if z+x-c==v: 
        print z,x,c,v 

Aber wenn ein Lauf des für Schleifen sie wiederholen die Zahlen, (25 + 25-25 = 25) und das funktioniert nicht. Wie kann ich es lösen?

+11

Blick in itertools.permutations – user2097159

+0

Ganz abgesehen von dem besten Weg zu allen Permutationen in Python zu sehen, betrachten (durch Hinzufügen "c" auf beiden Seiten der Gleichung), dass Sie nach zwei beliebigen Werten aus den vier suchen, die zusammen die Hälfte der Summe ergeben. Sie brauchen also nicht alle 24 Permutationen, Sie könnten nur 6 Partitionen betrachten: die ersten 6 Werte von 'itertools.permutations (lst, 2)'. Und wenn die Werte ganze Zahlen sind und die Summe ungerade ist, dann vergiss es :-) –

Antwort

9

Als Luis' Kommentar angedeutet, ist ein guter Ansatz

import itertools 

for z, x, c, v in itertools.permutations(lst): 
    if z+x-c==v: 
     print z,x,c,v 

"flach ist besser als verschachtelt", wie import this an einer interaktiven Python-Prompt wird Sie daran erinnern :-)

1
Def recadd(lis): 
     If lis[0] + lis[1] - lis[2]] = lis[3]: 
       return lis 
     Else: 
       recadd(lis[3] + lis[0:2]) 
       recadd(lis[0] + lis[3] + lis[1:2]) 
       recadd(lis[0:1] + lis[3]. + lis[2]) 

Schnell und schmutziger Hack auf meinem Handy, könnte elegant für k-Nummern erweitert werden, ungetestet aber es sollte funktionieren.

Edit: dies realisiert wird nicht funktionieren, wenn es keine solution.infinite Rekursion ...

Verwandte Themen