@RULE StateInvestigator
@TABLE
n_states:17
neighborhood:Moore
symmetries:permute
var a1 = {1,2,4,6,8,10,12,15,16}
var a2 = {1,2,4,6,8,10,12,15,16}
var a3 = {1,2,4,6,8,10,12,15,16}
var a4 = {1,2,4,6,8,10,12,15,16}
var b1 = {0,3,5,7,9,11,13}
var b2 = {0,3,5,7,9,11,13}
var b3 = {0,3,5,7,9,11,13}
var b4 = {0,3,5,7,9,11,13}
var b5 = {0,3,5,7,9,11,13}
var b6 = {0,3,5,7,9,11,13}
var b7 = {0,3,5,7,9,11,13}
var c1 = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}
var c2 = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}
var c3 = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}
var c4 = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}
var c5 = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}
var c6 = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}
var c7 = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}
var c8 = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}
var d1 = {2,3,6,7,14,16}
var d2 = {8,9,12,13,14}
var e1 = {1,2,4,6,8,10,12}
var e2 = {1,2,4,6,8,10,12}
var e3 = {1,2,4,6,8,10,12}
0, 1,a1,a2,b1,b2,b3,b4,b5, 1
0, e1,e2,e3,b1,b2,b3,b4,b5, 1
1, c1,b1,b2,b3,b4,b5,b6,b7, 0
1, a1,a2,a3,a4,c1,c2,c3,c4, 0
1, d1,c1,c2,c3,c4,c5,c6,c7, 0
0, d2,c1,c2,c3,c4,c5,c6,c7, 1
6, c1,c2,c3,c4,c5,c6,c7,c8, 7
7, c1,c2,c3,c4,c5,c6,c7,c8, 6
10, c1,c2,c3,c4,c5,c6,c7,c8, 11
11, c1,c2,c3,c4,c5,c6,c7,c8, 10
12, c1,c2,c3,c4,c5,c6,c7,c8, 13
13, c1,c2,c3,c4,c5,c6,c7,c8, 12
@COLORS
1 0 236 91
2 0 192 254
3 254 0 0
4 254 254 254
5 75 75 75
6 254 0 254
7 64 0 128
8 254 230 0
9 150 128 0
10 130 200 0
11 0 120 40
12 254 140 0
13 140 70 0
14 0 0 254
15 192 192 192
16 128 128 128
Explanation of the rule
State 0: off cell (evolves like CGoL) #
State 1: on cell (evolves like CGoL) #
State 2: killer on cell (kills any adjacent cell, treated as on considering births of cells) #
State 3: killer off cell (kills any adjacent cell, treated as off considering births of cells) #
State 4: eternal on cell #
State 5: eternal off cell #
State 6: P2 killer on cell (changes into state 7 in next generation)
State 7: P2 killer off cell (changes into state 6 in next generation)
State 8: egg on cell (gives birth to all neighboring cells unless already on, treated as on considering survival of cells) #
State 9: egg off cell (gives birth to all neighboring cells unless already on, treated as off considering survival of cells) #
State 10: P2 on cell (changes into state 11 in next generation, not killer, not egg)
State 11: P2 off cell (changes into state 10 in next generation, not killer, not egg)
State 12: P2 egg on cell (changes into state 13)
State 13: P2 egg off cell (changes into state 12)
State 14: Inverter (inverts all neighboring cells) #
State 15: Catalyst (like state 4, but it can't give birth to cells alone)
State 16: Catalyst killer (like state 2, but it can't give birth to cells alone)
States 2-5 never change. States 6-7, 10-11 and 12-13 always toggle.
All states with # are also present in ExtendedLifeFancy.
This rule is really similar to ExtendedLifeFancy. Despite that, StateInvestigator was made totally independent of LifeExtendedFancy when EV2 was searching a rule with multiple states that could allow stable bumpers, bouncers and small and fast syringes.
States 0 to 5 also exist in ExtendedLifeFancy. The only difference are the colors and the fact that states 2 and 4 in StateInvestigator become states 8 and 6 (respectively) in ExtendedLifeFancy. States 6 and 7 can't be converted to ExtendedLifeFancy. Despite the similarity, StateInvestigator was made completely independent of ExtendedLifeFancy.
Scripts (lua, based on invert.lua, only supports states 0 to 5 in StateInvestigator):
-- StateInvestigator to ExtendedLifeFancy
local g = golly()
local gp = require "gplus"
-- re-assigning inner loop functions results in a 10% speed up
local setcell = g.setcell
local getcell = g.getcell
local r = gp.rect(g.getselrect())
if r.empty then g.exit("There is no selection.") end
-- local t1 = os.clock()
local oldsecs = os.clock()
for row = r.top, r.bottom do
-- if large selection then give some indication of progress
local newsecs = os.clock()
if newsecs - oldsecs >= 1.0 then
oldsecs = newsecs
g.update()
end
for col = r.left, r.right do
if g.getcell(col, row) == 2 then
g.setcell(col, row, 8)
elif g.getcell(col, row) == 4 then
g.setcell(col, row, 6)
elseif g.getcell(col, row) > 5 then
error("Invalid state")
end
end
end
if not r.visible() then g.fitsel() end
-- g.show(""..(os.clock()-t1))
g.setrule("ExtendedLifeFancy")
-- ExtendedLifeFancy to StateInvestigator
local g = golly()
local gp = require "gplus"
-- re-assigning inner loop functions results in a 10% speed up
local setcell = g.setcell
local getcell = g.getcell
local r = gp.rect(g.getselrect())
if r.empty then g.exit("There is no selection.") end
-- local t1 = os.clock()
local oldsecs = os.clock()
for row = r.top, r.bottom do
-- if large selection then give some indication of progress
local newsecs = os.clock()
if newsecs - oldsecs >= 1.0 then
oldsecs = newsecs
g.update()
end
for col = r.left, r.right do
if g.getcell(col, row) == 6 then
g.setcell(col, row, 4)
elseif g.getcell(col, row) == 8 then
g.setcell(col, row, 2)
elseif g.getcell(col, row) > 8 then
error("Invalid state")
elseif g.getcell(col, row) == 7 then
error("Invalid state")
elseif g.getcell(col, row) == 4 then
error("Invalid state")
end
end
end
if not r.visible() then g.fitsel() end
-- g.show(""..(os.clock()-t1))
g.setrule("StateInvestigator")