Python
# 1 куча: +3 +6 *3
def f(s,m):
if s >= 132: return m % 2 == 0
if m == 0: return 0
h = [f(s+3,m-1), f(s+6,m-1), f(s*3,m-1)]
return any(h) if m % 2 != 0 else all(h)
# для 19 номера all может меняться на any если вопрос звучит "НЕУДАЧНЫЙ ХОД"
print('#19', [s for s in range(1,132) if f(s,2)])
print('#20', [s for s in range(1,132) if f(s,3) and not(f(s,1))])
print('#21', [s for s in range(1,132) if f(s,4) and not(f(s,2))]) Способ 2
# 2 кучи: +3 *3 в любую из куч
def f(x,y,m):
if (x+y) >= 77: return m % 2 == 0
if m == 0: return 0
h = [f(x+3,y,m-1), f(x*3,y,m-1), f(x,y+3,m-1), f(x,y*3,m-1)]
return any(h) if m % 2 != 0 else all(h)
# все, что менял в 19 номере, верни обратно для 20 и 21
print('#19', [s for s in range(1,65) if f(12,s,2)])
print('#20', [s for s in range(1,65) if f(12,s,3) and not(f(12,s,1))])
print('#21', [s for s in range(1,65) if f(12,s,4) and not(f(12,s,2))]) 📚 Теория
Теория игр: any() — текущий игрок выбирает лучший ход, all() — противник играет оптимально. all→any только в 19 номере если вопрос про «неудачный ход».