Countdown-Spiellöser
Ich habe keine Ahnung, ob dies für jeden Fall funktioniert, aber es hat in denen, die ich versucht habe. Wenn es irgendwelche Optimierungen gibt, die irgendwo passieren könnten, kommentieren Sie diese bitte. In Bezug auf meinen Codestil bin ich sicher, dass es dort etwas zu beheben gibt.
In diesem Spiel erhalten Sie eine Reihe von Zahlen und ein Ziel. Sie müssen das Ziel nur mit den angegebenen Zahlen und den Operatoren ( \) erreichen$ + \$, \$ - \$, \$ / \$, \$ \times \$). Sie können keine Nummer mehr als einmal verwenden, aber jeder Operator kann so oft wie nötig verwendet werden. Sie müssen nicht jede Nummer / jeden Operator verwenden.
import itertools
target = 225
numbers = [25, 1, 9, 9, 4, 2]
math_functions = "+-/*"
solution = None
def generate_number_permutations(numbers, length):
return list(itertools.permutations(numbers, length))
def generate_function_permutations(length):
return list(itertools.product(math_functions, repeat=length))
for x in range(len(numbers)):
number_permutations = generate_number_permutations(numbers, x+1)
function_permutations = generate_function_permutations(x)
if x == 0:
for y in number_permutations:
if y[0] == target:
solution = y[0]
break
else:
continue
for permutation in number_permutations:
for functions in function_permutations:
value = permutation[0]
for function in enumerate(functions):
if function[1] == "+":
value += permutation[function[0]+1]
elif function[1] == "-":
value -= permutation[function[0]+1]
elif function[1] == "/":
value /= permutation[function[0]+1]
else:
value *= permutation[function[0]+1]
if value == target:
solution = permutation, functions
break
else:
continue
break
if solution is not None:
break
print(solution)
Antworten
Globals
Da target, numbersund math_functionsglobale Konstanten sind, sollten sie alle Caps sein - zB TARGET. Das heißt, Sie sollten dies umgestalten, damit das Ziel und die Zahlen parametrisch sind, damit sie (eventuell) zufällig generiert werden können.
Die Lösung gehört nicht als globale Lösung, da sie veränderlich ist - ihre Anwesenheit verhindert, dass Ihr Programm erneut gestartet wird.
Ebenso sollte der Code mit globalem Gültigkeitsbereich, der mit beginnt for x, in eine Funktion verschoben werden.
Verwendung von Operatoren
Dies fällt in die Kategorie "Code als Daten". Dieser Block:
if function[1] == "+":
value += permutation[function[0]+1]
elif function[1] == "-":
value -= permutation[function[0]+1]
elif function[1] == "/":
value /= permutation[function[0]+1]
else:
value *= permutation[function[0]+1]
kann stark vereinfacht werden, wenn Sie ändern math_functions, dass Sie ein Tupel (oder vielleicht ein Wörterbuch) von Zeichen-Operator-Paaren sind, aus denen Sie Ihre Operatoren importierenhttps://docs.python.org/3/library/operator.html .
Betreiber
Dies ist nur eine Ergänzung zu @Reinderien Antwort. Sie können eine Funktion erstellen, die Werte, die Sie bearbeiten möchten, und den Operator, den Sie verwenden möchten, übergeben und die Berechnung dieser beiden Zahlen zurückgeben.
def perform_operator(op: str, a: int, b: int) -> int:
return { "+": a + b, "-": a - b, "*": a * b, "/": a / b }[op]
So würden Sie diese Funktion verwenden
...
for function in enumerate(functions):
value = perform_operator(function[1], value, permutation[function[0] + 1])
if value == target:
solution = permutation, functions
break
...