enum class GameState: int {
template<typename GamePosition>
std::unordered_map<GamePosition, GameState> gameStateMemo;
template<typename GamePosition>
auto evaluateGameState(GamePosition position, auto const& getNextGamePositions, auto const& getKnownStates) -> GameState {
auto& memo = gameStateMemo<GamePosition>;
if (auto it = memo.find(position); it != memo.end()) {
auto& gameState = memo[position];
if (auto stateOpt = getKnownStates(position); stateOpt) {
gameState = GameState::losing;
getNextGamePositions(position, [&](auto const& nextGamePosition) {
auto nextGameState = evaluateGameState(nextGamePosition, getNextGamePositions, getKnownStates);
if (nextGameState == GameState::losing) {
gameState = GameState::winning;
using GamePosition = std::vector<int>;
auto getKnownStates = [](GamePosition& position) -> std::optional<GameState> {
auto getNextGamePositions = [](GamePosition& position, auto const& callback) {
evaluateGameState(position, getNextGamePositions, getKnownStates)