Odliczanie do gier liczbowych
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
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 .
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
...