Как составить список всех решений в 24 игре, используя Python - PullRequest
0 голосов
/ 09 апреля 2020

Недавно я создал решатель 24 игр с python
Прочтите этот сайт, если вы не знаете, что такое игра 24: https://www.pagat.com/adders/24.html

Вот код :

from itertools import permutations, product, chain, zip_longest
from   fractions  import Fraction as F

solutions = []

def ask4():
    num1 = input("Enter First Number: ")
    num2 = input("Enter Second Number: ")
    num3 = input("Enter Third Number: ")
    num4 = input("Enter Fourth Number: ")
    digits = [num1, num2, num3, num4]
    return list(digits)

def solve(digits, solutions):
    digit_length = len(digits)
    expr_length = 2 * digit_length - 1
    digit_perm = sorted(set(permutations(digits)))
    op_comb = list(product('+-*/', repeat=digit_length-1))
    brackets = ([()] + [(x,y)
    for x in range(0, expr_length, 2)
    for y in range(x+4, expr_length+2, 2)
    if (x,y) != (0,expr_length+1)]
                 + [(0, 3+1, 4+2, 7+3)])
    for d in digit_perm:
        for ops in op_comb:
            if '/' in ops:
                d2 = [('F(%s)' % i) for i in d]
            else:
                d2 = d
            ex = list(chain.from_iterable(zip_longest(d2, ops, fillvalue='')))
            for b in brackets:
                exp = ex[::]
                for insert_point, bracket in zip(b, '()'*(len(b)//2)):
                    exp.insert(insert_point, bracket)
                txt = ''.join(exp)
                try:
                    num = eval(txt)
                except ZeroDivisionError:
                    continue
                if num == 24:
                    if '/' in ops:
                        exp = [(term if not term.startswith('F(') else term[2])
                               for term in exp]
                    ans = ' '.join(exp).rstrip()
                    print("Solution found:", ans)
                    solutions.extend(ans)
                    return ans
    print("No solution found for:", ' '.join(digits))

def main():
    digits = ask4()
    solve(digits, solutions)
    print(len(solutions))
    print("Bye")

main()

Прямо сейчас мой код показывает только одно решение для приведенных чисел, даже когда решений явно больше.
Так что, если кто-то знает, как это сделать, пожалуйста, помогите мне
Спасибо

1 Ответ

1 голос
/ 09 апреля 2020

Ваша функция возвращается, как только находит решение. Удалить инструкцию возврата. После l oop вы можете при желании вернуть список всех решений. Чтобы проверить, не было ли их, посмотрите, равна ли длина списка нулю (поэтому вы знаете, когда говорить, что решений нет).

Я бы также предложил вместо solutions указать solve глобального.

...