import golly as g
from functools import reduce

p = int(g.getstring("Period: "))
assert p % 2 == 0, "period must be even"

g.new(f"Period {p} oscillator")
g.setrule("B2ae/S")
g.autoupdate(False)

rep = [0, 0, 0, 1]

t = g.evolve([p, 0, p, 1], p)
xors = [p] + [t[2 * i] for i in range(1, len(t) // 4)]

g.putcells([-2, 0, -3, 1])
for i in range(p // 2):
    g.putcells(rep, 2 * i, 0)

mask = (1 << (p // 2)) - 1
cur = (1 << p) - 1
x = p // 2
while True:
    t = reduce(lambda x, y: x ^ y, [(cur >> (i // 2 - 1)) & 1 for i in xors])
    cur = ((cur << 1) ^ t) & ((1 << p) - 1)
    if t:
        g.putcells(rep, 2 * x, 0)
    x += 1
    if cur & mask == mask:
        g.putcells([0, 0, 1, 1], 2 * x, 0)
        break
#     if cur & mask == 0:
#         g.putcells([0, 0, 1, 1], 2 * x - p, 0)
#         break

g.fit()
g.update()
