Line 533:
Line 533:
stateMachine = mwcollapse.genStateMachine((0, 1), transition, stategen, (nurpos, 3))
stateMachine = mwcollapse.genStateMachine((0, 1), transition, stategen, (nurpos, 3))
elementContainer = mwcollapse.ElementContainer('<p class="nurpons">', *(mwcollapse.Collapsible("span", n, "[[File:Nerpawhite.png|64px|link=]]") for n in range(nurpos)), '</p>\n<p class="nimbuttons">', mwcollapse.Trigger("span", 1, "Remove one", attributes={"class": "nimbutton"}), '<span class="nobutton">Remove one</span></p>\n<p class="nimbuttons">', mwcollapse.Trigger("span", 0, "End turn", attributes={"class": "nimbutton"}), '<span class="nobutton">End turn</span></p>', mwcollapse.Collapsible("p", nurpos, "YOU LOSE", attributes={"class": "bigtexty"}), mwcollapse.Collapsible("p", nurpos + 1, "YOU [[Win|WIN]]", attributes={"class": "bigtexty"}))
elementContainer = mwcollapse.ElementContainer('<p class="nurpons">', *(mwcollapse.Collapsible("span", n, "[[File:Nerpawhite.png|64px|link=]]") for n in range(nurpos)), '</p>\n<p class="nimbuttons">', mwcollapse.Trigger("span", 1, "Remove one", attributes={"class": "nimbutton"}), '<span class="nobutton">Remove one</span></p>\n<p class="nimbuttons">', mwcollapse.Trigger("span", 0, "End turn", attributes={"class": "nimbutton"}), '<span class="nobutton">End turn</span></p>', mwcollapse.Collapsible("p", nurpos, "YOU LOSE", attributes={"class": "bigtexty"}), mwcollapse.Collapsible("p", nurpos + 1, "YOU [[Win|WIN]]", attributes={"class": "bigtexty"}))
+
elementContainer.compile("nim", stateMachine)
+
print(elementContainer)
+
</syntaxhighlight>
+
===[[Nim (Pedantic Mode)]] generator===
+
<syntaxhighlight lang="python">
+
#!/bin/python3
+
import math
+
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, 5)
+
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:
+
for n in range(max(nurpos)):
+
for i in range(len(nurpos)):
+
l[i] -= n
+
if l[i] >= 0 and parity(l) == 0:
+
return nimstate(l, None)
+
l = list(state.piles)
+
def stategen(state):
+
l = []
+
for i, n in enumerate(state.piles):
+
l.extend(k < n for k in range(nurpos[i]))
+
l.append(max(state.piles) == 0)
+
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", attributes={"class": "bigtexty"}))
elementContainer.compile("nim", stateMachine)
elementContainer.compile("nim", stateMachine)
print(elementContainer)
print(elementContainer)