#include "Set.hpp"
#include <iostream> /* template <unsigned int i, unsigned int ...set> struct MexSearch { static constexpr unsigned int value = (IsMemberInSet<i, set...>::is_member) ? MexSearch<i+1,set...>::value : i; }; */ template <unsigned int i, unsigned int ...set> struct MexSearch; template <unsigned int i, bool isMember, unsigned int ...set> struct MexSelect; template <unsigned int i, unsigned int ...set> struct MexSelect<i, true, set...> { static constexpr unsigned int value = MexSearch<i+1, set...>::value; }; template <unsigned int i, unsigned int ...set> struct MexSelect<i, false, set...> { static constexpr unsigned int value = i; }; template <unsigned int i, unsigned int ...set> struct MexSearch { static constexpr bool found = IsMemberInSet<i, set...>::is_member; static constexpr unsigned int value = MexSelect<i, found, set...>::value; }; template <unsigned int ...set> struct Mex { static constexpr unsigned int value = MexSearch<0, set...>::value; }; //------------------------------------------------------------------------------ template<unsigned int heap_size, unsigned int ... moves> struct Nim; template <unsigned int heap_size, unsigned int take, bool can_be_taken, unsigned int ... moves> struct NimTakeNextStep; template <unsigned int heap_size, unsigned int take, unsigned int ... moves> struct NimTakeNextStep<heap_size, take, false, moves...> { static constexpr unsigned int value = std::numeric_limits<unsigned int>::max(); }; template <unsigned int heap_size, unsigned int take, unsigned int ... moves> struct NimTakeNextStep<heap_size, take, true, moves...> { static constexpr unsigned int value = Nim<heap_size - take, moves...>::value; }; template <unsigned int heap_size, unsigned int take, unsigned int ... moves> struct NimTake { static constexpr unsigned int value = NimTakeNextStep<heap_size, take, take<=heap_size, moves...>::value; }; template <unsigned int heap_size, unsigned int ...moves> struct Nim { static constexpr unsigned int value = Mex<NimTake<heap_size, moves, moves...>::value...>::value; }; template <unsigned int ...moves> struct Nim<0, moves...> { static constexpr unsigned int value = 0; }; int main() { std::cout << "Mex<0, 1, 3, 4>::value = " << Mex<0, 1, 3, 4>::value << std::endl; std::cout << "Mex<0, 1, 2, 3, 4>::value = " << Mex<0, 1, 2, 3, 4>::value << std::endl; std::cout << "Mex<>::value = " << Mex<>::value << std::endl; std::cout << Nim<4, 2, 3, 4, 5>::value << std::endl; std::cout << Nim<14, 2, 5, 6>::value << std::endl; } |