Last active
March 21, 2021 11:31
-
-
Save kitten-owner/0330fc8393ace607969a64eab29248bf to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #https://www.youtube.com/watch?v=hSbDxT8i1uY | |
| #Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. | |
| #Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) | |
| #один камень или увеличить количество камней в куче в два раза. | |
| #Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 77. | |
| #Победителем считается игрок, сделавший последний ход, т.е. первым получивший такую позицию, | |
| #при которой в кучах будет 77 или больше камней. В начальный момент в первой куче было семь камней, во второй куче – S камней; 1 ≤ S ≤ 69. | |
| #Задание 19. | |
| #Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, | |
| #когда такая ситуация возможна. | |
| #Задание 20. | |
| #Найдите два таких значения S, при которых у Пети есть выигрышная стратегия, причём одно-временно выполняются два условия: | |
| #− Петя не может выиграть за один ход; | |
| #− Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня. | |
| #Найденные значения запишите в ответе в порядке возрастания. | |
| #Задание 21 | |
| #Найдите минимальное значение S, при котором одновременно выполняются два условия: | |
| #– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети; | |
| #– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом. | |
| # x - это кол-во камней в первой куче; | |
| # y - кол-во кмней во творой куче, которое нам и надо найти; | |
| # p - позиция победная( Например: первая позция - это исходная, вторая ход Пети, третья - ход Вани и тд.) | |
| #......................................................................................................... | |
| def zadach19(x, y, p): | |
| if x + y >= 77 and p == 3: | |
| return True | |
| else: | |
| if x + y < 77 and p == 3: | |
| return False | |
| #Далее, чтобы прийти к базовому условию, выполняются перебор команд (которые даны в задании) и поднятие позиции на +1 | |
| return zadach19(x + 1, y, p + 1) or zadach19(x, y + 1, p + 1) or zadach19(x * 2, y, p + 1) or zadach19(x, y * 2, p + 1) | |
| print("Задание 19:") | |
| for i in range(1, 70): #Выполняется перебор , в котором указывается диапазон второй кучки | |
| if zadach19(7, i, 1): | |
| print(i) | |
| break # Выполняем break, в том случае, если нужно минимальное значение в 19 задании | |
| #......................................................................................................... | |
| # Решение аналогично 19 заданию, но с несколькими добавлениями | |
| def zadach20(x, y, p): | |
| if x + y >= 77 and p == 4: | |
| return True | |
| else: | |
| if x + y < 77 and p == 4: | |
| return False | |
| else: # Прописываем ещё одно ограничение, чтобы нужная сумма набралась в нужной позиции | |
| if x + y >= 77: | |
| return False | |
| # Далее будут прописаны два условия, связанные с четностью позиции, то есть: | |
| # если позиция нечётна, то будет возвращаться один из ходов | |
| # если позиция чётна, то будут возвращаться все ходы( т.к. нужно, чтобы победа была при любых условиях) | |
| if p % 2 == 1: | |
| return zadach20(x + 1, y, p + 1) or zadach20(x, y + 1, p + 1) or zadach20(x * 2, y, p + 1) or zadach20(x, y * 2, p + 1) | |
| else: | |
| return zadach20(x + 1, y, p + 1) and zadach20(x, y + 1, p + 1) and zadach20(x * 2, y, p + 1) and zadach20(x, y * 2, p + 1) | |
| print("Задание 20:") | |
| for i in range(1, 70): | |
| if zadach20(7, i, 1): | |
| print(i) | |
| #......................................................................................................... | |
| # Решение аналогично 20 заданию, но с несколькими добавлениями | |
| def zadach21(x, y, p): | |
| if x + y >= 77 and (p == 3 or p == 5): # Т.к. нужна победа первым или вторых ходом Вани( 3 или 5 поизиция) | |
| return True | |
| else: | |
| if x + y < 77 and p == 5: | |
| return False | |
| else: | |
| if x + y >= 77: | |
| return False | |
| # Теперь мы меняем проверку чётности позиции, т.к. нужна победа при нечетных позициях | |
| if p % 2 == 0: | |
| return zadach21(x + 1, y, p + 1) or zadach21(x, y + 1, p + 1) or zadach21(x * 2, y, p + 1) or zadach21(x, y * 2, p + 1) | |
| else: | |
| return zadach21(x + 1, y, p + 1) and zadach21(x, y + 1, p + 1) and zadach21(x * 2, y, p + 1) and zadach21(x, y * 2, p + 1) | |
| print("Задание 21:") | |
| for i in range(1, 70): | |
| if zadach21(7, i, 1): | |
| print(i) | |
| #Программа выведет два ответа, но какой-то один из них будет лишний, | |
| #при котором победа гарантируется первым ходом Вани ( или 3 позицией) | |
| # Далее мы пропишем ту же самую программу, но только для этого исключения | |
| def zadach21_proverka(x, y, p): | |
| if x + y >= 77 and p == 3: | |
| return True | |
| else: | |
| if x + y < 77 and p == 3: | |
| return False | |
| else: | |
| if x + y >= 77: | |
| return False | |
| if p % 2 == 0: | |
| return zadach21_proverka(x + 1, y, p + 1) or zadach21_proverka(x, y + 1, p + 1) or zadach21_proverka(x * 2, y, p + 1) or zadach21_proverka(x, y * 2, p + 1) | |
| else: | |
| return zadach21_proverka(x + 1, y, p + 1) and zadach21_proverka(x, y + 1, p + 1) and zadach21_proverka(x * 2, y, p + 1) and zadach21_proverka(x, y * 2, p + 1) | |
| print("Задание 21: Проверка, не подходит:") | |
| for i in range(1, 70): | |
| if zadach21_proverka(7, i, 1): | |
| print(i) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment