Countdown-Spiellöser

Oct 09 2020

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

3 Reinderien Oct 09 2020 at 22:29

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 .

Linny Oct 10 2020 at 05:24

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
...