Final size: 82038x71679 Finding the salvo creating the north lwss's was a challenge itself. I have used google sheet to check the local constraints ... syringe, collisions near the epicenter, collision with the previous ship.
I have chosen the timing "half manually".
It contained column generating lanes of lua code to describe individual ship timings. I have copy pasted these lanes to the lua script able to generate the salvo to be watched at its own. Longer collisions cause by gliders from north were debugged modifying timing in this script (updating the sheet not to introduce the "local" problems).
I have updated the salvo checking script to generate lua scripts for each of the corners to include them in "translation of EV2" pattern. I have modified the translation to position the result to be aligned with the original (and final) gun epicenter. This let me simplify composition of the 3 lwss skeleton with the 4 corners using stacked layers in golly. It was required too many times ... to adjust the timings to avoid collisions with other gliders in the gun recipe.
Code: Select all
local g = golly()
g.new("salvo")
local glider=g.parse("3o$o$bo!")
local logNE,logNW,logSW,logSE=io.open("ne\\lua.lua","w"),io.open("nw\\lua.lua","w"),io.open("sw\\lua.lua","w"),io.open("se\\lua.lua","w")
local extraphase=0
local function writeLog(log, msg)
if log then
log:write(msg.."\n")
end
end
writeLog(logNE,"m={}\nfunction m.salvo(put_yphase)")
writeLog(logNW,"m={}\nfunction m.salvo(put_yphase)")
writeLog(logSW,"m={}\nfunction m.salvo(put_yphase)")
writeLog(logSE,"m={}\nfunction m.salvo(put_yphase)")
local function put_glider_pair(side,phase)
local zero1X,zero1Y=45,31
local zero2X,zero2Y=51,53
local phaseShift,phase4=1+(phase//4), phase%4
if side == "R" then
g.putcells(g.evolve(glider,5-phase4),(zero1X-1)+phaseShift,(zero1Y-1)+phaseShift,1,0,0,1,"or")
g.putcells(g.evolve(glider,4-phase4),(zero2X-1)+phaseShift,(zero2Y-1)+phaseShift,1,0,0,1,"or")
writeLog(logSE," put_yphase(0,-"..phase..") -- pair 1 ("..side..","..phase..")")
writeLog(logSE," put_yphase(16,89-"..phase..") -- pair 2 ("..side..","..phase..")")
end
if side == "L" then
g.putcells(g.evolve(glider,5-phase4),3+(-zero1X-1)-phaseShift,(zero1Y-1)+phaseShift,-1,0,0,1,"or")
g.putcells(g.evolve(glider,4-phase4),3+(-zero2X-1)-phaseShift,(zero2Y-1)+phaseShift,-1,0,0,1,"or")
writeLog(logSW," put_yphase(0,-"..phase..") -- pair 1 ("..side..","..phase..")")
writeLog(logSW," put_yphase(16,89-"..phase..") -- pair 2 ("..side..","..phase..")")
end
end
local function put_lwss_glider(side,parity,phase)
local zero3XA,zero3Y={8,0},32
zero3X=zero3XA[parity+1]
local loopShift=-29-zero3X
local phaseShift,phase4=1+(phase//4), phase%4
if side == "R" then
g.putcells(g.evolve(glider,5-phase4),1+zero3X-phaseShift,(zero3Y-1)+phaseShift,-1,0,0,1,"or")
writeLog(logSW," put_yphase("..loopShift..",85-"..phase..")--lwss ("..side..","..parity..","..phase..")")
end
if side == "L" then
g.putcells(g.evolve(glider,5-phase4),0-zero3X+phaseShift,(zero3Y-1)+phaseShift,1,0,0,1,"or")
writeLog(logSE," put_yphase("..loopShift..",85-"..phase..")--lwss ("..side..","..parity..","..phase..")")
end
end
local function put_block_glider(side,parity,num,phase) --78,12 91,30
local zero4XA,zero4YA={60,78},{-1,12}
zero4X,zero4Y=zero4XA[parity+1],zero4YA[parity+1]
local loopShift,phaseYshift=zero4X+zero4Y,4*zero4Y
local phaseShift,phase4=2+(phase//4), phase%4
local rnum=(95-num)//2
if side == "R" then
g.putcells(g.evolve(glider,7-phase4),-1+zero4X+phaseShift+31*rnum,1+zero4Y-phaseShift+31*rnum,1,0,0,-1,"or")
writeLog(logNE," put_yphase("..loopShift+62*rnum..","..-phase+phaseYshift+31*4*rnum..")--block ("..side..","..parity..","..num..","..phase..")")
end
if side == "L" then
g.putcells(g.evolve(glider,7-phase4),2-zero4X-phaseShift-31*rnum,1+zero4Y-phaseShift+31*rnum,-1,0,0,-1,"or")
writeLog(logNW," put_yphase("..loopShift+62*rnum..","..-phase+phaseYshift+31*4*rnum..")--block ("..side..","..parity..","..num..","..phase..")")
end
end
local function put_n_lwss_glider_collision(sidenumber,_phase)
local phase=extraphase+_phase
local side,num = string.sub(sidenumber,1,1),string.sub(sidenumber,2,-1)
local parity = (1+num) % 2
put_glider_pair(side,phase)
put_lwss_glider(side,parity,phase)
put_block_glider(side,parity,num,phase)
end
put_n_lwss_glider_collision('R1',302)
put_n_lwss_glider_collision('L1',453)
put_n_lwss_glider_collision('R2',604)
put_n_lwss_glider_collision('L2',755)
put_n_lwss_glider_collision('R3',906)
put_n_lwss_glider_collision('L3',1057)
put_n_lwss_glider_collision('R4',1208)
put_n_lwss_glider_collision('L4',1359)
put_n_lwss_glider_collision('R5',1510)
put_n_lwss_glider_collision('L5',1661)
put_n_lwss_glider_collision('R6',1812)
put_n_lwss_glider_collision('L6',1963)
put_n_lwss_glider_collision('R7',2114)
put_n_lwss_glider_collision('L7',2265)
put_n_lwss_glider_collision('R8',2416)
put_n_lwss_glider_collision('L8',2567)
put_n_lwss_glider_collision('R9',2718)
put_n_lwss_glider_collision('L9',2869)
put_n_lwss_glider_collision('R10',3020)
put_n_lwss_glider_collision('L10',3171)
put_n_lwss_glider_collision('R11',3322)
put_n_lwss_glider_collision('L11',3473)
put_n_lwss_glider_collision('R12',3624)
put_n_lwss_glider_collision('L12',3775)
put_n_lwss_glider_collision('R13',3926)
put_n_lwss_glider_collision('L13',4077)
put_n_lwss_glider_collision('R14',4228)
put_n_lwss_glider_collision('L14',4379)
put_n_lwss_glider_collision('R15',4530)
put_n_lwss_glider_collision('L15',4681)
put_n_lwss_glider_collision('R16',4832)
put_n_lwss_glider_collision('L16',4983)
put_n_lwss_glider_collision('R17',5134)
put_n_lwss_glider_collision('L17',5285)
put_n_lwss_glider_collision('R18',5436)
put_n_lwss_glider_collision('L18',5587)
put_n_lwss_glider_collision('R19',7421)
put_n_lwss_glider_collision('L19',7440)
put_n_lwss_glider_collision('R20',7499)
put_n_lwss_glider_collision('L20',7597)
put_n_lwss_glider_collision('R21',7651)
put_n_lwss_glider_collision('L21',7727)
put_n_lwss_glider_collision('R22',7771)
put_n_lwss_glider_collision('L22',7830)
put_n_lwss_glider_collision('R23',7901)
put_n_lwss_glider_collision('L23',7920)
put_n_lwss_glider_collision('R24',7979)
put_n_lwss_glider_collision('L24',8102)
put_n_lwss_glider_collision('R25',8131)
put_n_lwss_glider_collision('L25',8191)
put_n_lwss_glider_collision('R26',8251)
put_n_lwss_glider_collision('L26',8310)
put_n_lwss_glider_collision('R27',8381)
put_n_lwss_glider_collision('L27',8400)
put_n_lwss_glider_collision('R28',8522)
put_n_lwss_glider_collision('L28',8607)
put_n_lwss_glider_collision('R29',8779)
put_n_lwss_glider_collision('L29',8909)
put_n_lwss_glider_collision('R30',12952)
put_n_lwss_glider_collision('L30',12971)
put_n_lwss_glider_collision('R31',13060)
put_n_lwss_glider_collision('L31',13082)
put_n_lwss_glider_collision('R32',13134)
put_n_lwss_glider_collision('L32',13156)
put_n_lwss_glider_collision('R33',13223)
put_n_lwss_glider_collision('L33',13245)
put_n_lwss_glider_collision('R34',13302)
put_n_lwss_glider_collision('L34',13392)
put_n_lwss_glider_collision('R35',13462)
put_n_lwss_glider_collision('L35',13513)
put_n_lwss_glider_collision('R36',13576)
put_n_lwss_glider_collision('L36',13633)
put_n_lwss_glider_collision('R37',13665)
put_n_lwss_glider_collision('L37',13722)
put_n_lwss_glider_collision('R38',13743)
put_n_lwss_glider_collision('L38',13796)
put_n_lwss_glider_collision('R39',13892)
put_n_lwss_glider_collision('L39',13955)
put_n_lwss_glider_collision('R40',13974)
put_n_lwss_glider_collision('L40',14074)
put_n_lwss_glider_collision('R41',14102)
put_n_lwss_glider_collision('L41',14163)
put_n_lwss_glider_collision('R42',14182)
put_n_lwss_glider_collision('L42',14305)
put_n_lwss_glider_collision('R43',14334)
put_n_lwss_glider_collision('L43',14394)
put_n_lwss_glider_collision('R44',14413)
put_n_lwss_glider_collision('L44',14513)
put_n_lwss_glider_collision('R45',14542)
put_n_lwss_glider_collision('L45',14602)
put_n_lwss_glider_collision('R46',14636)
put_n_lwss_glider_collision('L46',14744)
put_n_lwss_glider_collision('R47',14773)
put_n_lwss_glider_collision('L47',14833)
put_n_lwss_glider_collision('R48',14852)
put_n_lwss_glider_collision('L48',14967)
put_n_lwss_glider_collision('R49',14986)
put_n_lwss_glider_collision('L49',15056)
put_n_lwss_glider_collision('R50',15164)
put_n_lwss_glider_collision('L50',15317)
put_n_lwss_glider_collision('R51',15435)
put_n_lwss_glider_collision('L51',15553)
put_n_lwss_glider_collision('R52',15704)
put_n_lwss_glider_collision('L52',15855)
put_n_lwss_glider_collision('R53',16006)
put_n_lwss_glider_collision('L53',16157)
put_n_lwss_glider_collision('R54',16308)
put_n_lwss_glider_collision('L54',16459)
put_n_lwss_glider_collision('R55',16610)
put_n_lwss_glider_collision('L55',16761)
put_n_lwss_glider_collision('R56',16912)
put_n_lwss_glider_collision('L56',17439)
put_n_lwss_glider_collision('R57',17919)
put_n_lwss_glider_collision('L57',17989)
put_n_lwss_glider_collision('R58',18066)
put_n_lwss_glider_collision('L58',18095)
put_n_lwss_glider_collision('R59',18244)
put_n_lwss_glider_collision('L59',18298)
put_n_lwss_glider_collision('R60',18322)
put_n_lwss_glider_collision('L60',18420)
put_n_lwss_glider_collision('R61',18474)
put_n_lwss_glider_collision('L61',18623)
put_n_lwss_glider_collision('R62',18788)
put_n_lwss_glider_collision('L62',18875)
put_n_lwss_glider_collision('R63',19050)
put_n_lwss_glider_collision('L63',19177)
put_n_lwss_glider_collision('R64',19328)
put_n_lwss_glider_collision('L64',19479)
put_n_lwss_glider_collision('R65',19630)
put_n_lwss_glider_collision('L65',19781)
put_n_lwss_glider_collision('R66',19932)
put_n_lwss_glider_collision('L66',20083)
put_n_lwss_glider_collision('R67',20234)
put_n_lwss_glider_collision('L67',20480)
put_n_lwss_glider_collision('R68',20663)
put_n_lwss_glider_collision('L68',20687)
put_n_lwss_glider_collision('R69',20925)
put_n_lwss_glider_collision('L69',21042)
put_n_lwss_glider_collision('R70',21140)
put_n_lwss_glider_collision('L70',21291)
put_n_lwss_glider_collision('R71',21450)
put_n_lwss_glider_collision('L71',21593)
put_n_lwss_glider_collision('R72',21744)
put_n_lwss_glider_collision('L72',21895)
put_n_lwss_glider_collision('R73',22051)
put_n_lwss_glider_collision('L73',22197)
put_n_lwss_glider_collision('R74',22348)
put_n_lwss_glider_collision('L74',22499)
put_n_lwss_glider_collision('R75',22660)
put_n_lwss_glider_collision('L75',22826)
put_n_lwss_glider_collision('R76',22952)
put_n_lwss_glider_collision('L76',23195)
put_n_lwss_glider_collision('R77',23261)
put_n_lwss_glider_collision('L77',23412)
put_n_lwss_glider_collision('R78',23588)
put_n_lwss_glider_collision('L78',23707)
put_n_lwss_glider_collision('R79',23858)
put_n_lwss_glider_collision('L79',24009)
put_n_lwss_glider_collision('R80',24221)
put_n_lwss_glider_collision('L80',24311)
put_n_lwss_glider_collision('R81',24462)
put_n_lwss_glider_collision('L81',24613)
put_n_lwss_glider_collision('R82',24785)
put_n_lwss_glider_collision('L82',24915)
put_n_lwss_glider_collision('R83',25066)
put_n_lwss_glider_collision('L83',25217)
put_n_lwss_glider_collision('R84',25411)
put_n_lwss_glider_collision('L84',25587)
put_n_lwss_glider_collision('R85',25682)
put_n_lwss_glider_collision('L85',25821)
put_n_lwss_glider_collision('R86',25988)
put_n_lwss_glider_collision('L86',26123)
put_n_lwss_glider_collision('R87',26274)
put_n_lwss_glider_collision('L87',26425)
put_n_lwss_glider_collision('R88',26637)
put_n_lwss_glider_collision('L88',26772)
put_n_lwss_glider_collision('R89',26878)
put_n_lwss_glider_collision('L89',27059)
put_n_lwss_glider_collision('R90',27180)
put_n_lwss_glider_collision('L90',27338)
put_n_lwss_glider_collision('R91',27505)
put_n_lwss_glider_collision('L91',27633)
put_n_lwss_glider_collision('R92',27834)
put_n_lwss_glider_collision('L92',27962)
put_n_lwss_glider_collision('R93',28111)
put_n_lwss_glider_collision('L93',28239)
local function hide()
end
--hide()
writeLog(logNE,"end\n\nreturn m")
writeLog(logNW,"end\n\nreturn m")
writeLog(logSW,"end\n\nreturn m")
writeLog(logSE,"end\n\nreturn m")
logNE:close()
logNW:close()
logSW:close()
logSE:close()
g.setbase(2)
g.setstep(8)
g.fit()
Code: Select all
local g = golly()
local ne = require("ne.lua")
local nw = require("nw.lua")
local se = require("se.lua")
local sw = require("sw.lua")
local SW = g.parse("22bo$20b3o$19bo$18bobo$18bobo$19bo8$2b2o$bobo$bo21b2o$2o21bobo$25bo$16b2o7b2o$16b2o2$6bob2o$4b3ob2o$3bo$4b3ob2o$6b2o2bo$9bobo$5bob2obobo$5b2obo2bo16b2o$8bo19bo$8b2o16bobo$6b2o2bobo13b2o$5bo2bo2b2o$6b2o10$25b2o$9b2o14b2o$10bo$7b3o$7bo2$17b2o$13b2obobo$14bobo$14bob2o$11b2obo$11bo2b4o$12b2o3bo$14b3o$14bo$12bobo$12b2o5$28b2o$29bo$26b3o$26bo$27b2o$28bo$28bob2o$25b2ob2obo$25bobo$27bo$27b2o!")
local NE = g.parse("35b2o$34bobo$28b2o4bo$26bo2bo2b2ob4o$26b2obobobobo2bo$29bobobobo$29bobob2o$30bo2$43b2o$34b2o7bo$34b2o5bobo$41b2o6$9bo$8bobo20b2o17bo$6b3obo21bo15b3o$5bo4bob2o15b3o15bo$5bobobobobo14bo18b2o$2o4b2obobo17b3o3b2o$bo8bobo19bobobo14b2o$bobo7bo19b2obo15bo2bo$2b2o22b2obo2bob2o14b2obo$25bobob2o22b2o$25bobo22b2o3bo$24b2obo21bo2b3o$22bo4b2o2b2o15bob2o$12b2ob2o5b4o2bo2b2o10bo5bo2bo$12b2ob2o9b2o14bobo6b2o$24b2o16bobo$25bo17bo$24bo7b2o$25b3o4bo$27bo5b3o12b2o$35bo12b2o$33b2o$33bo$19b2o13bo$14b2obo2bo12b2o$13bobob3o$10bo2bobo$10b4ob3o$14bo3bo$12bobo2b2o$12b2o!")
local eater = g.parse("2o$bo$bobo$2b2o!")
local loopSizeX,loopSizeY=16332,-16335
local baseShiftX,baseShiftY=518426+35,319834+34
local loops0,loops1={},{}
g.setlayer(0)
local all_loop_cells0 = g.getcells({-7519,-207419,542333,527328})
g.setbase(2)
g.setstep(10)
detection_phaseshift = 1024
g.step()
local all_loop_cells1 = g.getcells({-7519,-207419,542333,527328})
g.reset()
g.setlayer(1)
g.new("some side")
local d=""
local period = 131072 -- 2^17
local lanes={}
local Yflip=false
for i=1,#all_loop_cells0,2 do
loopNo = (85 + (baseShiftX+baseShiftY) - (all_loop_cells0[i]+all_loop_cells0[i+1])) // 69
inLoopX,inLoopY=all_loop_cells0[i]-(baseShiftX-35*loopNo),all_loop_cells0[i+1]-(baseShiftY-34*loopNo)
if ((inLoopY<-10) and (inLoopY>-16275)) then
if (not loops0[loopNo]) then
loops0[loopNo]={}
--g.putcells(SW,baseShiftX-35*loopNo,baseShiftY-34*loopNo)
--g.putcells(NE,baseShiftX-35*loopNo+loopSizeX,baseShiftY-34*loopNo+loopSizeY)
end
loops0[loopNo][1+#loops0[loopNo]]={inLoopX,inLoopY}
local c=""
for i=1,#loops0[loopNo] do
c=c.."["..loops0[loopNo][i][1]..","..loops0[loopNo][i][2].."]"
end
if (not lanes[inLoopX+inLoopY]) then
lanes[inLoopX+inLoopY] = true
d=d..(inLoopX+inLoopY)..","
end
g.show((inLoopX+inLoopY) .. " " .. d .. " in1 " .. all_loop_cells0[i] .. "," .. all_loop_cells0[i+1] .. " " .. loopNo .. " " .. inLoopX .. "," .. inLoopY..":"..c)
--g.setcell(baseShiftX-35*loopNo+inLoopX,baseShiftY-34*loopNo+inLoopY,1)
--g.update()
end
end
--g.note("glider cells 0 detected")
for i=1,#all_loop_cells1,2 do
loopNo = (85 + (baseShiftX+baseShiftY) - (all_loop_cells1[i]+all_loop_cells1[i+1])) // 69
inLoopX,inLoopY=all_loop_cells1[i]-(baseShiftX-35*loopNo),all_loop_cells1[i+1]-(baseShiftY-34*loopNo)
if ((inLoopY<-10) and (inLoopY>-16275)) then
--g.show((inLoopX+inLoopY) .. " in2 " .. loopNo .. " " .. inLoopX .. "," .. inLoopY)
if (not loops1[loopNo]) then
loops1[loopNo]={}
if (not loops0[loopNo]) then
--g.putcells(SW,baseShiftX-35*loopNo,baseShiftY-34*loopNo)
--g.putcells(NE,baseShiftX-35*loopNo+loopSizeX,baseShiftY-34*loopNo+loopSizeY)
end
end
loops1[loopNo][1+#loops1[loopNo]]={inLoopX,inLoopY}
--g.setcell(baseShiftX-35*loopNo+inLoopX,baseShiftY-34*loopNo+inLoopY,1)
end
end
--g.note("glider cells 512 detected detecting phases")
local phases={}
local compressed_items = {}
local NW_pahseshift=453 -- to be set
local minLoopNoEst=1
local maxLoopNoEst=15028
local minLoopNo=15028
local maxLoopNo=1
local function put_phase(loopNo, phase)
for i=1,#phases[loopNo] do
if phases[loopNo][i]==phase then
return
end
end
phases[loopNo][1+#phases[loopNo]]=phase
end
for loopNo=minLoopNoEst,maxLoopNoEst do
if (loops0[loopNo] or loops1[loopNo]) then
if minLoopNo>loopNo then
minLoopNo=loopNo
end
if maxLoopNo<loopNo then
maxLoopNo=loopNo
end
phases[loopNo]={}
if (loops0[loopNo]) then
local c=""
for i=1,#loops0[loopNo] do
c=c.."["..loops0[loopNo][i][1]..","..loops0[loopNo][i][2].."]"
end
local per_dir={{},{}} --toSW=1,toNE=2
for i=1,#loops0[loopNo] do
local dir = ((loops0[loopNo][i][1]+loops0[loopNo][i][2] < 50) and 1) or 2
per_dir[dir][1+#per_dir[dir]]={loops0[loopNo][i][1],loops0[loopNo][i][2]}
end
local start_index=1
while (start_index+3 < #per_dir[1]) do
if per_dir[1][start_index][2]+2~=per_dir[1][start_index+4][2] then
start_index = start_index + 1 -- not whole glider visible
else
local x01dif = per_dir[1][start_index][1]-per_dir[1][start_index+1][1]
local choices01 = {-3,false,-2,0,-1}
g.show(c.." 01dif "..x01dif)
put_phase(loopNo, (4*per_dir[1][start_index][2]+choices01[x01dif+3])%period )
start_index=start_index+5
end
end
start_index=1
while (start_index+3 < #per_dir[2]) do
if per_dir[2][start_index][2]+2~=per_dir[2][start_index+4][2] then
start_index = start_index + 1 -- not whole glider visible
else
local x34dif = per_dir[2][start_index+3][1]-per_dir[2][start_index+4][1]
local choices34={-3,false,-2,0,-1}
g.show(c.." 34dif "..x34dif)
put_phase(loopNo, (NW_pahseshift-4*per_dir[2][start_index][2]+choices34[x34dif+3])%period )
start_index=start_index+5
end
end
end
if (loops1[loopNo]) then
local c=""
for i=1,#loops1[loopNo] do
c=c.."["..loops1[loopNo][i][1]..","..loops1[loopNo][i][2].."]"
end
local per_dir={{},{}} --toSW=1,toNE=2
for i=1,#loops1[loopNo] do
local dir = ((loops1[loopNo][i][1]+loops1[loopNo][i][2] < 50) and 1) or 2
per_dir[dir][1+#per_dir[dir]]={loops1[loopNo][i][1],loops1[loopNo][i][2]}
end
local start_index=1
while (start_index+3 < #per_dir[1]) do
if per_dir[1][start_index][2]+2~=per_dir[1][start_index+4][2] then
start_index = start_index + 1 -- not whole glider visible
else
local x01dif = per_dir[1][start_index][1]-per_dir[1][start_index+1][1]
local choices01 = {-3,false,-2,0,-1}
g.show(c.." 01dif "..x01dif)
put_phase(loopNo, (4*per_dir[1][start_index][2]+choices01[x01dif+3]-detection_phaseshift)%period )
start_index=start_index+5
end
end
start_index=1
while (start_index+3 < #per_dir[2]) do
if per_dir[2][start_index][2]+2~=per_dir[2][start_index+4][2] then
start_index = start_index + 1 -- not whole glider visible
else
local x34dif = per_dir[2][start_index+3][1]-per_dir[2][start_index+4][1]
local choices34={-3,false,-2,0,-1}
g.show(c.." 34dif "..x34dif)
put_phase(loopNo, (NW_pahseshift-4*per_dir[2][start_index][2]+choices34[x34dif+3]-detection_phaseshift)%period )
start_index=start_index+5
end
end
end
end
end
local log
local function writeLog(msg)
if log then
log:write(msg.."\n")
end
end
local function twice_x_plus_y(loopNo,phase)
return -loopNo*(4*34+2)+phase
end
local function log_phases(filename)
log = io.open(filename,"w")
for comp_no=1,#compressed_items do
writeLog(compressed_items[comp_no][1] .. ";" .. compressed_items[comp_no][2] .. ";" .. compressed_items[comp_no][3] .. ";" .. compressed_items[comp_no][4] .. ";" .. compressed_items[comp_no][5])
end
for loopNo=minLoopNo,maxLoopNo do
if (phases[loopNo]) then
local c=";"..#phases[loopNo]
for i=1,#phases[loopNo] do
c = c .. ";" .. phases[loopNo][i]
end
writeLog(loopNo..c)
end
end
log:close()
end
local function convert_to_compressed_item(start_loop_no,start_phase,loop_no_inc,phase_inc,rep)
writeLog("compressing "..start_loop_no..","..start_phase..","..loop_no_inc..","..phase_inc..","..rep)
if loop_no_inc%31==0 and loop_no_inc~=31 then
writeLog("ignoring 31k!")
return
end
if loop_no_inc%22==0 then
writeLog("ignoring 22k!")
return
end
compressed_items[1+#compressed_items]={start_loop_no,start_phase,loop_no_inc,phase_inc,rep}
for i=0,rep-1 do
for j=1,#phases[start_loop_no + loop_no_inc*i] do
if (phases[start_loop_no + loop_no_inc*i][j]-(start_phase+phase_inc*i) % period == 0) then
if #phases[start_loop_no + loop_no_inc*i]>1 then
table.remove(phases[start_loop_no + loop_no_inc*i],j)
writeLog((start_loop_no + loop_no_inc*i).."-"..j)
else
phases[start_loop_no + loop_no_inc*i] = nil
writeLog((start_loop_no + loop_no_inc*i).."-")
end
break
end
end
end
end
log_phases("c:\\Golly\\Patterns\\GUN_LeafBug\\LanePhases_ori.csv")
--compressed_item = start_loop_no, start_phase, loop_no_inc, phase_inc, repeat_number
local function compress_phases() -- there is no loop_no_inc=0 in the original pattern
log = io.open("c:\\Golly\\Patterns\\GUN_LeafBug\\compress.log","w")
for start_loop_no=minLoopNo,maxLoopNo do
if phases[start_loop_no] then
writeLog(start_loop_no)
local test_ok = false
for i=1,#phases[start_loop_no] do
start_phase = phases[start_loop_no][i]
writeLog(" "..start_phase)
for loop_no_inc=1,(15028-start_loop_no)//4 do
if phases[start_loop_no + loop_no_inc] then
writeLog(" "..loop_no_inc)
for j=1,#phases[start_loop_no + loop_no_inc] do
phase_inc = (phases[start_loop_no + loop_no_inc][j] - start_phase) % period
writeLog(" "..phase_inc)
local rep_req=3
for rep=2,rep_req do
test_ok = false
if phases[start_loop_no + loop_no_inc*rep] then
writeLog(" "..rep.." "..(start_loop_no + loop_no_inc*rep))
for k=1,#phases[start_loop_no + loop_no_inc*rep] do
writeLog(" "..((phases[start_loop_no + loop_no_inc*rep][k]-(start_phase+phase_inc*rep)) % period))
if (phases[start_loop_no + loop_no_inc*rep][k]-(start_phase+phase_inc*rep)) % period == 0 then
test_ok = true
break
end
end
end
if not test_ok then
break
end
end
if test_ok then
local rep=rep_req
while test_ok do
rep=rep+1
test_ok = false
if phases[start_loop_no + loop_no_inc*rep] then
writeLog(" "..rep.." "..(start_loop_no + loop_no_inc*rep))
for k=1,#phases[start_loop_no + loop_no_inc*rep] do
writeLog(" "..((phases[start_loop_no + loop_no_inc*rep][k]-(start_phase+phase_inc*rep)) % period))
if (phases[start_loop_no + loop_no_inc*rep][k]-(start_phase+phase_inc*rep)) % period == 0 then
test_ok = true
break
end
end
end
end
test_ok = true
local mrep=0
while test_ok do
mrep=mrep-1
test_ok = false
if phases[start_loop_no + loop_no_inc*mrep] then
writeLog(" "..mrep.." "..(start_loop_no + loop_no_inc*mrep))
for k=1,#phases[start_loop_no + loop_no_inc*mrep] do
writeLog(" "..((phases[start_loop_no + loop_no_inc*mrep][k]-(start_phase+phase_inc*mrep)) % period))
if (phases[start_loop_no + loop_no_inc*mrep][k]-(start_phase+phase_inc*mrep)) % period == 0 then
test_ok = true
break
end
end
end
end
mrep=mrep+1
convert_to_compressed_item(start_loop_no+mrep*loop_no_inc,start_phase+mrep*phase_inc,loop_no_inc,phase_inc,rep-mrep)
test_ok=true
break
end -- test_ok
if test_ok then
break --never mind missing start ... it will be find anyways ...
end
end --j 1 .. #phases[start_loop_no+loop_no_inc]
if test_ok then
break --never mind missing start ... it will be find anyways ...
end
end -- loop_no_inc
if test_ok then
break --never mind missing start ... it will be find anyways ...
end
end -- if phases[start_loop_no + loop_no_inc]
if test_ok then
break --never mind missing start ... it will be find anyways ...
end
end -- i 1 .. #phases[start_loop_no]
end --if phases[start_loop_no]
end --start_loop_no
log:close()
end
compress_phases()
log_phases("c:\\Golly\\Patterns\\GUN_LeafBug\\LanePhases_compressed.csv")
local isNW=(#compressed_items>8) and (compressed_items[8][5]==176) and (compressed_items[8][1]==6925)
local isNE=(#compressed_items>9) and (compressed_items[9][5]==176) and (compressed_items[9][1]==6925)
local isSW=(#compressed_items==7) and (compressed_items[6][5]==139) and (compressed_items[6][1]==2073)
local isSE=(#compressed_items==8) and (compressed_items[6][5]==114) and (compressed_items[6][1]==2073)
local lwss_cleanup_shift=3240 -- to be chosen hmm, shift codded incorrectly??
local NWextraShift=32769
local EatersExtraShift=32769+4000
local lane1_block_speedup=28-35*74
local extra_central_made_blocks = 68 -- no more possible they will collide with previous ship
local red_block5_delay = 1000
if isNW or isSW then
red_block5_delay = 1500
end
if isNW or isNE then
Yflip=true
local NE_changeLane1, NE_changeBrown, NE_lwssNcleanup_adjust, NE_lwssScleanup_adjust, NE_eatersAdjust = 0 ,0, 0, 0, 0
if isNW then
table.insert(compressed_items,3,{0,0,0,0,0}) -- now NW/NE "match" ... I do not understand the first division in the NE stream, but let it be as it is.
end
if isNE then
NE_changeLane1, NE_changeBrown, NE_lwssNcleanup_adjust, NE_lwssScleanup_adjust, NE_eatersAdjust = 201,27,20,-20, 10 -- constant diferences
end
--local eaterShift=123-176
local eaterShiftYflip=-15113+31+NE_eatersAdjust -- does not work changad somehow...
phases[5861][1]=phases[5861][1]-red_block5_delay
phases[6724]=nil -- to be replaced by an eater
phases[6755]=nil -- to be replaced by an eater
phases[6900]=nil -- to be replaced by an eater
phases[6931]=nil -- to be replaced by an eater
g.putcells(eater,baseShiftX+eaterShiftYflip+6724+EatersExtraShift,baseShiftY+EatersExtraShift)
g.putcells(eater,baseShiftX+eaterShiftYflip+6755+EatersExtraShift,baseShiftY+EatersExtraShift)
g.putcells(eater,baseShiftX+eaterShiftYflip+6900+EatersExtraShift,baseShiftY+EatersExtraShift)
g.putcells(eater,baseShiftX+eaterShiftYflip+6931+EatersExtraShift,baseShiftY+EatersExtraShift)
local brown_speedup = -100 + NE_changeBrown
local lane1_endphase = 115211 + NE_changeLane1
compressed_items[9][1]=13188-2*lwss_cleanup_shift -- -2k
compressed_items[9][2]=90000-16-128-46*426-67*4*lwss_cleanup_shift+426*175 + NE_lwssScleanup_adjust -- -67*4k south escaping lwss stream to W destroyal
compressed_items[9][3]=0
compressed_items[9][4]=-426
compressed_items[4][1]=13188-2*lwss_cleanup_shift
compressed_items[4][2]=10000+330+128-60*426-67*4*lwss_cleanup_shift+426*73 + NE_lwssNcleanup_adjust --north escaping lwss stream to W destroyal
compressed_items[4][3]=0
compressed_items[4][4]=-426
--compressed_items[4][2]=(compressed_items[4][2] + line1_block_speedup) % period
-- block creating salvo synchronized with the ship,
-- rephasing to avoid crossing irregular lwss streams will be done for individual lanes (synchronized with changes in gliders from SW)
--compressed_items[1][1]=4961 -- 1+31*(161-1)
--compressed_items[1][2]=90000+169 -- to be decided
--compressed_items[1][3]=-31
--compressed_items[1][4]=-4436-36*4 -- natural frequency
--compressed_items[1][5]=161 -- prolong it to replace north lwss streams
--table.remove(compressed_items,2)
local function lwss2block_color_correction(ci_idx, sign)
compressed_items[ci_idx][1]=compressed_items[ci_idx][1]+1*sign
compressed_items[ci_idx][2]=compressed_items[ci_idx][2]+4*34*sign
end
local step=31*4*35+62
local slope6=2*step-6*74
local slope5=2*step-5*74
local slope4=2*step-4*74
local slope3=2*step-3*74
local slope2=2*step-2*74
-- brown replanning ... 28 blocks of L2 lane it splits to odd and even, and depends on synchronization with yellow and red
compressed_items[6][1]=compressed_items[6][1]-3
compressed_items[6][2]=compressed_items[6][2] + brown_speedup
compressed_items[6][3]=0
compressed_items[6][4]=0
compressed_items[6][5]=1 -- let the 26th is considered to be part of slope2 region
table.insert(compressed_items,{compressed_items[6][1]+31,compressed_items[6][2]+step-1*74
,0,0,1}) -- 27th (the only odd in slope1)
table.insert(compressed_items,{compressed_items[6][1]+2*31,compressed_items[6][2]+2*step - 2*74
,62,slope4,3}) -- 26,24,22
table.insert(compressed_items,{compressed_items[6][1]+3*31,compressed_items[6][2]+3*step - 4*74
,62,slope4,2}) -- 25,23 (21 is considered to be start of slope 6)
table.insert(compressed_items,{compressed_items[6][1]+7*31,compressed_items[6][2]+7*step - 12*74
,62,slope6,11}) -- 21,19,...,1
table.insert(compressed_items,{compressed_items[6][1]+8*31,compressed_items[6][2]+8*step - 15*74
,62,slope6,10}) -- 20,18,...,2
-- dark red replanning ... 26 blocks of L2 lane to odd and even and is always interleaved with brown, but mostly also with yellow
compressed_items[7][1]=compressed_items[7][1]-3
compressed_items[7][2]=compressed_items[6][2] + (62+22)*4*35 -54 -- to be decided
compressed_items[7][3]=62
compressed_items[7][4]=slope4
compressed_items[7][5]=2 -- let the 22nd is considered to be part of slope3 region
table.insert(compressed_items,{compressed_items[7][1]+31,compressed_items[7][2]+step - 2*74
,compressed_items[7][3],compressed_items[7][4],compressed_items[7][5]}) -- odd blocks
table.insert(compressed_items,{compressed_items[7][1]+4*31,compressed_items[7][2]+4*step - 8*74
,compressed_items[7][3],slope6,11}) -- even blocks with slope6
table.insert(compressed_items,{compressed_items[7][1]+5*31,compressed_items[7][2]+5*step - 11*74
,compressed_items[7][3],slope6,10}) -- odd blocks with slope6 last block would have different slope
table.insert(compressed_items,{compressed_items[7][1]+25*31,compressed_items[7][2]+25*step -70*74
,0,0,1}) -- block 1
-- yellow replanning ... 20 blocks of L2 splist to odd and even and is always interleaved with one red and one brown
compressed_items[8][1]=compressed_items[8][1]-3
compressed_items[8][2]=compressed_items[6][2] + (4*62-22)*4*35 + -510 -- to be decided
compressed_items[8][3]=62
compressed_items[8][4]=slope6
compressed_items[8][5]=10
table.insert(compressed_items,{compressed_items[8][1]+31,compressed_items[8][2]+step - 3*74
,compressed_items[8][3],compressed_items[8][4],compressed_items[8][5]}) -- odd blocks
-- lane1 salvo replanning ... I would address it backwards as I do not know how far could I go.
-- this affects compressed_items[5] ... replaced, compressed_items[3],compressed_items[2],compressed_items[1] -- to be shortened and probably the slope chaned
local lane1_len = 33 + extra_central_made_blocks
if isNW then
compressed_items[2][5]=compressed_items[2][5] - extra_central_made_blocks
end
if isNE then
compressed_items[3][5]=compressed_items[3][5] - extra_central_made_blocks
if compressed_items[3][5]<0 then
compressed_items[2][5]=compressed_items[2][5] + compressed_items[3][5]
end
end
if compressed_items[2][5]<0 then
compressed_items[1][5]=compressed_items[1][5] + compressed_items[2][5]
end
compressed_items[5][1]=compressed_items[5][1]+(compressed_items[5][5]-1)*compressed_items[5][3] -3 -- backwards and shifted
compressed_items[5][2]=lane1_endphase
compressed_items[5][3]=-62
compressed_items[5][4]=-slope2
compressed_items[5][5]=(lane1_len+1)//2
table.insert(compressed_items,{compressed_items[5][1]-31,compressed_items[5][2]-(step - 1*74) -- to be decided
,-62,-slope2,lane1_len//2})
if isNE then
lwss2block_color_correction(#compressed_items-9,-1)
lwss2block_color_correction(#compressed_items-6,-1)
lwss2block_color_correction(#compressed_items-4,-1)
lwss2block_color_correction(#compressed_items,1)
lwss2block_color_correction(6,-1)
lwss2block_color_correction(7,-1)
lwss2block_color_correction(8,-1)
end
if isNW then
lwss2block_color_correction(#compressed_items-10,1)
lwss2block_color_correction(#compressed_items-8,1)
lwss2block_color_correction(#compressed_items-7,1)
lwss2block_color_correction(#compressed_items-5,1)
lwss2block_color_correction(#compressed_items-3,1)
lwss2block_color_correction(#compressed_items-2,1)
lwss2block_color_correction(#compressed_items-1,1)
lwss2block_color_correction(5,1)
end
table.remove(compressed_items,3) -- laying blocks
table.remove(compressed_items,2) -- laying blocks
table.remove(compressed_items,1) -- laying blocks
end
if isSW or isSE then
local SE_building_block_delay = 0
if isSE then
SE_building_block_delay = 20
end
phases[1385][1]=phases[1385][1]-red_block5_delay
compressed_items[6][1]=compressed_items[6][1]+compressed_items[6][3]*(compressed_items[6][5]-1)
compressed_items[6][2]=compressed_items[6][2]+compressed_items[6][4]*(compressed_items[6][5]-1)
compressed_items[6][3]=-compressed_items[6][3]
compressed_items[6][4]=-compressed_items[6][4]
compressed_items[6][5]=compressed_items[6][5] - extra_central_made_blocks
if compressed_items[6][5]<0 then
compressed_items[7][1]=compressed_items[7][1]+compressed_items[7][3]*(compressed_items[7][5]-1)
compressed_items[7][2]=compressed_items[7][2]+compressed_items[7][4]*(compressed_items[7][5]-1)
compressed_items[7][3]=-compressed_items[7][3]
compressed_items[7][4]=-compressed_items[7][4]
compressed_items[7][5]=compressed_items[7][5] + compressed_items[6][5]
end
if compressed_items[7][5]<0 then
compressed_items[8][1]=compressed_items[8][1]+compressed_items[8][3]*(compressed_items[8][5]-1)
compressed_items[8][2]=compressed_items[8][2]+compressed_items[8][4]*(compressed_items[8][5]-1)
compressed_items[8][3]=-compressed_items[8][3]
compressed_items[8][4]=-compressed_items[8][4]
compressed_items[8][5]=compressed_items[8][5] + compressed_items[7][5]
end
compressed_items[4][2]=(compressed_items[4][2] + lane1_block_speedup) % period -- lol the same compress item index
table.insert(compressed_items,{7062,53430+18+169+4016+24-SE_building_block_delay -- to be decided
,31,4244-36*4,194}) -- to replace north lwss stream +33?
if isSE then
table.remove(compressed_items,8) -- laying blocks
end
table.remove(compressed_items,7) -- laying blocks
table.remove(compressed_items,6) -- laying blocks
table.remove(compressed_items,5) -- yellow replanning
table.remove(compressed_items,4) -- lane1
table.remove(compressed_items,3) -- brown replanning
table.remove(compressed_items,2) -- red replanning
end
if isNW then
g.setname("NW")
log_phases("c:\\Golly\\Patterns\\GUN_LeafBug\\NWLanePhases_compress_changes.csv")
end
if isNE then
g.setname("NE")
log_phases("c:\\Golly\\Patterns\\GUN_LeafBug\\NELanePhases_compress_changes.csv")
end
if isSW then
g.setname("SW")
log_phases("c:\\Golly\\Patterns\\GUN_LeafBug\\SWLanePhases_compress_changes.csv")
end
if isSE then
g.setname("SE")
log_phases("c:\\Golly\\Patterns\\GUN_LeafBug\\SELanePhases_compress_changes.csv")
end
local function decompress_phases()
for i=1,#compressed_items do
start_loop_no,start_phase,loop_no_inc,phase_inc,rep=compressed_items[i][1],compressed_items[i][2],compressed_items[i][3],compressed_items[i][4],compressed_items[i][5]
if (minLoopNo>start_loop_no) then
minLoopNo=start_loop_no
end
if (maxLoopNo<start_loop_no) then
maxLoopNo=start_loop_no
end
if (minLoopNo>start_loop_no+(rep-1)*loop_no_inc) then
minLoopNo=start_loop_no+(rep-1)*loop_no_inc
end
if (maxLoopNo<start_loop_no+(rep-1)*loop_no_inc) then
maxLoopNo=start_loop_no+(rep-1)*loop_no_inc
end
for j=0,rep-1 do
if not phases[start_loop_no+j*loop_no_inc] then
phases[start_loop_no+j*loop_no_inc]={}
end
table.insert(phases[start_loop_no + j*loop_no_inc],(start_phase+j*phase_inc)%period)
end
end
compressed_items={}
end
decompress_phases()
if isNW or isNE then
--for i=2,#phases[13188] do
-- if ((phases[13188][i]%302) > 110) and ((phases[13188][i]%302) < 145) then
-- phases[13188][i]=phases[13188][i]+40 -- selecting other anihilation phase avoiding collision with North lwss stream (which existed in early versions)
-- end
--end
--phases[13188-2*lwss_cleanup_shift][2]=phases[13188-2*lwss_cleanup_shift][2] - (phases[13188-2*lwss_cleanup_shift][2]%96)+(phases[13188-2*lwss_cleanup_shift][1]%96) --test
-- effect of lwss_cleanup_shift change 8*35*lwss_cleanup_shift
for i=1,5 do
--g.note(((phases[13188-2*lwss_cleanup_shift][i]+8*lwss_cleanup_shift)%96) .. " " .. (phases[13188-2*lwss_cleanup_shift][i]%96))
local danger_from = 44 -- not debugged 2nd and 4th should be shifted
if isNE then
danger_from = 0 -- not debugged 1st and 3rd should be shifted
end
local danger_to = danger_from + 40
if (((phases[13188-2*lwss_cleanup_shift][i]+8*35*lwss_cleanup_shift)%96) > danger_from) and (((phases[13188-2*lwss_cleanup_shift][i]+8*35*lwss_cleanup_shift)%96) < danger_to) then
phases[13188-2*lwss_cleanup_shift][i]=phases[13188-2*lwss_cleanup_shift][i]+40 -- selecting other anihilation phase avoiding collision glider stream from S (fast initial block building)
end
end
--g.note((phases[13188-2*lwss_cleanup_shift][#phases[13188-2*lwss_cleanup_shift]-106]+8*35*lwss_cleanup_shift)%240)
--phases[13188-2*lwss_cleanup_shift][#phases[13188-2*lwss_cleanup_shift]-106]=phases[13188-2*lwss_cleanup_shift][#phases[13188-2*lwss_cleanup_shift]-106]-14 -- test
--g.note((phases[13188-2*lwss_cleanup_shift][#phases[13188-2*lwss_cleanup_shift]-26]+8*35*lwss_cleanup_shift)%240)
--phases[13188-2*lwss_cleanup_shift][#phases[13188-2*lwss_cleanup_shift]-26]=phases[13188-2*lwss_cleanup_shift][#phases[13188-2*lwss_cleanup_shift]-26]-200 -- test
local danger_from = 151
if isNE then
danger_from = 132
end
local danger_to = danger_from + 40
for i=75,#phases[13188-2*lwss_cleanup_shift] do
if (((((phases[13188-2*lwss_cleanup_shift][i]+24000)%period)+8*35*lwss_cleanup_shift)%240) > danger_from) and (((((phases[13188-2*lwss_cleanup_shift][i]+24000)%period)+8*35*lwss_cleanup_shift)%240) < danger_to) then
phases[13188-2*lwss_cleanup_shift][i]=phases[13188-2*lwss_cleanup_shift][i]+40 -- selecting other anihilation phase avoiding collision with block building stream of gliders from S
end
end
local cleanup_from_loops = 13188
cleanup_phases = {}
for i=1,period do
table.insert(cleanup_phases,{})
end
local function save_converted_phase(i,j)
local cp=1+((-i*4*34+j-1-(i%2)) % period)
table.insert(cleanup_phases[cp],i)
end
for i=cleanup_from_loops,maxLoopNo do
if phases[i] then
for j=1,#phases[i] do
save_converted_phase(i,phases[i][j])
end
end
phases[i]=nil
end
log = io.open("c:\\Golly\\Patterns\\GUN_LeafBug\\cleanup.csv","w")
writeLog(#cleanup_phases)
for i=1,period do
for j=1,#cleanup_phases[i] do
writeLog(i..";"..cleanup_phases[i][j])
end
end
log:close()
local function save_cp_to_phase_lane(lane,cp)
if not phases[lane] then
phases[lane]={}
end
local to_avoid = #phases[lane]
local value_to_insert = (cp+lane*4*34) % period -- we are lucky to be in the same period
while (to_avoid>0) and phases[lane][to_avoid] > value_to_insert do
to_avoid = to_avoid - 1
end
table.insert(phases[lane],to_avoid+1,value_to_insert)
writeLog(lane.." <- "..value_to_insert.."("..cp..")")
end
local function neighbours_in_sorted_stack(stack,value) -- value is not in the stack
local ret={}
if not stack then
return {}
end
local sp=#stack
while sp>0 and stack[sp] > value do
sp = sp - 1
end
if sp>0 then -- lower value found
table.insert(ret,stack[sp])
end
if sp<#stack then -- higher value found
table.insert(ret,stack[sp+1])
end
return ret
end
local function all_neighbours_at_least_24(stack,value) -- different colors could add 1
local neighbours=neighbours_in_sorted_stack(stack,value)
for i=1,#neighbours do
if math.abs(neighbours[i]-value)<24 then
return false
end
end
return true
end
local function all_neighbours_syringe_compatible(stack,value)
local neighbours=neighbours_in_sorted_stack(stack,value)
for i=1,#neighbours do
local dif=math.abs(neighbours[i]-value)
if dif<78 then
if dif<74 or dif>75 then
return false
end
end
end
return true
end
local batch={}
local last_in_batch=-77
local first_in_batch=-77
local function process_batch() -- determines lanes for dependent gliders and cleans the batch
local base_lane = 13210 -- be aware of irregullar lwss's ...
local lane = base_lane
writeLog("")
local doOpt = true
if isNW then
if (#batch==7) and (batch[1][1]==66546) then --dirty manual lwss collision avoiding (NW)
save_cp_to_phase_lane(lane,batch[7][1])
lane=lane+10
save_cp_to_phase_lane(lane,batch[1][1])
save_cp_to_phase_lane(lane,batch[4][1]) --the only two which can share color and 1 on 13210 colides with lwss
lane=lane+10
save_cp_to_phase_lane(lane,batch[2][1])
lane=lane+10
save_cp_to_phase_lane(lane,batch[3][1])
lane=lane+10
save_cp_to_phase_lane(lane,batch[6][1])
lane=lane+10
save_cp_to_phase_lane(lane,batch[5][1])
batch={}
return
end
end
if isNE then
if (#batch==7) and (batch[1][1]==66566) then --dirty manual lwss collision avoiding (NE)
save_cp_to_phase_lane(lane,batch[1][1])
save_cp_to_phase_lane(lane,batch[4][1]) --the only two which can share color and 1 on 13210 colides with lwss
lane=lane+10
save_cp_to_phase_lane(lane,batch[2][1])
lane=lane+10
save_cp_to_phase_lane(lane,batch[7][1])
lane=lane+10
save_cp_to_phase_lane(lane,batch[5][1])
lane=lane+10
save_cp_to_phase_lane(lane,batch[3][1])
lane=lane+10
save_cp_to_phase_lane(lane,batch[6][1])
batch={}
return
end
if (#batch==7) and (batch[1][1]==70087) then --dirty manual solution eager algorithm have not solved well
save_cp_to_phase_lane(lane,batch[2][1]) --the only two which can share color and 1 on 13210 colides with lwss
lane=lane+10
save_cp_to_phase_lane(lane,batch[3][1])
lane=lane+10
save_cp_to_phase_lane(lane,batch[4][1])
lane=lane+10
save_cp_to_phase_lane(lane,batch[5][1])
lane=lane+10
save_cp_to_phase_lane(lane,batch[6][1])
lane=lane+10
save_cp_to_phase_lane(lane,batch[1][1])
save_cp_to_phase_lane(lane,batch[7][1])
batch={}
return
end
end
local max_batch_lane=base_lane
for i=1,#batch do
if doOpt then -- not the best optimization but a good approximate
if i>1 then
lane = max_batch_lane
writeLog("lane "..(lane+10).."->"..lane.." to test")
local phase_for_lane = (batch[i][1]+lane*4*34) % period
while (lane >= base_lane) and all_neighbours_at_least_24(phases[lane],phase_for_lane) do -- they will not colide while crossing
local neighbours = neighbours_in_sorted_stack(phases[lane],phase_for_lane)
nei = ""
for n=1,#neighbours do
nei = nei .. neighbours[n] .. "(" .. (neighbours[n] - phase_for_lane)..") "
end
writeLog("lane "..lane.."->"..(lane-10).." ("..phase_for_lane.."- { "..nei.."} > 22)")
lane = lane-10
phase_for_lane = (batch[i][1]+lane*4*34) % period
end
lane=lane+10 -- first available lane ... if it fits
writeLog("lane "..(lane-10).."->"..lane.." (first safe lane)")
end
end
local lane_not_checked = true
while lane_not_checked do
writeLog(i..";"..batch[i][1]..";"..batch[i][2]..";"..lane..";"..((batch[i][1]-4*lane)%240))
lane_not_checked = false
writeLog("testing no stream conflict")
local forbidden_from = 137
if isNE then
forbidden_from = 118
end
forbidden_to = forbidden_from + 40 -- hope not crossing 240
if ((batch[i][1]-4*lane)%240) > forbidden_from and ((batch[i][1]-4*lane)%240) < forbidden_to then
--collision with gliderstream from SW test
if batch[i][1]<65000 then
lane_not_checked = true
writeLog("failed")
end
end
if not lane_not_checked and doOpt then
writeLog("checking syringe compatibility")
local phase_for_lane = (batch[i][1]+lane*4*34) % period -- let us hope we would not cross period
if not all_neighbours_syringe_compatible(phases[lane],phase_for_lane) then
lane_not_checked = true
local neighbours = neighbours_in_sorted_stack(phases[lane],phase_for_lane)
nei = ""
for n=1,#neighbours do
nei = nei .. neighbours[n] .. "(" .. (neighbours[n] - phase_for_lane)..") "
end
writeLog("phases and dif;"..phase_for_lane..";"..nei..";fail")
end
end
if lane_not_checked then
lane=lane+10
end
end -- checking lane
save_cp_to_phase_lane(lane,batch[i][1]) -- temporarily without the cleanup
if max_batch_lane<lane then
max_batch_lane=lane
end
lane=lane+10
end -- next in batch
batch={}
return
end
log = io.open("c:\\Golly\\Patterns\\GUN_LeafBug\\batches_cleanup.txt","w")
for cp=1,period do
for j=1,#cleanup_phases[cp] do
if cp>last_in_batch+77 then --syringe repeat time
process_batch() --makes batch empty
first_in_batch = cp
end
local inserted=false
for i=1,#batch do
if cleanup_phases[cp][j]<batch[i][2] then -- no equality possible
table.insert(batch,i,{cp,cleanup_phases[cp][j]}) -- keeping sorted by 2nd item
inserted = true
break
end
end
if not inserted then
table.insert(batch,{cp,cleanup_phases[cp][j]})
end
last_in_batch=cp
end
end
process_batch()
log:close()
end
if isSW then
phases[7062+45*31][1]=phases[7062+45*31][1]+20 -- collision with irregullar south lwss replacing -10a by 10a reaction
phases[7062+59*31][1]=phases[7062+59*31][1]+20 -- collision with irregullar south lwss replacing -10a by 10a reaction
end
if isSE then
phases[7062+45*31][1]=phases[7062+45*31][1]+20 -- collision with irregullar south lwss replacing -10a by 10a reaction
phases[7062+59*31][1]=phases[7062+59*31][1]+20 -- collision with irregullar south lwss replacing -10a by 10a reaction
end
--g.note("shrinking including gliders phase shifted (-512)")
local shiftX,shiftY=baseShiftX+(minLoopNo-1),baseShiftY
local shifts={}
local newshiftX=0
if isNW or isNE then
shiftX,shiftY=shiftX+NWextraShift,shiftY+NWextraShift
end
local yphaseLoop0,yphasePhase0=0,0
local function put_yphase(_loopNo,_yphase)
local loopNo=_loopNo+yphaseLoop0
local yphase=_yphase+yphasePhase0
if not phases[loopNo] then
phases[loopNo]={}
if maxLoopNo<loopNo then
maxLoopNo=loopNo
end
if minLoopNo>loopNo then
minLoopNo=loopNo
end
end
table.insert(phases[loopNo],yphase+4*34*loopNo)
end
if isNW then
yphaseLoop0,yphasePhase0=2852-2973,71007 --to be found
nw.salvo(put_yphase)
log_phases("c:\\Golly\\Patterns\\GUN_LeafBug\\NWLanePhases_new.csv")
end
if isNE then
yphaseLoop0,yphasePhase0=2852-2973,71007 --to be found
ne.salvo(put_yphase)
log_phases("c:\\Golly\\Patterns\\GUN_LeafBug\\NELanePhases_new.csv")
end
if isSE then
yphaseLoop0,yphasePhase0=7097,74240 --to be found
se.salvo(put_yphase)
log_phases("c:\\Golly\\Patterns\\GUN_LeafBug\\SELanePhases_new.csv")
end
if isSW then
yphaseLoop0,yphasePhase0=7097,74240 --to be found
sw.salvo(put_yphase)
log_phases("c:\\Golly\\Patterns\\GUN_LeafBug\\SWLanePhases_new.csv")
end
local function output()
local function put_glider(loopNo, ori_phase, shiftX, shiftY, phaseshift)
local shift = 4*((shiftY-(baseShiftY-34*loopNo)) % 32768)
local phase = ori_phase - shift - phaseshift
-- setcells if not in tracks
phase = phase % period
if (phase>270) and (phase<65600) then --toNW
local inLoopY=((NW_pahseshift - phase)//4) % 32768 - 32768
local inLoopX=77-inLoopY
--g.note("toNW"..phase.." ("..inLoopX..","..inLoopY..")")
if ((inLoopY<-10) and (inLoopY>-16275)) then
if (phase%4==0) then
g.setcell(shiftX+inLoopX,shiftY+inLoopY,1)
g.setcell(shiftX+inLoopX+1,shiftY+inLoopY,1)
g.setcell(shiftX+inLoopX+1,shiftY+inLoopY+1,1)
g.setcell(shiftX+inLoopX+2,shiftY+inLoopY+1,1)
g.setcell(shiftX+inLoopX,shiftY+inLoopY+2,1)
elseif (phase%4==1) then
g.setcell(shiftX+inLoopX,shiftY+inLoopY,1)
g.setcell(shiftX+inLoopX+1,shiftY+inLoopY,1)
g.setcell(shiftX+inLoopX+2,shiftY+inLoopY,1)
g.setcell(shiftX+inLoopX+2,shiftY+inLoopY+1,1)
g.setcell(shiftX+inLoopX+1,shiftY+inLoopY+2,1)
elseif (phase%4==2) then
g.setcell(shiftX+inLoopX,shiftY+inLoopY,1)
g.setcell(shiftX+inLoopX,shiftY+inLoopY+1,1)
g.setcell(shiftX+inLoopX+1,shiftY+inLoopY+1,1)
g.setcell(shiftX+inLoopX-1,shiftY+inLoopY+2,1)
g.setcell(shiftX+inLoopX+1,shiftY+inLoopY+2,1)
else
g.setcell(shiftX+inLoopX,shiftY+inLoopY,1)
g.setcell(shiftX+inLoopX+1,shiftY+inLoopY,1)
g.setcell(shiftX+inLoopX-1,shiftY+inLoopY+1,1)
g.setcell(shiftX+inLoopX+1,shiftY+inLoopY+1,1)
g.setcell(shiftX+inLoopX+1,shiftY+inLoopY+2,1)
end
end
elseif (phase > 65880) then --toSE
local inLoopY=(phase//4) % 32768 - 32768
local inLoopX=30-inLoopY
--g.note("toSE"..phase.." ("..inLoopX..","..inLoopY..")")
if ((inLoopY<-10) and (inLoopY>-16275)) then
if (phase%4==0) then
g.setcell(shiftX+inLoopX,shiftY+inLoopY,1)
g.setcell(shiftX+inLoopX-1,shiftY+inLoopY+1,1)
g.setcell(shiftX+inLoopX-1,shiftY+inLoopY+2,1)
g.setcell(shiftX+inLoopX,shiftY+inLoopY+2,1)
g.setcell(shiftX+inLoopX+1,shiftY+inLoopY+2,1)
elseif (phase%4==1) then
g.setcell(shiftX+inLoopX-1,shiftY+inLoopY+1,1)
g.setcell(shiftX+inLoopX+1,shiftY+inLoopY+1,1)
g.setcell(shiftX+inLoopX-1,shiftY+inLoopY+2,1)
g.setcell(shiftX+inLoopX,shiftY+inLoopY+2,1)
g.setcell(shiftX+inLoopX,shiftY+inLoopY+3,1)
elseif (phase%4==2) then
g.setcell(shiftX+inLoopX-1,shiftY+inLoopY+1,1)
g.setcell(shiftX+inLoopX-1,shiftY+inLoopY+2,1)
g.setcell(shiftX+inLoopX+1,shiftY+inLoopY+2,1)
g.setcell(shiftX+inLoopX-1,shiftY+inLoopY+3,1)
g.setcell(shiftX+inLoopX,shiftY+inLoopY+3,1)
else
g.setcell(shiftX+inLoopX,shiftY+inLoopY+1,1)
g.setcell(shiftX+inLoopX-2,shiftY+inLoopY+2,1)
g.setcell(shiftX+inLoopX-1,shiftY+inLoopY+2,1)
g.setcell(shiftX+inLoopX-1,shiftY+inLoopY+3,1)
g.setcell(shiftX+inLoopX,shiftY+inLoopY+3,1)
end
end
end
end
local loopFrom,loopTo,dir=minLoopNo,maxLoopNo,1
--Yflip = false
if Yflip then
loopFrom,loopTo,dir=maxLoopNo,minLoopNo,-1
end
for loopNo=loopFrom,loopTo,dir do
newshiftX=newshiftX+1
if (phases[loopNo] and #phases[loopNo]>0) then
shiftX,shiftY=shiftX-(newshiftX+1)//2-34-1,shiftY+newshiftX//2-34-1
newshiftX = 0
shifts[loopNo]={shiftX,shiftY}
g.putcells(SW,shiftX,shiftY)
g.putcells(NE,shiftX+loopSizeX,shiftY+loopSizeY)
for i=1,#phases[loopNo] do
local p=phases[loopNo][i]
if Yflip then
p=p-4*loopNo+2
end
put_glider(loopNo, p, shiftX, shiftY, detection_phaseshift)
end
end
end
g.update()
--g.note("including gliders")
g.setbase(2)
g.setstep(10)
g.step()
for loopNo=minLoopNo,maxLoopNo do
if (phases[loopNo] and #phases[loopNo]>0) then
shiftX,shiftY=shifts[loopNo][1],shifts[loopNo][2]
for i=1,#phases[loopNo] do
local p=phases[loopNo][i]
if Yflip then
p=p-4*loopNo+2
end
put_glider(loopNo, p, shiftX, shiftY, 0)
end
end
end
end
--phases = {}
--compressed_items = {}
--table.insert(compressed_items,{0,0,31,4*31*34,3})
--table.insert(compressed_items,{100,4*100*34,0,74,3})
--decompress_phases()
--Yflip=true
output()
g.setstep(17)
g.select({400000,200000,200000,200000})
if isNW or isNE then
g.rotate(0)
end
if isSW or isSE then
g.flip(1)
end
if isSE or isNW then
g.flip(0)
end
if isNW then
g.cut()
g.paste(400000-23538,200000-5590,"or")
end
if isNE then
g.cut()
g.paste(400000+106142,200000-5600,"or")
end
if isSE then
g.cut()
g.paste(400000+69889+6356,200000+74530+11612,"or")
end
if isSW then
g.cut()
g.paste(400000+6359,200000+86142,"or")
end
--g.note("done")
g.step()
if isNW or isNE then
g.run(period-42760)
end
g.fit()
if isNW then
g.save("NW.mc","mc",true)
end
if isNE then
g.save("NE.mc","mc",true)
end
if isSE then
g.save("SE.mc","mc",true)
end
if isSW then
g.save("SW.mc","mc",true)
end
So maybe sometimes later ... to reduce the width by about 70.
There is probably also an option to use cleanup lanes to fire lwss's from south to reduce the height a bit, but there could be serious issues with the collisions with the virtual lwss gun from north.
There is an option to reduce NW by chosing glider-lwss block laying reaction such that block in central lane uses the same glider loop as the block in the next lane ... unfortunately this can be used only for 12 loops (distance 6 of one given color) NE unfortunately cannot be reduced this way as the startig blocks are on east 1hd shifted. The save of 12 loops would be by a cost of two alternating lwss central lanes instead of 1.
I do not know about simillar possible save on east so the height of the gun would not be decreased...