Оператор if / else с триплетом, который суммируется с заданным значением - PullRequest
1 голос
/ 04 августа 2020

Я пишу итоговую игру, в которой два игрока по очереди выбирают случайное число из диапазона (1,9), повторение числа не допускается. Итак, я борюсь с

Если в любой момент сумма трех чисел игрока равна 15, то этот игрок выиграл.

Если первый игрок выберет [ 7, 2, 3, 5], он выиграет, потому что 7 + 3 + 5 = 15

Итак, мой вопрос: почему программа не останавливается, когда first_player имеет входы == 15

Я хочу избежать импорта каких-либо библиотек.

Ответы [ 3 ]

0 голосов
/ 04 августа 2020

Вместо того, чтобы генерировать все перестановки на каждом шаге, поддерживайте карту того, к чему суммируется каждая перестановка, затем добавляйте две ветви к каждой ветви на каждом шаге. 1009 * с каждой перестановкой вы либо включаете данную запись, либо нет, например, если числа равны [7, 3, 2], вы можете сохранить [1, 0, 1] для комбинации 7 и 2.

Вы можете создать хэш-карту из 101-> 9 и c, и когда кто-то добавит к ней 3, вы добавите запись для 1010-> 9 и 1011-> 12. Как только вы видите цель, вы знаете, что игра окончена.

Таким образом, эволюция [7, 3, 2] будет

0->0
1->7
00->0
01->3
10->7
11->10
000->0
001->2
010->3
011->5
100->7
101->9
110->10
111->12
0 голосов
/ 05 августа 2020

Более эффективным способом было бы найти только те числа, сумма которых равна target, то есть 15.

entry = [7, 5, 1, 3]

def is_sum_15(nums):
    res = []
    search_numbers(nums, 3, 15, 0, [], res)
    return len(res) != 0
    
def search_numbers(nums, k, n, index, path, res):
    if k < 0 or n < 0:
        return 
    if k == 0 and n == 0: 
        res.append(path)
    for i in range(index, len(nums)):
        search_numbers(nums, k-1, n-nums[i], i+1, path+[nums[i]], res)

print(is_sum_15(entry)) # True
0 голосов
/ 04 августа 2020

Неэффективный, но простой способ - использовать itertools.permutations:

>>> entry = [7, 2, 3, 5]
>>> import itertools
>>> [sum(triplet) for triplet in itertools.permutations(entry, r=3) if sum(tr]
[12, 14, 12, 15, 14, 15, 12, 14, 12, 10, 14, 10, 12, 15, 12, 10, 15, 10, 14, 15, 14, 10, 15, 10]
>>> any(sum(triplet) == 15 for triplet in itertools.permutations(entry, r=3))
True

Это неэффективно, потому что вы будете пробовать все перестановки каждый раз, когда entry расширяется новым числом.

...