Line 250:
Line 250:
*** [[Nim (Easy Mode) (Cheat Mode)]]
*** [[Nim (Easy Mode) (Cheat Mode)]]
** [[Nim (Pedantic Mode)]]
** [[Nim (Pedantic Mode)]]
+
*** [[Nim (Pedantic Mode) (Easy Mode)]]
* [[Balanced ternary]]
* [[Balanced ternary]]
* [[Φιnary]]
* [[Φιnary]]
Line 943:
Line 944:
print("\n==== WIKITXT ====\n")
print("\n==== WIKITXT ====\n")
print(elements)
print(elements)
+
</syntaxhighlight>
+
===[[Nim (Pedantic Mode) (Easy Mode)]] generator===
+
<syntaxhighlight lang="python">
+
#!/bin/python3
+
import math
+
import random
+
import warnings
+
+
import mwcollapse
+
+
class nimstate:
+
__slots__ = "piles", "prev"
+
def __init__(self, piles, prev):
+
self.piles = tuple(piles)
+
self.prev = prev
+
def __eq__(self, other):
+
return False if other == None else self.piles == other.piles and self.prev == other.prev
+
def __hash__(self):
+
return hash(self.piles) ^ hash(self.prev)
+
+
def parity(iterable):
+
p = 0
+
for n in iterable:
+
p ^= n
+
return p
+
+
nurpos = (2, 4, 3, 6, 4)
+
nurposcount = tuple(range(len(nurpos)))
+
offsets = tuple(sum(nurpos[0:n]) for n in range(len(nurpos)))
+
count = offsets[-1] + nurpos[-1]
+
+
def transition(state, transition):
+
l = list(state.piles)
+
if transition != None:
+
if (state.prev == None or transition == state.prev) and l[transition] != 0:
+
l[transition] -= 1
+
return nimstate(l, transition)
+
elif state.prev != None:
+
m = max(l)
+
if m != 0:
+
moves = []
+
#Try to find a winning move
+
for n in range(1, m + 1):
+
for i in nurposcount:
+
l[i] -= n
+
if l[i] >= 0 and parity(l) == 0:
+
moves.append(nimstate(l, None))
+
l = list(state.piles)
+
if len(moves) != 0:
+
return random.choice(moves)
+
#If that fails, try to find a move resulting in no duplicate piles
+
for n in range(1, m + 1):
+
for i in nurposcount:
+
if l[i] >= n:
+
yes = True
+
l[i] -= n
+
for j in nurposcount:
+
if i != j and l[i] == l[j]:
+
yes = False
+
break
+
if yes:
+
moves.append(nimstate(l, None))
+
l = list(state.piles)
+
if len(moves) != 0:
+
return random.choice(moves)
+
#If that fails, just do whatever
+
n = random.choice([i for i in nurposcount if l[i] != 0])
+
l[n] -= random.randint(1, l[n])
+
return nimstate(l, None)
+
def stategen(state):
+
l = []
+
for i, n in enumerate(state.piles):
+
l.extend(k < n for k in range(nurpos[i]))
+
l.extend((state.prev == None, state.prev != None) if max(state.piles) == 0 else (False, False))
+
return l
+
+
stateMachine = mwcollapse.genStateMachine((*range(len(nurpos)), None), transition, stategen, nimstate(nurpos, None))
+
elementContainer = mwcollapse.ElementContainer(
+
*(mwcollapse.Element("div",
+
'<p class="nurpons">',
+
*(mwcollapse.Collapsible("span", k, "[[File:Nerpawhite.png|64px|link=]]") for k in range(o, o + nurpos[i])),
+
'</p>\n<p class="nimbuttons">',
+
mwcollapse.Trigger("span", i, "Remove one", attributes={"class": "nimbutton"}),
+
'<span class="nobutton">Remove one</span>',
+
"</p>\n", attributes={"class": "pile"}) for i, o in enumerate(offsets)),
+
'<p class="nimbuttons">',
+
mwcollapse.Trigger("span", None, "End turn", attributes={"class": "nimbutton"}),
+
'<span class="nobutton">End turn</span>',
+
"</p>\n",
+
mwcollapse.Collapsible("p", count, "YOU LOSE<br/>[https://camp2.rectangle.zone/index.php?title=Nim_(Pedantic_Mode)_(Easy_Mode) TRY AGAIN]", attributes={"class": "bigtexty"}),
+
mwcollapse.Collapsible("p", count + 1, "YOU [[Nim (Pedantic Mode) (Easy Mode)/Wiki Camp 2 Challenge Crystal|WIN]]", attributes={"class": "bigtexty"}))
+
elementContainer.compile("nim", stateMachine)
+
print(elementContainer)
</syntaxhighlight>
</syntaxhighlight>
==Kepler–Poinsot polyhedra==
==Kepler–Poinsot polyhedra==