# 2d S-G function for chomp def mex(S): i = 0 while i < len(S) and i in S: i += 1 return i def bite(state, x): ns = list(state) for i in range(x[1], len(ns)): ns[i] = x[0] return tuple(ns) def empty(state): for e in state: if e != 0: return False return True @CachedFunction def SG(state): if empty(state): return mex([]) s = [] for i in range(len(state)): for j in range(state[i]): ns = bite(state, (j, i)) s.append(SG(ns)) return mex(s) ------------------------------------- And second for 3d one: # 3d S-G function for chomp def mex3D(S): i = 0 while i < len(S) and i in S: i += 1 return i def list_state(state): return [[j for j in l] for l in state] def tuple_state(lstate): return tuple([tuple(l) for l in lstate]) def bite3D(state, x): ns = list_state(state) for i in range(x[1], len(ns)): for j in range(x[0], len(ns[i])): ns[i][j] = x[2] return tuple_state(ns) def empty3D(state): for e in state: for f in e: if f != 0: return False return True @CachedFunction def SG3D(state): if empty3D(state): return mex([]) s = [] for i in range(len(state)): for j in range(len(state[i])): for k in range(state[i][j]): ns = bite3D(state, (j, i, k)) s.append(SG3D(ns)) return mex(s) --------------------------------