PnnK

gametheoryEGE

Apr 8th, 2021 (edited)
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.02 KB | None | 0 0
  1. #За один ход игрок может добавить в одну из куч один камень или
  2. #увеличить количество камней в куче в четыре раза.
  3. #Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 82.
  4. #Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию,
  5. #в которой в кучах будет 82 или больше камней.
  6. #В начальный момент в первой куче было 4 камня, во второй куче — S камней, 1 ≤ S ≤ 77.
  7.  
  8. #Задание 19
  9. def IsItSolutionFor19(n,s, turn):
  10.     if n+s>=82 and turn==2: #Положительное условие выхода: на второй ход в куче оказалось нужное число камней.
  11.         return True
  12.     elif n+s<82 and turn==2: #Отрицательное условие выхода: на второй ход камней меньше, чем нужно.
  13.         return False
  14.     return IsItSolutionFor19(n+1,s,turn+1) or IsItSolutionFor19(n*4,s,turn+1) or IsItSolutionFor19(n,s+1, turn+1) or IsItSolutionFor19(n,s*4, turn+1)
  15.     #Рекуррентный вызов в случае, если ещё не второй ход: проверится каждая ветвь дерева, если хотя бы одна верна, вернется True
  16.  
  17. #Задание 20
  18. def IsItSolutionFor20(n,s, turn):
  19.     if n+s>=82 and turn==3: #Положительное условие выхода: на второй ход в куче оказалось нужное число камней.
  20.         return True
  21.     elif n+s<82 and turn==3: #Отрицательное условие выхода: на второй ход камней меньше, чем нужно.
  22.         return False
  23.     elif n+s>=82 and turn<3:
  24.         return False #Выход с отрицанием, если выиграли до 3 хода.
  25.     if turn%2 == 0: #В ход игрока, имеющего в руках выигрышную стратегию, нам достаточно, чтобы у него одна из ветвей возвращала True (Имелся
  26.         #хотя бы один выигрышный ход.
  27.         return IsItSolutionFor20(n+1,s,turn+1) or IsItSolutionFor20(n*4,s,turn+1) or IsItSolutionFor20(n,s+1, turn+1) or IsItSolutionFor20(n,s*4, turn+1)
  28.     else: #В ход проигравшего игрока все ветви должны вернуть True, иначе возможен исход, где выигрывает не наш "победитель"
  29.         return IsItSolutionFor20(n+1,s,turn+1) and IsItSolutionFor20(n*4,s,turn+1) and IsItSolutionFor20(n,s+1, turn+1) and IsItSolutionFor20(n,s*4, turn+1)
  30.  
  31. #Задание 21
  32. def IsItSolutionFor21(n,s, turn):
  33.     if n+s>=82 and (turn==4 or turn==2): #Если при данном s игра выигрывается на 2 или 4 ходе, получаем True.
  34.         return True
  35.     elif n+s<82 and turn==4: #Если не доиграли до 4, получаем False.
  36.         return False
  37.     elif n+s>=82 and turn<4: #Важно: эта проверка сработает только в том случае, если сейчас первый или третий ход.
  38.         return False
  39.     if turn%2 == 1: #Далее по аналогии с 20 заданием: ходы победителя с or, проигравшего с and
  40.         return IsItSolutionFor21(n+1,s,turn+1) or IsItSolutionFor21(n*4,s,turn+1) or IsItSolutionFor21(n,s+1, turn+1) or IsItSolutionFor21(n,s*4, turn+1)
  41.     else:
  42.         return IsItSolutionFor21(n+1,s,turn+1) and IsItSolutionFor21(n*4,s,turn+1) and IsItSolutionFor21(n,s+1, turn+1) and IsItSolutionFor21(n,s*4, turn+1)
  43.  
  44. def CheckWinTurn2(n,s, turn): #Дополнение: так как имеем условие, что игрок не должен гарантированно победить на втором
  45.                               #ходу, делаем проверку на гарантированную победу вторым ходом.
  46.     if n+s>=82 and turn==2:
  47.         return True
  48.     elif n+s<82 and turn==2:
  49.         return False
  50.     if turn%2 == 1:
  51.         return CheckWinTurn2(n+1,s,turn+1) or CheckWinTurn2(n*4,s,turn+1) or CheckWinTurn2(n,s+1, turn+1) or CheckWinTurn2(n,s*4, turn+1)
  52.     else:
  53.         return CheckWinTurn2(n+1,s,turn+1) and CheckWinTurn2(n*4,s,turn+1) and CheckWinTurn2(n,s+1, turn+1) and CheckWinTurn2(n,s*4, turn+1)
  54.  
  55.  
  56.  
  57. for i in range(1,77):
  58.     if IsItSolutionFor19(4,i,0):
  59.         print('its answr for 19:', i)
  60.         break
  61.  
  62. print('its answrs for 20:')
  63. for i in range(1,77):
  64.     if IsItSolutionFor20(4,i,0):
  65.         print(i)
  66.  
  67. for i in range(1,77):
  68.     if IsItSolutionFor21(4,i,0) and not CheckWinTurn2(4,i,0):
  69.         print('its answr for 21:',i)
  70.  
Advertisement
Add Comment
Please, Sign In to add comment