Odliczanie do gier liczbowych

Oct 09 2020

Nie mam pojęcia, czy to działa w każdym przypadku, ale tak jest w tych, które wypróbowałem. Jeśli są jakieś optymalizacje, które mogą się zdarzyć w dowolnym miejscu, skomentuj to. Jeśli chodzi o mój styl kodu, na pewno jest coś do naprawienia.

W tej grze masz zestaw liczb i cel. Musisz osiągnąć cel używając tylko podanych liczb i operatorów ( \$ + \$, \$ - \$, \$ / \$, \$ \times \$). Nie możesz użyć dowolnej liczby więcej niż raz, ale każdego operatora można użyć tyle razy, ile potrzeba. Nie musisz używać każdego numeru / operatora.

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)

Odpowiedzi

3 Reinderien Oct 09 2020 at 22:29

Globals

Ponieważ target, numbersi math_functionssą globalne stałe, powinny one być wszystkie-Caps - np TARGET. To powiedziawszy, powinieneś to zmienić tak, aby cel i liczby były parametryczne, aby mogły (ostatecznie) być generowane losowo.

Rozwiązanie nie należy do globalnych, ponieważ jest zmienne - jego obecność uniemożliwia ponowne wejście programu.

Podobnie kod o zasięgu globalnym zaczynający się od for xpowinien zostać przeniesiony do funkcji.

Korzystanie z operatorów

Należy to do kategorii „kod jako dane”. Ten blok:

            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]

można znacznie uprościć, jeśli zmienisz swoją math_functionskrotkę (lub może słownik) par znak-operator, skąd importujesz swoje operatoryhttps://docs.python.org/3/library/operator.html .

Linny Oct 10 2020 at 05:24

Operatorzy

To jest tylko dodanie do odpowiedzi @Reinderien. Możesz utworzyć funkcję, przekazać wartości, na których chcesz operować, i operator, którego chcesz użyć, a następnie zwrócić obliczenia tych dwóch liczb.

def perform_operator(op: str, a: int, b: int) -> int:
    return { "+": a + b, "-": a - b, "*": a * b, "/": a / b }[op]

Oto, jak możesz użyć tej funkcji

...
for function in enumerate(functions):
    value = perform_operator(function[1], value, permutation[function[0] + 1])
if value == target:
    solution = permutation, functions
    break
...