Skip to content

Instantly share code, notes, and snippets.

@kitten-owner
Last active March 21, 2021 11:31
Show Gist options
  • Select an option

  • Save kitten-owner/0330fc8393ace607969a64eab29248bf to your computer and use it in GitHub Desktop.

Select an option

Save kitten-owner/0330fc8393ace607969a64eab29248bf to your computer and use it in GitHub Desktop.
#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