Changes

Jump to navigation Jump to search
2,300 bytes added ,  00:03, 7 April 2024
no edit summary
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)
1,154

edits

Navigation menu