Code: Select all
import golly as g
from glife import *
import math
import os
climberDX = 15
climberDY = -11
climberDT = 107
spineDX = -1
spineDY = -1
spineDT = 4
climberSpineShiftX = -47
climberSpineShiftY = -3
climberSpineShiftT = 2
#x mod m
def mod(x,m):
return ((x % m) + m) % m
#climberTimesAndTypesList[i][0] = (the number of generations offset) / 4
#climberTimesAndTypesList[i][1] = 0 if Default, 1 if GliderSW
climberTimesAndTypesList = [[28,1],[26,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],
[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],
[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],
[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],
[24,0],[25,0],[36+87*(10+75)-151*49,0],[25,0],[25,0],[25,0],[25,0],[25,0],
[28,1],[23,0],[27,0],[36+151*3,0],[25,0],[25,0],[25,0],[25,0],
[47+4*99,1],[24,1],[28,0],
[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],[25,0],
[28,1],[23,0],[40,1],[23,0],[39,0],[24,0]]
#Basic 2x Thing:
#[[0,1],[23,1],[60,0]]
#2x Boatlayer
#[[28,1],[56,1],[23,0],[147,0],[25,0],[25,0]]
#2x SE rake
#[[28,1],[56,1],[23,0],[148,0],[24,0],[25,0],[25,0]]
#2x SW rake
#[[28,1],[56,1],[23,1],[147,0],[25,0],[25,0]]
#2x SW rake compact
#[[28,1],[43,1],[56,1],[23,0],[148,0],[24,0],[25,0],[25,0]]
#Tail blocks deleter:
#[[28,1],[23,0],[40,1],[23,0],[39,0],[24,0]]
#Tail blocks deleter 2:
#[[28,1],[23,0],[27,0],[36+151*0,0],[25,0],[24,0],[24,0]]
#Ex Extended backwards glider shooter:
#[[28,1],[23,0],[27,0],[36+151,0],[25,0],[25,0],[25,0],[25,0],[24,0],[24,0]]
def main():
#g.addlayer();
g.new("ShipBuilder")
#Initial trail segment
for i in range(1024):
g.putcells(g.parse("2bo$b2o$bobo14$43b2o$43bobo$43bo7$bo$2o$obo5$85b2o$84b2o$86bo7$42b2o$42bobo$42bo5$126b3o$126bo$127bo7$84b2o$83b2o$85bo14$125b3o$125bo$126bo!"),
167*i, 63*i)
#The spine
spineStates = [g.parse("2bo$b2o$bobo23$bo$2o$obo!", 0, 0)]
for i in range(spineDT - 1):
spineStates.append(g.evolve(spineStates[i],1))
#The climber combinations
#SE gliders are created by placing climber combinations close enough to destroy some of the blocks
climberStatesDefault = [g.parse("25b2o$23b2o2bo$23b2ob2o$25bo$11b3o2$19bobo$9bo8bob3o$8bobo8bo6bo$9bo7b2o3bo3bo$18bobo2b2obo$16bobo6bo$17bo3$67bo$66b2o$66bobo3$bo4b2o$obo5bo$b2o2bo2bo$7b2o$5bobo$3b4o$2bob2o$2b3obobo2$8bo2$11b2o6$18b2o$17b2o$19bo9bo18bo$30b2o16bo17bo$29b2o17bo16b2o$53bo2b3o6bobo$45bo5bobo4bo$44bobo3b2o3bo2bo$45bo4b2o2bo2bo$51b2o3bo$49bo2b4o$49b2o2$41bo2$38b3o3b2o$39b2o2bo$36b2o$36b2o$36b2o3bo$40bo2bob2o$38b3o2bobo2bo$37bo4b2o4bo$37b2obobo2bo3bo$39bo6b3o$41bo4b3o$38b3o$34b2o3bo$35b4o$37b2o!",
-65,-15)]
climberStatesGliderSW = [g.parse("25bo$24bobo$23bo3bo$23bo3b2o$23bobob2o$23bo3b2o$11b3o10b3o$21b2o$21b2o$9bo8bob2o$8bobo6bob2obob3o$9bo7b2obo4bobo$17bobo7bo$16bo2bo3b4o$17bobo3b2o$18bo$66bo$65b2o$65bobo4$bo6b2o$obo4bo$b2o$8bo$5b2ob2o$6bobo$7bo10$17b2o$16b2o$18bo28bo$47bo17bo$30bo16bo16b2o$31b2o19bo2b3o6bobo$30b2o12bo5bobo4bo$43bobo3b2o3bo2bo$44bo4b2o2bo2bo$50b2o3bo$48bo2b4o$48b2o2$40bo2$37b3o3b2o$38b2o2bo$35b2o$35b2o$35b2o3bo$39bo2bob2o$37b3o2bobo2bo$36bo4b2o4bo$36b2obobo2bo3bo$38bo6b3o$40bo4b3o$37b3o$33b2o3bo$34b4o$36b2o!",
-64,-16)]
for i in range(climberDT - 1):
climberStatesDefault.append(g.evolve(climberStatesDefault[i],1))
climberStatesGliderSW.append(g.evolve(climberStatesGliderSW[i],1))
allClimberStates = [climberStatesDefault, climberStatesGliderSW]
spineX = 0
spineY = 0
spineT = 0
for climberIndex in range(len(climberTimesAndTypesList)):
spineStepsToClimber = climberTimesAndTypesList[climberIndex][0]
climberType = climberTimesAndTypesList[climberIndex][1]
newSpineT = spineT - spineStepsToClimber * spineDT
newSpineX = spineX + spineStepsToClimber * spineDX
newSpineY = spineY + spineStepsToClimber * spineDY
#Add needed intermediate spine elements
for i in range(-((spineT) // climberDT)+1, -(newSpineT // climberDT)):
intermediateSpineT = spineT + i * climberDT
intermediateSpineX = spineX - i * climberDX
intermediateSpineY = spineY - i * climberDY
g.putcells(spineStates[mod(intermediateSpineT, spineDT)],
intermediateSpineX + (intermediateSpineT // spineDT) * spineDX,
intermediateSpineY + (intermediateSpineT // spineDT) * spineDY)
#Add next climber
g.putcells(allClimberStates[climberType][mod(newSpineT, climberDT)],
newSpineX + (newSpineT // climberDT) * climberDX,
newSpineY + (newSpineT // climberDT) * climberDY)
spineT = newSpineT + climberSpineShiftT
spineX = newSpineX + climberSpineShiftX
spineY = newSpineY + climberSpineShiftY
#adding another spacing unit in between SE and SW gives a (-0.5,-2.5) offset change for the SE glider
# Adding 2 of these gives a (-1,-5) offset change
#Moving the SE glider crawler back one gives a (-2,-2) offset change
#Using the previous SE glider gives (-11.25,-35.25)
#Using the previous SW glider gives (41.75,-37.75)
#Advancing 4 generations gives (2,0)
#Ex: To move (0,+8), we would need -(-1,-5)-(-2,-2)-(-2,-2)
main()