Changes

Jump to navigation Jump to search
3,787 bytes added ,  02:21, 15 July 2024
no edit summary
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==
1,154

edits

Navigation menu