@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 requires State 1 cells to give birth)
State 16: Catalyst killer (like state 2, but it requires State 1 cells to give birth)
States 2-5, 8-9, and 14-16 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.
Versions:
2018 Beta (4 states)
2019 1.0 (6 states)
2019 1.1 (8 states)
2020 2.0 (14 states)
2020 2.1 (17 states)
All patterns made in ExtendedLife or ExtendedLifeFancy that are converted into StateInvestigator are called "Prehistoric".
All patterns made in LifeHistory that are converted into StateInvestigator are called "Historic".
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")