Using a SAT solver to generate periodic hex still lifes

For discussion of other cellular automata.
Post Reply
User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Using a SAT solver to generate periodic hex still lifes

Post by pcallahan » November 29th, 2020, 11:34 pm

[Updated to correct a mistake in what I thought the second instance was solving, but keeping the solution, which is interesting looking.]

This has been on my mind for a little while: using neighborhood constraints to develop hexagonal black and white tilings. I was curious what kinds of textures would show up using different subsets of neighborhoods. I only just realized that this is amenable to using a SAT solver instead of trying to code up an ad hoc placement algorithm. (Note: my ultimate goal is to work on tilings that do not correspond directly to to Moore or hex CAs, so there may not be existing software in the CGOL community.)

Another way to think of them is as still lifes in hexagonal CAs with toroidal wrapping.

This special purpose python script hexsat.py can generate the SAT problem as a DIMACS file for lingeling:

Code: Select all

import re
import sys

m = int(sys.argv[1])
n = int(sys.argv[2])

birth = re.sub(r'([0-9])', ' \\1', sys.argv[3]).strip().split(" ")
survival = re.sub(r'([0-9])', ' \\1', sys.argv[4]).strip().split(" ")

HEXRULES = {
  '0': ['000000'],
  '1': ['100000', '010000', '001000', '000100', '000010', '000001'],
  '2o': ['110000', '011000', '001100', '000110', '100001', '000011'],
  '2m': ['101000', '010100', '100010', '001010', '010001', '000101'],
  '3o': ['111000', '011100', '001110', '110001', '100011', '000111'],
  '2p': ['100100', '010010', '001001'],
  '3mr': ['101100', '110010', '010110', '011001', '100101', '001011'],
  '3ml': ['110100', '011010', '100110', '101001', '001101', '010011'],
  '4o': ['111100', '011110', '111001', '110011', '100111', '001111'],
  '3p': ['101010', '010101'],
  '4m': ['111010', '101110', '110101', '011101', '101011', '010111'],
  '4p': ['110110', '101101', '011011'],
  '5': ['111110', '111101', '111011', '110111', '101111', '011111'],
  '6': ['111111']
}

def ix(i, j):
  return n * i + j + 1

def neighborhood(i, j):
  neighbors = [ix(i, j)]
  for (di, dj) in [(-1, -1), (-1, 0), (0, 1), (1, 1), (1, 0), (0, -1)]:
    neighbors.append(ix((i + di) % m, (j + dj) % n))
  return neighbors

def clauses(i, j, live, dead):
  cells = neighborhood(i, j)
  res = []
  for shape in sorted(HEXRULES):
    if shape not in live and shape not in dead:
      for ngh in HEXRULES[shape]:
        res.append([-val if bit == '1' else val for (val, bit) in zip(cells[1:], ngh)]) 
    elif shape not in live:
      for ngh in HEXRULES[shape]:
        res.append([-cells[0]] + [-val if bit == '1' else val for (val, bit) in zip(cells[1:], ngh)]) 
    elif shape not in dead:
      for ngh in HEXRULES[shape]:
        res.append([cells[0]] + [-val if bit == '1' else val for (val, bit) in zip(cells[1:], ngh)]) 
  return res

dead = [x for x in HEXRULES if x not in birth]

print "p cnf %d %d" % (m * n, len(clauses(0, 0, survival, dead)) * m * n)

for i in range(m):
  for j in range(n):
    for clause in clauses(i, j, survival, dead):
      print " ".join([str(x) for x in clause]), 0
You can run it with a command like:

Code: Select all

python hexsat.py 64 64 012m2o2p3ml3mr6 2m2p3p > sat.txt
or

Code: Select all

python hexsat.py 32 32 02o 2m > sat.txt
to generate the patterns shown below.

The first was one I hand-designed to get a specific topology. The second is like a hex CA I have written about elsewhere, but without survival for 3 and 4 neighbors. Note that I have added "0" to birth rules just to force the solver not to settle on an empty solution. I also separate 3m into 3ml and 3mr, since this neighborhood is not rotationally symmetric.

To get the patterns, use lingeling and then decode the results using a second script "decode.py" that produces "rle" format except not actually compressed by run length. It can be copy-pasted into Golly.

Code: Select all

./solvers/lingeling sat.txt | python decode.py 64 64
Note that decode needs to know the dimensions of the pattern as above.

I found that lingeling is quicker at finding a solution for the hand-designed rule. I was not able to generate a 64x64 pattern for the other hex rule so I settled at 32x32 (I have since solved sizes over 40x40).

In the second rule, the only way for a cell to survive is to have live two neighbors 120° apart. Hence you have to pack everything into loops leaving no empty cell neighborhoods. That's probably why it works out to be a harder optimization for the SAT solver. It still does a very good job considering it is not designed for that ad hoc task.

Here's decode.py

Code: Select all

import sys
m = int(sys.argv[1])
n = int(sys.argv[2])

def ix(i, j):
  return n * i + j + 1

cells = [[0] * n for i in range(m)]

for line in sys.stdin:
  toks = line.split()
  if toks[0] == 'v':
    for x in toks[1:]:
      ix = int(x)
      if ix > 0:
        cells[(ix - 1) / n][(ix - 1) % n] = 1 

print "x = %d, y = %d" % (n, m)
for row in cells:
  print "".join(["o" if x else "b" for x in row]) + "$"
print "!"
Finally, here are the resulting still life patterns.

Code: Select all

x = 64, y = 64, rule = B12m2o2p3m6/S2m2p3pH:T64,64
2bo5b2ob2ob2ob2obo3bobobob2obob2o2bobo2b3obo2bo2b2obo2bob2o$obob5o2bo
2bobo3bob3o2b2obo2bobob3obob2o2bob2ob3obobobobo$b2obo4b3ob2obob2ob2o2b
obobob3obobo2bob2ob2obo2b2o2bobob2obo$2ob2ob3o3b2o2bobobo2b2ob2obobo2b
2obob2obo2bobob3o2b2obobobobo$3bo2bo2b4ob2obobob3ob2obob2ob2obob2o2bob
2obobo2b3o2bobobobo$b2ob2ob3o4bobob2obo3bobob2o2bobob2ob3obo2bobo2bo2b
3obobobo$bobo2b2o2b4obob2ob2ob2obobo2b2obob2o2bo2bob2obob3ob2o2bobob2o
$2obob2ob2o4b2obo2bo2bobobob3ob2obo2b2o2bobob2obo2b2ob2obobo$o2bobobo
2b5obob3ob2obobobo2bo2bob3ob3obobobob2o2bo2b2obobo$b3obobob2o5bobo2b2o
bob2obob2ob2obo3bo3bobobobob3ob2o2bobo$o3bobob2ob6obob2obob2o2bobo2bob
ob3ob4obobobobo2b2ob2obo$ob3obobobo6b2obo2bobob2obob3obobo2bo4bobobobo
bobobo2bobo$2bo3bobobob5o2bob2ob2obobob2o3bobob2ob3obobobobob2obob2obo
$3ob3obobobo4b3obobo2b2obobob3ob2obo2bo2bobob2obobo2bobobo$o3bo2bob2ob
ob3o4bo2b2o2bob2obo2bo3bob2ob2obobo2bobob2obobo$ob3o2bobo2bobo2b4ob3ob
2obo2bobobob3obo2bob2obob2obobo2bobo$obo2b3obob2obo2bo3bo3bo2bob2obob
2obo2bob3obob2obob2obob2obo$obo2bo2b2obobob3ob2ob3ob2obo2bobo3bob2obo
3bobo2bobobob2ob2o$bob3ob2ob2o2bo3b2obo3bo2bob2obob4obobob4obob2obobob
o2bobo$2obo2b2obo2b3ob2o2bob3ob2ob2obobo4bobobo5bobobob2obob2o$ob2ob2o
2bob2o2b2ob2obo3bo2bo2bob2ob3obobob5ob2obobob2obob2o$2bo2bob3obob2o3bo
bob3ob2ob2obo2b2o2bob2obo4b2ob2obobob2obo$3ob2obo2b2obob3obob2o2b2ob2o
bob3obobobob2ob4o2bobob2obobobo$3b2o2bob2ob2obo2b2obo2b2o2bo2bobo2bob
2obobob2o4b2o2b2obobob2o$b2o2b3obo2bob2o2bo2bob2o2b2ob2obo2bobo2bobobo
2b4ob3obobobo$2ob3o2b2ob2obob3ob2obo2b2ob2obob3obob2obobob2o3bo4bobobo
bo$3bo3b2ob2ob2obo3bobob3obo3bobo3bobo2bobobo2b3ob3ob2obobo$b2ob4o2bob
o2bob3obob2o2bob3ob2ob2obob3obobob2o3bo2b2ob2obo$bob2o4b2obob2obo2bobo
2b3obo2b2ob2obob2o2bob2obo2b3o2bobo3bo$bobob5obob2ob2ob2obob2o3bob2o2b
obobo3b2obo2bob2o2b3obob3o$bobobo4bob2o2bo2bob2obob4obo2b2obobob3obob
3obobobo2bob2o$2obobob4obo2b2ob2obo2bobo3b2ob2o2bobobo2bobo3bobob2o2bo
bob2o$2b2obobo3b2ob2o2bobob3obob3ob2ob2obob2ob2obob2obob2ob3obobo$2o3b
obob2o2b2o2b2obobo2b2obo2bo2bo2b2obob2obob2obob2obo3bobobo$2b3ob2obob
2o2b3obobob2o2bob2ob3ob2ob2obobobo2bobo2bob3ob2obo$obo2b2ob2obob3o2bob
ob2ob2obo2bo3b2o2bobobobob2obob2ob2o2b2obo$b2o2bo2bo2bobo3b2obobobo2bo
b3ob2o2b3obobobobobob2ob2obobobobo$bob3ob2ob2obob3ob2obo2b2obo4bob2o3b
2obobobobobo2bobob2obobo$bobo3bob2ob2obo2bo2bob3obob5obob3o2bobobobob
2ob2o2bo3bobo$bobob3obobo2bob2ob2obo3bob2o4bobo3b2obobobob2ob2ob3ob3ob
o$bobobo2b2o2b2obo2bo2b2ob2ob2ob5obob2o2bobob2obobo3bo2b2o3bo$2obobo2b
ob3obob3ob2ob2obo2bo5bob2ob2obob2ob2obob2ob3o2b2o$2bobob3obo3bobo3bo2b
obob2ob6obo2bobobo3bo2bobob2o3b2obo$2obob2o2b2ob3obob3ob2obobob2o6bob
2o2b2ob3ob2obobob4obo$obob2ob2o3bo2b2obo3bobob2obo2b6obobobob2o3bobobo
bo5bo$obobo2bob4o2bo2bob3o2b2obob3o5bobob2obo2b3obobobob5o$b2obob2obo
3b3ob2obo2b3obob2o2b5obobo2b2ob2o2bob2obobo4bo$bob2obo2bob2o4bo2bob2o
2bob2o2b2o4bobob2o2b2obo2bo2b2obob4o$obo2bob3obob5ob2obobobobo2b2o2b3o
bobo2b3obob3ob2obob2o$bob2obo4bobo4b2obobob2obob2o2b2o2b2obob2o2bobo4b
obob2ob3o$obo2bob4obob4o2bobob2ob2obo2b2obobobob2ob2ob2ob4obobobo$bob
3obo3bob2o3b2obob2obo2bob3obob2obobobo2bo2b2o4bobobob2o$obo3b2ob2ob2ob
3o2b2obobob3obo2bobo3bobo2b2ob3o2b4obobobo$bob4o2bobo2bo3b2o3bo2bo3bob
2obob3obob3ob2o2b3o3bob2obo$2obo3b2obob2ob3o2b3ob3ob3obobobo3bob2o2bo
2b2o3b3ob2obobo$2b2ob3obobo2bo3b3o2b2o2b2o2bobob2ob2obo2b2ob3ob3o3bo3b
obo$2o2b2o2bobob2ob4o2bobob3ob2obobo3bobob3ob2o3bo2b3ob3obo$ob3ob2obob
o2b2o3b2ob2obo3bobobob4obobo3bo2b2ob2o3b2o2b2o$bo4bobob2ob2o2b3ob2ob2o
b2obob2obo3bobob3ob3ob2ob3o2bobobo$ob5obobob2o2b2o3bo2bob2ob2obo2bob3o
bobo2b2o2bo3bo2b2ob2o$obo4b2obobo2b2o2b3ob2obobo2bob2ob2o3bobob2o2b2ob
2obobob2ob2o$bob5obobob3ob3o2b2ob2obob2obob2o2b2ob2obo2b2ob2obob2obobo
$obo5bob2obo2bo3bobo2bobob2obobo3b2obo2b2ob2o2bo2bobo2bobobo$bob5obo2b
2ob2ob2ob2ob2o2bo2bob2ob3obob2o3bob2ob2obob3obobo!

Code: Select all

x = 32, y = 32, rule = B2o/S2mH:T32,32
b2ob2o2bob2o2b2ob2o4bob2o2bobo$bo2bo2b2obob2o2b2ob2ob2obobobobo$obo2bo
bo3bo2bo6b2o3b2o2bo$obob2o2bob2ob2ob2ob2o3b2o3b2o$bob2o2b2obo2bo2bob2o
b2obob2obo$bo4b2o3b2obo2bo5bobo2bob2o$obo2b2o2b2o2b2ob2ob2ob2obo2bo$ob
ob2o3bobo4bo2bob2o3b2ob2o$bob2o2b2ob2o2b2ob2obo3b2o2bo2bo$bo5bobo3b2ob
o2b2o2b2obobo2bo$obob2o2b2o2b2o2bo5b2o2bo2bo$obobob2o3b2o4bob2obo4bobo
$bobobo2b2obo4b2obobob2ob2o2bo$2obobo4bob2ob2o3b2o3b2o2b2o$o3bob2o2bo
3b2o2b2o3b2o4bo$bob2o3b2obo5b2ob2obob2o3bo$bobo2b2o2b2o2b2obo4bobo2b2o
bo$2bobobobo4b2obobo2b2obo4bobo$b2obo2b2ob2obo2bobob2o3b2ob2obo$2o3b2o
3bobobo2bob2o2b2o2b2o$3b2o2b2o2b2obo2bo5bob2o3b2o$ob2obo3b2o4bo2bo2b2o
bo2bob2o$obo2bo5b2ob2ob2ob2ob2ob2obo$bob2ob2ob2o2b2o2bo2bo5bo3bo$bo3bo
2b2ob2o5bo2bob2o2b2obo$ob2obo7bob2obo2bobob2o2bobo$bo2bob2ob2ob2obobob
o2bobo2bobo$2ob2o3b2ob2o3b2obob2obob2o2bo$o2bo2b2o6b2o4b2o3b2o2b2o$bo
2bobob2ob2obobob2o3b2o4bo$bo2bo2bo2b2obob2obobob2ob2o3bo$2bo2bobo5bo5b
2obo4b2obo!
And the above, expanded into 16 copies to show how it tiles.

Code: Select all

x = 128, y = 128, rule = B2o/S2mH:T128,128
b2ob2o2bob2o2b2ob2o4bob2o2bobob2ob2o2bob2o2b2ob2o4bob2o2bobob2ob2o2bob
2o2b2ob2o4bob2o2bobob2ob2o2bob2o2b2ob2o4bob2o2bobo$bo2bo2b2obob2o2b2ob
2ob2obobobobobo2bo2b2obob2o2b2ob2ob2obobobobobo2bo2b2obob2o2b2ob2ob2ob
obobobobo2bo2b2obob2o2b2ob2ob2obobobobo$obo2bobo3bo2bo6b2o3b2o2bobobo
2bobo3bo2bo6b2o3b2o2bobobo2bobo3bo2bo6b2o3b2o2bobobo2bobo3bo2bo6b2o3b
2o2bo$obob2o2bob2ob2ob2ob2o3b2o3b2obobob2o2bob2ob2ob2ob2o3b2o3b2obobob
2o2bob2ob2ob2ob2o3b2o3b2obobob2o2bob2ob2ob2ob2o3b2o3b2o$bob2o2b2obo2bo
2bob2ob2obob2obo3bob2o2b2obo2bo2bob2ob2obob2obo3bob2o2b2obo2bo2bob2ob
2obob2obo3bob2o2b2obo2bo2bob2ob2obob2obo$bo4b2o3b2obo2bo5bobo2bob2obo
4b2o3b2obo2bo5bobo2bob2obo4b2o3b2obo2bo5bobo2bob2obo4b2o3b2obo2bo5bobo
2bob2o$obo2b2o2b2o2b2ob2ob2ob2obo2bo3bobo2b2o2b2o2b2ob2ob2ob2obo2bo3bo
bo2b2o2b2o2b2ob2ob2ob2obo2bo3bobo2b2o2b2o2b2ob2ob2ob2obo2bo$obob2o3bob
o4bo2bob2o3b2ob2obobob2o3bobo4bo2bob2o3b2ob2obobob2o3bobo4bo2bob2o3b2o
b2obobob2o3bobo4bo2bob2o3b2ob2o$bob2o2b2ob2o2b2ob2obo3b2o2bo2bobob2o2b
2ob2o2b2ob2obo3b2o2bo2bobob2o2b2ob2o2b2ob2obo3b2o2bo2bobob2o2b2ob2o2b
2ob2obo3b2o2bo2bo$bo5bobo3b2obo2b2o2b2obobo2bobo5bobo3b2obo2b2o2b2obob
o2bobo5bobo3b2obo2b2o2b2obobo2bobo5bobo3b2obo2b2o2b2obobo2bo$obob2o2b
2o2b2o2bo5b2o2bo2bo2bobob2o2b2o2b2o2bo5b2o2bo2bo2bobob2o2b2o2b2o2bo5b
2o2bo2bo2bobob2o2b2o2b2o2bo5b2o2bo2bo$obobob2o3b2o4bob2obo4bobo2bobobo
b2o3b2o4bob2obo4bobo2bobobob2o3b2o4bob2obo4bobo2bobobob2o3b2o4bob2obo
4bobo$bobobo2b2obo4b2obobob2ob2o2bo2bobobo2b2obo4b2obobob2ob2o2bo2bobo
bo2b2obo4b2obobob2ob2o2bo2bobobo2b2obo4b2obobob2ob2o2bo$2obobo4bob2ob
2o3b2o3b2o2b2ob2obobo4bob2ob2o3b2o3b2o2b2ob2obobo4bob2ob2o3b2o3b2o2b2o
b2obobo4bob2ob2o3b2o3b2o2b2o$o3bob2o2bo3b2o2b2o3b2o4bo2bo3bob2o2bo3b2o
2b2o3b2o4bo2bo3bob2o2bo3b2o2b2o3b2o4bo2bo3bob2o2bo3b2o2b2o3b2o4bo$bob
2o3b2obo5b2ob2obob2o3bo2bob2o3b2obo5b2ob2obob2o3bo2bob2o3b2obo5b2ob2ob
ob2o3bo2bob2o3b2obo5b2ob2obob2o3bo$bobo2b2o2b2o2b2obo4bobo2b2obo2bobo
2b2o2b2o2b2obo4bobo2b2obo2bobo2b2o2b2o2b2obo4bobo2b2obo2bobo2b2o2b2o2b
2obo4bobo2b2obo$2bobobobo4b2obobo2b2obo4bobo2bobobobo4b2obobo2b2obo4bo
bo2bobobobo4b2obobo2b2obo4bobo2bobobobo4b2obobo2b2obo4bobo$b2obo2b2ob
2obo2bobob2o3b2ob2obob2obo2b2ob2obo2bobob2o3b2ob2obob2obo2b2ob2obo2bob
ob2o3b2ob2obob2obo2b2ob2obo2bobob2o3b2ob2obo$2o3b2o3bobobo2bob2o2b2o2b
2o3b2o3b2o3bobobo2bob2o2b2o2b2o3b2o3b2o3bobobo2bob2o2b2o2b2o3b2o3b2o3b
obobo2bob2o2b2o2b2o$3b2o2b2o2b2obo2bo5bob2o3b2o3b2o2b2o2b2obo2bo5bob2o
3b2o3b2o2b2o2b2obo2bo5bob2o3b2o3b2o2b2o2b2obo2bo5bob2o3b2o$ob2obo3b2o
4bo2bo2b2obo2bob2obob2obo3b2o4bo2bo2b2obo2bob2obob2obo3b2o4bo2bo2b2obo
2bob2obob2obo3b2o4bo2bo2b2obo2bob2o$obo2bo5b2ob2ob2ob2ob2ob2obo2bobo2b
o5b2ob2ob2ob2ob2ob2obo2bobo2bo5b2ob2ob2ob2ob2ob2obo2bobo2bo5b2ob2ob2ob
2ob2ob2obo$bob2ob2ob2o2b2o2bo2bo5bo3bo2bob2ob2ob2o2b2o2bo2bo5bo3bo2bob
2ob2ob2o2b2o2bo2bo5bo3bo2bob2ob2ob2o2b2o2bo2bo5bo3bo$bo3bo2b2ob2o5bo2b
ob2o2b2obo2bo3bo2b2ob2o5bo2bob2o2b2obo2bo3bo2b2ob2o5bo2bob2o2b2obo2bo
3bo2b2ob2o5bo2bob2o2b2obo$ob2obo7bob2obo2bobob2o2bob2ob2obo7bob2obo2bo
bob2o2bob2ob2obo7bob2obo2bobob2o2bob2ob2obo7bob2obo2bobob2o2bobo$bo2bo
b2ob2ob2obobobo2bobo2bobo3bo2bob2ob2ob2obobobo2bobo2bobo3bo2bob2ob2ob
2obobobo2bobo2bobo3bo2bob2ob2ob2obobobo2bobo2bobo$2ob2o3b2ob2o3b2obob
2obob2o2bob2ob2o3b2ob2o3b2obob2obob2o2bob2ob2o3b2ob2o3b2obob2obob2o2bo
b2ob2o3b2ob2o3b2obob2obob2o2bo$o2bo2b2o6b2o4b2o3b2o2b2obo2bo2b2o6b2o4b
2o3b2o2b2obo2bo2b2o6b2o4b2o3b2o2b2obo2bo2b2o6b2o4b2o3b2o2b2o$bo2bobob
2ob2obobob2o3b2o4bo3bo2bobob2ob2obobob2o3b2o4bo3bo2bobob2ob2obobob2o3b
2o4bo3bo2bobob2ob2obobob2o3b2o4bo$bo2bo2bo2b2obob2obobob2ob2o3bo2bo2bo
2bo2b2obob2obobob2ob2o3bo2bo2bo2bo2b2obob2obobob2ob2o3bo2bo2bo2bo2b2ob
ob2obobob2ob2o3bo$2bo2bobo5bo5b2obo4b2obo3bo2bobo5bo5b2obo4b2obo3bo2bo
bo5bo5b2obo4b2obo3bo2bobo5bo5b2obo4b2obo$b2ob2o2bob2o2b2ob2o4bob2o2bob
ob2ob2o2bob2o2b2ob2o4bob2o2bobob2ob2o2bob2o2b2ob2o4bob2o2bobob2ob2o2bo
b2o2b2ob2o4bob2o2bobo$bo2bo2b2obob2o2b2ob2ob2obobobobobo2bo2b2obob2o2b
2ob2ob2obobobobobo2bo2b2obob2o2b2ob2ob2obobobobobo2bo2b2obob2o2b2ob2ob
2obobobobo$obo2bobo3bo2bo6b2o3b2o2bobobo2bobo3bo2bo6b2o3b2o2bobobo2bob
o3bo2bo6b2o3b2o2bobobo2bobo3bo2bo6b2o3b2o2bo$obob2o2bob2ob2ob2ob2o3b2o
3b2obobob2o2bob2ob2ob2ob2o3b2o3b2obobob2o2bob2ob2ob2ob2o3b2o3b2obobob
2o2bob2ob2ob2ob2o3b2o3b2o$bob2o2b2obo2bo2bob2ob2obob2obo3bob2o2b2obo2b
o2bob2ob2obob2obo3bob2o2b2obo2bo2bob2ob2obob2obo3bob2o2b2obo2bo2bob2ob
2obob2obo$bo4b2o3b2obo2bo5bobo2bob2obo4b2o3b2obo2bo5bobo2bob2obo4b2o3b
2obo2bo5bobo2bob2obo4b2o3b2obo2bo5bobo2bob2o$obo2b2o2b2o2b2ob2ob2ob2ob
o2bo3bobo2b2o2b2o2b2ob2ob2ob2obo2bo3bobo2b2o2b2o2b2ob2ob2ob2obo2bo3bob
o2b2o2b2o2b2ob2ob2ob2obo2bo$obob2o3bobo4bo2bob2o3b2ob2obobob2o3bobo4bo
2bob2o3b2ob2obobob2o3bobo4bo2bob2o3b2ob2obobob2o3bobo4bo2bob2o3b2ob2o$
bob2o2b2ob2o2b2ob2obo3b2o2bo2bobob2o2b2ob2o2b2ob2obo3b2o2bo2bobob2o2b
2ob2o2b2ob2obo3b2o2bo2bobob2o2b2ob2o2b2ob2obo3b2o2bo2bo$bo5bobo3b2obo
2b2o2b2obobo2bobo5bobo3b2obo2b2o2b2obobo2bobo5bobo3b2obo2b2o2b2obobo2b
obo5bobo3b2obo2b2o2b2obobo2bo$obob2o2b2o2b2o2bo5b2o2bo2bo2bobob2o2b2o
2b2o2bo5b2o2bo2bo2bobob2o2b2o2b2o2bo5b2o2bo2bo2bobob2o2b2o2b2o2bo5b2o
2bo2bo$obobob2o3b2o4bob2obo4bobo2bobobob2o3b2o4bob2obo4bobo2bobobob2o
3b2o4bob2obo4bobo2bobobob2o3b2o4bob2obo4bobo$bobobo2b2obo4b2obobob2ob
2o2bo2bobobo2b2obo4b2obobob2ob2o2bo2bobobo2b2obo4b2obobob2ob2o2bo2bobo
bo2b2obo4b2obobob2ob2o2bo$2obobo4bob2ob2o3b2o3b2o2b2ob2obobo4bob2ob2o
3b2o3b2o2b2ob2obobo4bob2ob2o3b2o3b2o2b2ob2obobo4bob2ob2o3b2o3b2o2b2o$o
3bob2o2bo3b2o2b2o3b2o4bo2bo3bob2o2bo3b2o2b2o3b2o4bo2bo3bob2o2bo3b2o2b
2o3b2o4bo2bo3bob2o2bo3b2o2b2o3b2o4bo$bob2o3b2obo5b2ob2obob2o3bo2bob2o
3b2obo5b2ob2obob2o3bo2bob2o3b2obo5b2ob2obob2o3bo2bob2o3b2obo5b2ob2obob
2o3bo$bobo2b2o2b2o2b2obo4bobo2b2obo2bobo2b2o2b2o2b2obo4bobo2b2obo2bobo
2b2o2b2o2b2obo4bobo2b2obo2bobo2b2o2b2o2b2obo4bobo2b2obo$2bobobobo4b2ob
obo2b2obo4bobo2bobobobo4b2obobo2b2obo4bobo2bobobobo4b2obobo2b2obo4bobo
2bobobobo4b2obobo2b2obo4bobo$b2obo2b2ob2obo2bobob2o3b2ob2obob2obo2b2ob
2obo2bobob2o3b2ob2obob2obo2b2ob2obo2bobob2o3b2ob2obob2obo2b2ob2obo2bob
ob2o3b2ob2obo$2o3b2o3bobobo2bob2o2b2o2b2o3b2o3b2o3bobobo2bob2o2b2o2b2o
3b2o3b2o3bobobo2bob2o2b2o2b2o3b2o3b2o3bobobo2bob2o2b2o2b2o$3b2o2b2o2b
2obo2bo5bob2o3b2o3b2o2b2o2b2obo2bo5bob2o3b2o3b2o2b2o2b2obo2bo5bob2o3b
2o3b2o2b2o2b2obo2bo5bob2o3b2o$ob2obo3b2o4bo2bo2b2obo2bob2obob2obo3b2o
4bo2bo2b2obo2bob2obob2obo3b2o4bo2bo2b2obo2bob2obob2obo3b2o4bo2bo2b2obo
2bob2o$obo2bo5b2ob2ob2ob2ob2ob2obo2bobo2bo5b2ob2ob2ob2ob2ob2obo2bobo2b
o5b2ob2ob2ob2ob2ob2obo2bobo2bo5b2ob2ob2ob2ob2ob2obo$bob2ob2ob2o2b2o2bo
2bo5bo3bo2bob2ob2ob2o2b2o2bo2bo5bo3bo2bob2ob2ob2o2b2o2bo2bo5bo3bo2bob
2ob2ob2o2b2o2bo2bo5bo3bo$bo3bo2b2ob2o5bo2bob2o2b2obo2bo3bo2b2ob2o5bo2b
ob2o2b2obo2bo3bo2b2ob2o5bo2bob2o2b2obo2bo3bo2b2ob2o5bo2bob2o2b2obo$ob
2obo7bob2obo2bobob2o2bob2ob2obo7bob2obo2bobob2o2bob2ob2obo7bob2obo2bob
ob2o2bob2ob2obo7bob2obo2bobob2o2bobo$bo2bob2ob2ob2obobobo2bobo2bobo3bo
2bob2ob2ob2obobobo2bobo2bobo3bo2bob2ob2ob2obobobo2bobo2bobo3bo2bob2ob
2ob2obobobo2bobo2bobo$2ob2o3b2ob2o3b2obob2obob2o2bob2ob2o3b2ob2o3b2obo
b2obob2o2bob2ob2o3b2ob2o3b2obob2obob2o2bob2ob2o3b2ob2o3b2obob2obob2o2b
o$o2bo2b2o6b2o4b2o3b2o2b2obo2bo2b2o6b2o4b2o3b2o2b2obo2bo2b2o6b2o4b2o3b
2o2b2obo2bo2b2o6b2o4b2o3b2o2b2o$bo2bobob2ob2obobob2o3b2o4bo3bo2bobob2o
b2obobob2o3b2o4bo3bo2bobob2ob2obobob2o3b2o4bo3bo2bobob2ob2obobob2o3b2o
4bo$bo2bo2bo2b2obob2obobob2ob2o3bo2bo2bo2bo2b2obob2obobob2ob2o3bo2bo2b
o2bo2b2obob2obobob2ob2o3bo2bo2bo2bo2b2obob2obobob2ob2o3bo$2bo2bobo5bo
5b2obo4b2obo3bo2bobo5bo5b2obo4b2obo3bo2bobo5bo5b2obo4b2obo3bo2bobo5bo
5b2obo4b2obo$b2ob2o2bob2o2b2ob2o4bob2o2bobob2ob2o2bob2o2b2ob2o4bob2o2b
obob2ob2o2bob2o2b2ob2o4bob2o2bobob2ob2o2bob2o2b2ob2o4bob2o2bobo$bo2bo
2b2obob2o2b2ob2ob2obobobobobo2bo2b2obob2o2b2ob2ob2obobobobobo2bo2b2obo
b2o2b2ob2ob2obobobobobo2bo2b2obob2o2b2ob2ob2obobobobo$obo2bobo3bo2bo6b
2o3b2o2bobobo2bobo3bo2bo6b2o3b2o2bobobo2bobo3bo2bo6b2o3b2o2bobobo2bobo
3bo2bo6b2o3b2o2bo$obob2o2bob2ob2ob2ob2o3b2o3b2obobob2o2bob2ob2ob2ob2o
3b2o3b2obobob2o2bob2ob2ob2ob2o3b2o3b2obobob2o2bob2ob2ob2ob2o3b2o3b2o$b
ob2o2b2obo2bo2bob2ob2obob2obo3bob2o2b2obo2bo2bob2ob2obob2obo3bob2o2b2o
bo2bo2bob2ob2obob2obo3bob2o2b2obo2bo2bob2ob2obob2obo$bo4b2o3b2obo2bo5b
obo2bob2obo4b2o3b2obo2bo5bobo2bob2obo4b2o3b2obo2bo5bobo2bob2obo4b2o3b
2obo2bo5bobo2bob2o$obo2b2o2b2o2b2ob2ob2ob2obo2bo3bobo2b2o2b2o2b2ob2ob
2ob2obo2bo3bobo2b2o2b2o2b2ob2ob2ob2obo2bo3bobo2b2o2b2o2b2ob2ob2ob2obo
2bo$obob2o3bobo4bo2bob2o3b2ob2obobob2o3bobo4bo2bob2o3b2ob2obobob2o3bob
o4bo2bob2o3b2ob2obobob2o3bobo4bo2bob2o3b2ob2o$bob2o2b2ob2o2b2ob2obo3b
2o2bo2bobob2o2b2ob2o2b2ob2obo3b2o2bo2bobob2o2b2ob2o2b2ob2obo3b2o2bo2bo
bob2o2b2ob2o2b2ob2obo3b2o2bo2bo$bo5bobo3b2obo2b2o2b2obobo2bobo5bobo3b
2obo2b2o2b2obobo2bobo5bobo3b2obo2b2o2b2obobo2bobo5bobo3b2obo2b2o2b2obo
bo2bo$obob2o2b2o2b2o2bo5b2o2bo2bo2bobob2o2b2o2b2o2bo5b2o2bo2bo2bobob2o
2b2o2b2o2bo5b2o2bo2bo2bobob2o2b2o2b2o2bo5b2o2bo2bo$obobob2o3b2o4bob2ob
o4bobo2bobobob2o3b2o4bob2obo4bobo2bobobob2o3b2o4bob2obo4bobo2bobobob2o
3b2o4bob2obo4bobo$bobobo2b2obo4b2obobob2ob2o2bo2bobobo2b2obo4b2obobob
2ob2o2bo2bobobo2b2obo4b2obobob2ob2o2bo2bobobo2b2obo4b2obobob2ob2o2bo$
2obobo4bob2ob2o3b2o3b2o2b2ob2obobo4bob2ob2o3b2o3b2o2b2ob2obobo4bob2ob
2o3b2o3b2o2b2ob2obobo4bob2ob2o3b2o3b2o2b2o$o3bob2o2bo3b2o2b2o3b2o4bo2b
o3bob2o2bo3b2o2b2o3b2o4bo2bo3bob2o2bo3b2o2b2o3b2o4bo2bo3bob2o2bo3b2o2b
2o3b2o4bo$bob2o3b2obo5b2ob2obob2o3bo2bob2o3b2obo5b2ob2obob2o3bo2bob2o
3b2obo5b2ob2obob2o3bo2bob2o3b2obo5b2ob2obob2o3bo$bobo2b2o2b2o2b2obo4bo
bo2b2obo2bobo2b2o2b2o2b2obo4bobo2b2obo2bobo2b2o2b2o2b2obo4bobo2b2obo2b
obo2b2o2b2o2b2obo4bobo2b2obo$2bobobobo4b2obobo2b2obo4bobo2bobobobo4b2o
bobo2b2obo4bobo2bobobobo4b2obobo2b2obo4bobo2bobobobo4b2obobo2b2obo4bob
o$b2obo2b2ob2obo2bobob2o3b2ob2obob2obo2b2ob2obo2bobob2o3b2ob2obob2obo
2b2ob2obo2bobob2o3b2ob2obob2obo2b2ob2obo2bobob2o3b2ob2obo$2o3b2o3bobob
o2bob2o2b2o2b2o3b2o3b2o3bobobo2bob2o2b2o2b2o3b2o3b2o3bobobo2bob2o2b2o
2b2o3b2o3b2o3bobobo2bob2o2b2o2b2o$3b2o2b2o2b2obo2bo5bob2o3b2o3b2o2b2o
2b2obo2bo5bob2o3b2o3b2o2b2o2b2obo2bo5bob2o3b2o3b2o2b2o2b2obo2bo5bob2o
3b2o$ob2obo3b2o4bo2bo2b2obo2bob2obob2obo3b2o4bo2bo2b2obo2bob2obob2obo
3b2o4bo2bo2b2obo2bob2obob2obo3b2o4bo2bo2b2obo2bob2o$obo2bo5b2ob2ob2ob
2ob2ob2obo2bobo2bo5b2ob2ob2ob2ob2ob2obo2bobo2bo5b2ob2ob2ob2ob2ob2obo2b
obo2bo5b2ob2ob2ob2ob2ob2obo$bob2ob2ob2o2b2o2bo2bo5bo3bo2bob2ob2ob2o2b
2o2bo2bo5bo3bo2bob2ob2ob2o2b2o2bo2bo5bo3bo2bob2ob2ob2o2b2o2bo2bo5bo3bo
$bo3bo2b2ob2o5bo2bob2o2b2obo2bo3bo2b2ob2o5bo2bob2o2b2obo2bo3bo2b2ob2o
5bo2bob2o2b2obo2bo3bo2b2ob2o5bo2bob2o2b2obo$ob2obo7bob2obo2bobob2o2bob
2ob2obo7bob2obo2bobob2o2bob2ob2obo7bob2obo2bobob2o2bob2ob2obo7bob2obo
2bobob2o2bobo$bo2bob2ob2ob2obobobo2bobo2bobo3bo2bob2ob2ob2obobobo2bobo
2bobo3bo2bob2ob2ob2obobobo2bobo2bobo3bo2bob2ob2ob2obobobo2bobo2bobo$2o
b2o3b2ob2o3b2obob2obob2o2bob2ob2o3b2ob2o3b2obob2obob2o2bob2ob2o3b2ob2o
3b2obob2obob2o2bob2ob2o3b2ob2o3b2obob2obob2o2bo$o2bo2b2o6b2o4b2o3b2o2b
2obo2bo2b2o6b2o4b2o3b2o2b2obo2bo2b2o6b2o4b2o3b2o2b2obo2bo2b2o6b2o4b2o
3b2o2b2o$bo2bobob2ob2obobob2o3b2o4bo3bo2bobob2ob2obobob2o3b2o4bo3bo2bo
bob2ob2obobob2o3b2o4bo3bo2bobob2ob2obobob2o3b2o4bo$bo2bo2bo2b2obob2obo
bob2ob2o3bo2bo2bo2bo2b2obob2obobob2ob2o3bo2bo2bo2bo2b2obob2obobob2ob2o
3bo2bo2bo2bo2b2obob2obobob2ob2o3bo$2bo2bobo5bo5b2obo4b2obo3bo2bobo5bo
5b2obo4b2obo3bo2bobo5bo5b2obo4b2obo3bo2bobo5bo5b2obo4b2obo$b2ob2o2bob
2o2b2ob2o4bob2o2bobob2ob2o2bob2o2b2ob2o4bob2o2bobob2ob2o2bob2o2b2ob2o
4bob2o2bobob2ob2o2bob2o2b2ob2o4bob2o2bobo$bo2bo2b2obob2o2b2ob2ob2obobo
bobobo2bo2b2obob2o2b2ob2ob2obobobobobo2bo2b2obob2o2b2ob2ob2obobobobobo
2bo2b2obob2o2b2ob2ob2obobobobo$obo2bobo3bo2bo6b2o3b2o2bobobo2bobo3bo2b
o6b2o3b2o2bobobo2bobo3bo2bo6b2o3b2o2bobobo2bobo3bo2bo6b2o3b2o2bo$obob
2o2bob2ob2ob2ob2o3b2o3b2obobob2o2bob2ob2ob2ob2o3b2o3b2obobob2o2bob2ob
2ob2ob2o3b2o3b2obobob2o2bob2ob2ob2ob2o3b2o3b2o$bob2o2b2obo2bo2bob2ob2o
bob2obo3bob2o2b2obo2bo2bob2ob2obob2obo3bob2o2b2obo2bo2bob2ob2obob2obo
3bob2o2b2obo2bo2bob2ob2obob2obo$bo4b2o3b2obo2bo5bobo2bob2obo4b2o3b2obo
2bo5bobo2bob2obo4b2o3b2obo2bo5bobo2bob2obo4b2o3b2obo2bo5bobo2bob2o$obo
2b2o2b2o2b2ob2ob2ob2obo2bo3bobo2b2o2b2o2b2ob2ob2ob2obo2bo3bobo2b2o2b2o
2b2ob2ob2ob2obo2bo3bobo2b2o2b2o2b2ob2ob2ob2obo2bo$obob2o3bobo4bo2bob2o
3b2ob2obobob2o3bobo4bo2bob2o3b2ob2obobob2o3bobo4bo2bob2o3b2ob2obobob2o
3bobo4bo2bob2o3b2ob2o$bob2o2b2ob2o2b2ob2obo3b2o2bo2bobob2o2b2ob2o2b2ob
2obo3b2o2bo2bobob2o2b2ob2o2b2ob2obo3b2o2bo2bobob2o2b2ob2o2b2ob2obo3b2o
2bo2bo$bo5bobo3b2obo2b2o2b2obobo2bobo5bobo3b2obo2b2o2b2obobo2bobo5bobo
3b2obo2b2o2b2obobo2bobo5bobo3b2obo2b2o2b2obobo2bo$obob2o2b2o2b2o2bo5b
2o2bo2bo2bobob2o2b2o2b2o2bo5b2o2bo2bo2bobob2o2b2o2b2o2bo5b2o2bo2bo2bob
ob2o2b2o2b2o2bo5b2o2bo2bo$obobob2o3b2o4bob2obo4bobo2bobobob2o3b2o4bob
2obo4bobo2bobobob2o3b2o4bob2obo4bobo2bobobob2o3b2o4bob2obo4bobo$bobobo
2b2obo4b2obobob2ob2o2bo2bobobo2b2obo4b2obobob2ob2o2bo2bobobo2b2obo4b2o
bobob2ob2o2bo2bobobo2b2obo4b2obobob2ob2o2bo$2obobo4bob2ob2o3b2o3b2o2b
2ob2obobo4bob2ob2o3b2o3b2o2b2ob2obobo4bob2ob2o3b2o3b2o2b2ob2obobo4bob
2ob2o3b2o3b2o2b2o$o3bob2o2bo3b2o2b2o3b2o4bo2bo3bob2o2bo3b2o2b2o3b2o4bo
2bo3bob2o2bo3b2o2b2o3b2o4bo2bo3bob2o2bo3b2o2b2o3b2o4bo$bob2o3b2obo5b2o
b2obob2o3bo2bob2o3b2obo5b2ob2obob2o3bo2bob2o3b2obo5b2ob2obob2o3bo2bob
2o3b2obo5b2ob2obob2o3bo$bobo2b2o2b2o2b2obo4bobo2b2obo2bobo2b2o2b2o2b2o
bo4bobo2b2obo2bobo2b2o2b2o2b2obo4bobo2b2obo2bobo2b2o2b2o2b2obo4bobo2b
2obo$2bobobobo4b2obobo2b2obo4bobo2bobobobo4b2obobo2b2obo4bobo2bobobobo
4b2obobo2b2obo4bobo2bobobobo4b2obobo2b2obo4bobo$b2obo2b2ob2obo2bobob2o
3b2ob2obob2obo2b2ob2obo2bobob2o3b2ob2obob2obo2b2ob2obo2bobob2o3b2ob2ob
ob2obo2b2ob2obo2bobob2o3b2ob2obo$2o3b2o3bobobo2bob2o2b2o2b2o3b2o3b2o3b
obobo2bob2o2b2o2b2o3b2o3b2o3bobobo2bob2o2b2o2b2o3b2o3b2o3bobobo2bob2o
2b2o2b2o$3b2o2b2o2b2obo2bo5bob2o3b2o3b2o2b2o2b2obo2bo5bob2o3b2o3b2o2b
2o2b2obo2bo5bob2o3b2o3b2o2b2o2b2obo2bo5bob2o3b2o$ob2obo3b2o4bo2bo2b2ob
o2bob2obob2obo3b2o4bo2bo2b2obo2bob2obob2obo3b2o4bo2bo2b2obo2bob2obob2o
bo3b2o4bo2bo2b2obo2bob2o$obo2bo5b2ob2ob2ob2ob2ob2obo2bobo2bo5b2ob2ob2o
b2ob2ob2obo2bobo2bo5b2ob2ob2ob2ob2ob2obo2bobo2bo5b2ob2ob2ob2ob2ob2obo$
bob2ob2ob2o2b2o2bo2bo5bo3bo2bob2ob2ob2o2b2o2bo2bo5bo3bo2bob2ob2ob2o2b
2o2bo2bo5bo3bo2bob2ob2ob2o2b2o2bo2bo5bo3bo$bo3bo2b2ob2o5bo2bob2o2b2obo
2bo3bo2b2ob2o5bo2bob2o2b2obo2bo3bo2b2ob2o5bo2bob2o2b2obo2bo3bo2b2ob2o
5bo2bob2o2b2obo$ob2obo7bob2obo2bobob2o2bob2ob2obo7bob2obo2bobob2o2bob
2ob2obo7bob2obo2bobob2o2bob2ob2obo7bob2obo2bobob2o2bobo$bo2bob2ob2ob2o
bobobo2bobo2bobo3bo2bob2ob2ob2obobobo2bobo2bobo3bo2bob2ob2ob2obobobo2b
obo2bobo3bo2bob2ob2ob2obobobo2bobo2bobo$2ob2o3b2ob2o3b2obob2obob2o2bob
2ob2o3b2ob2o3b2obob2obob2o2bob2ob2o3b2ob2o3b2obob2obob2o2bob2ob2o3b2ob
2o3b2obob2obob2o2bo$o2bo2b2o6b2o4b2o3b2o2b2obo2bo2b2o6b2o4b2o3b2o2b2ob
o2bo2b2o6b2o4b2o3b2o2b2obo2bo2b2o6b2o4b2o3b2o2b2o$bo2bobob2ob2obobob2o
3b2o4bo3bo2bobob2ob2obobob2o3b2o4bo3bo2bobob2ob2obobob2o3b2o4bo3bo2bob
ob2ob2obobob2o3b2o4bo$bo2bo2bo2b2obob2obobob2ob2o3bo2bo2bo2bo2b2obob2o
bobob2ob2o3bo2bo2bo2bo2b2obob2obobob2ob2o3bo2bo2bo2bo2b2obob2obobob2ob
2o3bo$2bo2bobo5bo5b2obo4b2obo3bo2bobo5bo5b2obo4b2obo3bo2bobo5bo5b2obo
4b2obo3bo2bobo5bo5b2obo4b2obo!
Added: 4 copies of a 48x48 solution

Code: Select all

x = 96, y = 96, , rule = B2o/S2mH:T96,96
2bobo4bo3b2obo2bo2b2o3bobobo2b2o4b2o2b2obo2bobo4bo3b2obo2bo2b2o3bobobo
2b2o4b2o2b2obo$o2bob2o2bob2o2b2ob2ob2ob2o2b2obo4b2ob2o3bobobo2bob2o2bo
b2o2b2ob2ob2ob2o2b2obo4b2ob2o3bobo$ob2o3b2ob2ob2o3bo2bo4b2o4bob2o2b2o
2b2ob2obob2o3b2ob2ob2o3bo2bo4b2o4bob2o2b2o2b2ob2o$b2o2b2o2bo5b2o2b2obo
b2o2b2o2bobobo5bobo4b2o2b2o2bo5b2o2b2obob2o2b2o2bobobo5bobo$o3b2obobob
2o4b2o2b2obob2o2b2obob2o2b2o2b2o2b2o3b2obobob2o4b2o2b2obob2o2b2obob2o
2b2o2b2o2bo$b2obo2bo2b2ob2o4bo5bo2bo3b2o4b2ob2o3b2ob2obo2bo2b2ob2o4bo
5bo2bo3b2o4b2ob2o3b2o$3bob2ob2o5b2ob2o2b2obo2bob2o3b2obo4b2obo4bob2ob
2o5b2ob2o2b2obo2bob2o3b2obo4b2obo$o2bo3bo2b2ob2o2b2o2b2obob2ob2ob2obob
ob2o4bob2o2bo3bo2b2ob2o2b2o2b2obob2ob2ob2obobob2o4bobo$b2ob2obo4b2obo
5bo2bo3bo5bob2o3b2ob2o3b2ob2obo4b2obo5bo2bo3bo5bob2o3b2ob2o$o2bo2bob2o
5bo3b2ob2obob2ob2ob2o4b2o2b2o2b2o2bo2bob2o5bo3b2ob2obob2ob2ob2o4b2o2b
2o2bo$bobob2o3b2ob2obob2obo2b2obo2bob2o2b2obob2o3b2obobob2o3b2ob2obob
2obo2b2obo2bob2o2b2obob2o3b2o$bo2b2o2b2o2b2ob2obo2bo6bo2bo3b2obobo2b2o
bo2bo2b2o2b2o2b2ob2obo2bo6bo2bo3b2obobo2b2obo$ob2o3b2obo8b2ob2ob2obob
2o2b2o2bobo4bob2ob2o3b2obo8b2ob2ob2obob2o2b2o2bobo4bobo$bo2bob2o2bo3b
2ob2o2bo2b2obob2o2b2o4bob2o2bo3bo2bob2o2bo3b2ob2o2bo2b2obob2o2b2o4bob
2o2bo$bo2bobo4bob2ob2obobo5bo5bo4b2o3b2ob2obo2bobo4bob2ob2obobo5bo5bo
4b2o3b2ob2o$obo2bob2ob2obo5bo2b2ob2obob2o2b2ob2o2b2o2bo2bobo2bob2ob2ob
o5bo2b2ob2obob2o2b2ob2o2b2o2bo$obob2o3b2o3b2ob2ob2o2b2ob2obob2o2b2o2b
2obobo2bobob2o3b2o3b2ob2ob2o2b2ob2obob2o2b2o2b2obobo$bob2o2b2o3b2o2b2o
bo2bo8bo2bo5bo2bo2b2obob2o2b2o3b2o2b2obo2bo8bo2bo5bo2bo2b2o$2o4b2ob2ob
ob2o3bob2o2b2ob2obob2o2b2o2b2ob2o2b2o4b2ob2obob2o3bob2o2b2ob2obob2o2b
2o2b2ob2o$3b2obo4bobo2b2o2b2o2b2ob2obob2o2b2ob2o2bo2b2o3b2obo4bobo2b2o
2b2o2b2ob2obob2o2b2ob2o2bo2b2o$2obobob2o2bobo4b2o4bo5bo4b2o4bobo4b2obo
bob2o2bobo4b2o4bo5bo4b2o4bobo$2bob2o3b2obob2o4b2o3bo2b2obo2b2o2b2obo2b
2o4bob2o3b2obob2o4b2o3bo2b2obo2b2o2b2obo2b2o$2bo4b2o2b2o3b2o4b2obob2ob
2ob2o2b2obob2o2b2o2bo4b2o2b2o3b2o4b2obob2ob2ob2o2b2obob2o2b2o$2obo2b2o
bo4b2o2b2o4bob2o5bo3bo2bo3b2o2b2obo2b2obo4b2o2b2o4bob2o5bo3bo2bo3b2o$
2b2ob2o2bo3b2ob2o2b2o2bo6b2ob2o2b2obo4b2o2b2ob2o2bo3b2ob2o2b2o2bo6b2ob
2o2b2obo4b2o$2o3bo4bob2o4b2o2b2obob2ob2obo2b2o2b2o2b2o2b2o3bo4bob2o4b
2o2b2obob2ob2obo2b2o2b2o2b2o$2b2o2b2ob2obo3b2o2b2o2b2obob2o2bo4b2o3b2o
b2o2b2o2b2ob2obo3b2o2b2o2b2obob2o2bo4b2o3b2ob2o$2o2b2o2b2o3bob2ob2o2b
2o4bo5bob2o2bob2o4b2o2b2o2b2o3bob2ob2o2b2o4bo5bob2o2bob2o$2bo3b2o4b2ob
o4b2o2b2ob2o2b2obobobobobo2b2o3bo3b2o4b2obo4b2o2b2ob2o2b2obobobobobo2b
2o$obob2o2b2ob2o3b2o4bo3b2o2b2obobob2o2bobobob2obob2o2b2ob2o3b2o4bo3b
2o2b2obobob2o2bobobobo$bob2ob2o2b2o2b2o2b2ob2ob2o3b2o2bobo4b2obo2bo2bo
b2ob2o2b2o2b2o2b2ob2ob2o3b2o2bobo4b2obo2bo$bo6bo5bob2o2b2o2bob2obo4bob
2ob2o3bobo2bo6bo5bob2o2b2o2bob2obo4bob2ob2o3bobo$2bob2o2bob2o3bo2bo6bo
2bob2ob2o3b2o3b2o2bo2bob2o2bob2o3bo2bo6bo2bob2ob2o3b2o3b2o2bo$b2obob2o
b2ob2obo2bo3b2obob2o3b2o2b2o4b2o2b2ob2obob2ob2ob2obo2bo3b2obob2o3b2o2b
2o4b2o2b2o$bo3bo2bo5bobo2bob2obob2o2b2o3b2ob2ob2o3bo2bo3bo2bo5bobo2bob
2obob2o2b2o3b2ob2ob2o3bo$ob2obob2o2b2obobob2obo2bo4b2ob2obo4b2o2b2ob2o
b2obob2o2b2obobob2obo2bo4b2ob2obo4b2o2b2obo$bo2bob2o2b2obobob2o3bo2bo
2b2o4bobob2o3b2obo2bo2bob2o2b2obobob2o3bo2bo2b2o4bobob2o3b2obo$2ob2o5b
o2bobo6bob2ob2o2b2obobobob2obo2bob2ob2o5bo2bobo6bob2ob2o2b2obobobob2ob
o2bo$o2bo2b2o3bo2bob2ob2o2b2o2bo2b2obobobobo2bob2ob2o2bo2b2o3bo2bob2ob
2o2b2o2bo2b2obobobobo2bob2obo$4bobob2obob2o3b2ob2o5bobo2bobobobo2bo3bo
5bobob2obob2o3b2ob2o5bobo2bobobobo2bo3bo$b2obo2bo2bob2o2b2o5bob2obo2b
2obobobobo2bob2o2b2obo2bo2bob2o2b2o5bob2obo2b2obobobobo2bob2o$2obobobo
2bo5bobob2obobobob2o2b2obobobo2bobo2b2obobobo2bo5bobob2obobobob2o2b2ob
obobo2bobo$o2bobo2bo2bob2o2b2obobobob2o3b2o4bobob2obobobo2bobo2bo2bob
2o2b2obobobob2o3b2o4bobob2obobo$bo2bobobo2bobob2o4b2obo4b2o2b2ob2obo3b
2obo2bo2bobobo2bobob2o4b2obo4b2o2b2ob2obo3b2obo$bob2obo2b2obobo2bob2o
4b2ob2ob2o2b2o3bo6bobob2obo2b2obobo2bob2o4b2ob2ob2o2b2o3bo6bo$2b2o3b2o
2b2obo2bobobob2o2b2o4b2o4b2o2b2o2bo2b2o3b2o2b2obo2bobobob2o2b2o4b2o4b
2o2b2o2bo$2o3b2o2b2o4bo2bob2obobo4b2o3b2ob2o2b2ob2ob2o3b2o2b2o4bo2bob
2obobo4b2o3b2ob2o2b2ob2o$2bob2ob2o2b2o2bo2bo5b2ob2obob2o3b2o2b2o4bo2bo
b2ob2o2b2o2bo2bo5b2ob2obob2o3b2o2b2o4bo$2bobo4bo3b2obo2bo2b2o3bobobo2b
2o4b2o2b2obo2bobo4bo3b2obo2bo2b2o3bobobo2b2o4b2o2b2obo$o2bob2o2bob2o2b
2ob2ob2ob2o2b2obo4b2ob2o3bobobo2bob2o2bob2o2b2ob2ob2ob2o2b2obo4b2ob2o
3bobo$ob2o3b2ob2ob2o3bo2bo4b2o4bob2o2b2o2b2ob2obob2o3b2ob2ob2o3bo2bo4b
2o4bob2o2b2o2b2ob2o$b2o2b2o2bo5b2o2b2obob2o2b2o2bobobo5bobo4b2o2b2o2bo
5b2o2b2obob2o2b2o2bobobo5bobo$o3b2obobob2o4b2o2b2obob2o2b2obob2o2b2o2b
2o2b2o3b2obobob2o4b2o2b2obob2o2b2obob2o2b2o2b2o2bo$b2obo2bo2b2ob2o4bo
5bo2bo3b2o4b2ob2o3b2ob2obo2bo2b2ob2o4bo5bo2bo3b2o4b2ob2o3b2o$3bob2ob2o
5b2ob2o2b2obo2bob2o3b2obo4b2obo4bob2ob2o5b2ob2o2b2obo2bob2o3b2obo4b2ob
o$o2bo3bo2b2ob2o2b2o2b2obob2ob2ob2obobob2o4bob2o2bo3bo2b2ob2o2b2o2b2ob
ob2ob2ob2obobob2o4bobo$b2ob2obo4b2obo5bo2bo3bo5bob2o3b2ob2o3b2ob2obo4b
2obo5bo2bo3bo5bob2o3b2ob2o$o2bo2bob2o5bo3b2ob2obob2ob2ob2o4b2o2b2o2b2o
2bo2bob2o5bo3b2ob2obob2ob2ob2o4b2o2b2o2bo$bobob2o3b2ob2obob2obo2b2obo
2bob2o2b2obob2o3b2obobob2o3b2ob2obob2obo2b2obo2bob2o2b2obob2o3b2o$bo2b
2o2b2o2b2ob2obo2bo6bo2bo3b2obobo2b2obo2bo2b2o2b2o2b2ob2obo2bo6bo2bo3b
2obobo2b2obo$ob2o3b2obo8b2ob2ob2obob2o2b2o2bobo4bob2ob2o3b2obo8b2ob2ob
2obob2o2b2o2bobo4bobo$bo2bob2o2bo3b2ob2o2bo2b2obob2o2b2o4bob2o2bo3bo2b
ob2o2bo3b2ob2o2bo2b2obob2o2b2o4bob2o2bo$bo2bobo4bob2ob2obobo5bo5bo4b2o
3b2ob2obo2bobo4bob2ob2obobo5bo5bo4b2o3b2ob2o$obo2bob2ob2obo5bo2b2ob2ob
ob2o2b2ob2o2b2o2bo2bobo2bob2ob2obo5bo2b2ob2obob2o2b2ob2o2b2o2bo$obob2o
3b2o3b2ob2ob2o2b2ob2obob2o2b2o2b2obobo2bobob2o3b2o3b2ob2ob2o2b2ob2obob
2o2b2o2b2obobo$bob2o2b2o3b2o2b2obo2bo8bo2bo5bo2bo2b2obob2o2b2o3b2o2b2o
bo2bo8bo2bo5bo2bo2b2o$2o4b2ob2obob2o3bob2o2b2ob2obob2o2b2o2b2ob2o2b2o
4b2ob2obob2o3bob2o2b2ob2obob2o2b2o2b2ob2o$3b2obo4bobo2b2o2b2o2b2ob2obo
b2o2b2ob2o2bo2b2o3b2obo4bobo2b2o2b2o2b2ob2obob2o2b2ob2o2bo2b2o$2obobob
2o2bobo4b2o4bo5bo4b2o4bobo4b2obobob2o2bobo4b2o4bo5bo4b2o4bobo$2bob2o3b
2obob2o4b2o3bo2b2obo2b2o2b2obo2b2o4bob2o3b2obob2o4b2o3bo2b2obo2b2o2b2o
bo2b2o$2bo4b2o2b2o3b2o4b2obob2ob2ob2o2b2obob2o2b2o2bo4b2o2b2o3b2o4b2ob
ob2ob2ob2o2b2obob2o2b2o$2obo2b2obo4b2o2b2o4bob2o5bo3bo2bo3b2o2b2obo2b
2obo4b2o2b2o4bob2o5bo3bo2bo3b2o$2b2ob2o2bo3b2ob2o2b2o2bo6b2ob2o2b2obo
4b2o2b2ob2o2bo3b2ob2o2b2o2bo6b2ob2o2b2obo4b2o$2o3bo4bob2o4b2o2b2obob2o
b2obo2b2o2b2o2b2o2b2o3bo4bob2o4b2o2b2obob2ob2obo2b2o2b2o2b2o$2b2o2b2ob
2obo3b2o2b2o2b2obob2o2bo4b2o3b2ob2o2b2o2b2ob2obo3b2o2b2o2b2obob2o2bo4b
2o3b2ob2o$2o2b2o2b2o3bob2ob2o2b2o4bo5bob2o2bob2o4b2o2b2o2b2o3bob2ob2o
2b2o4bo5bob2o2bob2o$2bo3b2o4b2obo4b2o2b2ob2o2b2obobobobobo2b2o3bo3b2o
4b2obo4b2o2b2ob2o2b2obobobobobo2b2o$obob2o2b2ob2o3b2o4bo3b2o2b2obobob
2o2bobobob2obob2o2b2ob2o3b2o4bo3b2o2b2obobob2o2bobobobo$bob2ob2o2b2o2b
2o2b2ob2ob2o3b2o2bobo4b2obo2bo2bob2ob2o2b2o2b2o2b2ob2ob2o3b2o2bobo4b2o
bo2bo$bo6bo5bob2o2b2o2bob2obo4bob2ob2o3bobo2bo6bo5bob2o2b2o2bob2obo4bo
b2ob2o3bobo$2bob2o2bob2o3bo2bo6bo2bob2ob2o3b2o3b2o2bo2bob2o2bob2o3bo2b
o6bo2bob2ob2o3b2o3b2o2bo$b2obob2ob2ob2obo2bo3b2obob2o3b2o2b2o4b2o2b2ob
2obob2ob2ob2obo2bo3b2obob2o3b2o2b2o4b2o2b2o$bo3bo2bo5bobo2bob2obob2o2b
2o3b2ob2ob2o3bo2bo3bo2bo5bobo2bob2obob2o2b2o3b2ob2ob2o3bo$ob2obob2o2b
2obobob2obo2bo4b2ob2obo4b2o2b2ob2ob2obob2o2b2obobob2obo2bo4b2ob2obo4b
2o2b2obo$bo2bob2o2b2obobob2o3bo2bo2b2o4bobob2o3b2obo2bo2bob2o2b2obobob
2o3bo2bo2b2o4bobob2o3b2obo$2ob2o5bo2bobo6bob2ob2o2b2obobobob2obo2bob2o
b2o5bo2bobo6bob2ob2o2b2obobobob2obo2bo$o2bo2b2o3bo2bob2ob2o2b2o2bo2b2o
bobobobo2bob2ob2o2bo2b2o3bo2bob2ob2o2b2o2bo2b2obobobobo2bob2obo$4bobob
2obob2o3b2ob2o5bobo2bobobobo2bo3bo5bobob2obob2o3b2ob2o5bobo2bobobobo2b
o3bo$b2obo2bo2bob2o2b2o5bob2obo2b2obobobobo2bob2o2b2obo2bo2bob2o2b2o5b
ob2obo2b2obobobobo2bob2o$2obobobo2bo5bobob2obobobob2o2b2obobobo2bobo2b
2obobobo2bo5bobob2obobobob2o2b2obobobo2bobo$o2bobo2bo2bob2o2b2obobobob
2o3b2o4bobob2obobobo2bobo2bo2bob2o2b2obobobob2o3b2o4bobob2obobo$bo2bob
obo2bobob2o4b2obo4b2o2b2ob2obo3b2obo2bo2bobobo2bobob2o4b2obo4b2o2b2ob
2obo3b2obo$bob2obo2b2obobo2bob2o4b2ob2ob2o2b2o3bo6bobob2obo2b2obobo2bo
b2o4b2ob2ob2o2b2o3bo6bo$2b2o3b2o2b2obo2bobobob2o2b2o4b2o4b2o2b2o2bo2b
2o3b2o2b2obo2bobobob2o2b2o4b2o4b2o2b2o2bo$2o3b2o2b2o4bo2bob2obobo4b2o
3b2ob2o2b2ob2ob2o3b2o2b2o4bo2bob2obobo4b2o3b2ob2o2b2ob2o$2bob2ob2o2b2o
2bo2bo5b2ob2obob2o3b2o2b2o4bo2bob2ob2o2b2o2bo2bo5b2ob2obob2o3b2o2b2o4b
o!
Last edited by pcallahan on November 30th, 2020, 11:13 am, edited 8 times in total.

Hunting
Posts: 4395
Joined: September 11th, 2017, 2:54 am

Re: Using a SAT solver to generate periodic hex still lifes

Post by Hunting » November 29th, 2020, 11:46 pm

No offense... but isn't this exactly what LifeFind does? LifeFind also supports hex INT and Generations rules.

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Using a SAT solver to generate periodic hex still lifes

Post by pcallahan » November 29th, 2020, 11:54 pm

Hunting wrote:
November 29th, 2020, 11:46 pm
No offense... but isn't this exactly what LifeFind does? LifeFind also supports hex INT and Generations rules.
There are a lot of different search programs out there. I intend to run more custom searches that may not fit into CA rules as neatly, so it is more proof of concept (for me, because others have done it) than a claim it's the only way to go about it. I was unable to get Logic Life Search to do this. There is another hex solver I haven't tried but it seemed easier just to write a custom script.

Can you give me a link and parameters that will get solve these in LifeFind?

Hunting
Posts: 4395
Joined: September 11th, 2017, 2:54 am

Re: Using a SAT solver to generate periodic hex still lifes

Post by Hunting » November 30th, 2020, 12:04 am

pcallahan wrote:
November 29th, 2020, 11:54 pm
Hunting wrote:
November 29th, 2020, 11:46 pm
No offense... but isn't this exactly what LifeFind does? LifeFind also supports hex INT and Generations rules.
There are a lot of different search programs out there. I intend to run more custom searches that may not fit into CA rules as neatly, so it is more proof of concept (for me, because others have done it) than a claim it's the only way to go about it. I was unable to get Logic Life Search to do this. There is another hex solver I haven't tried.

Can you give me a link and parameters that will do this for LifeFind?

Code: Select all

LifeFind[32, 32, 1, "Agar" -> True, "Rule" -> "B2o/S2m34H"]
should do the work, I think.

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Using a SAT solver to generate periodic hex still lifes

Post by pcallahan » November 30th, 2020, 12:16 am

Hunting wrote:
November 30th, 2020, 12:04 am

Code: Select all

LifeFind[32, 32, 1, "Agar" -> True, "Rule" -> "B2o/S2m34H"]
should do the work, I think.
Is this LifeFind? https://github.com/AlephAlpha/LifeFind

If I need Mathematica for it, that's a non-starter. I typically limit myself to free software or what I write myself. Also, my goal is to develop a SAT approach to tiling problems, not really CAs. I am interested, for example, in matching up hex tiles composed of three colored rhombuses (similar to Wang tiles). There are clearly other ways to find periodic still-life patterns, and lifesrc would be fine for CGOL. The point here was to develop a SAT solution specific to this problem.

I am impressed by the speed of lingeling. I was eventually able to get a 40x40 for B2o/S2m34H in under six minutes on my laptop. That requires assigning 1600 variables with 92800 clauses (though maybe it could be simplified). I am more interested in what I can extend it to. These are just examples, though I'll try LifeFind sometime if I have a chance.

Hunting
Posts: 4395
Joined: September 11th, 2017, 2:54 am

Re: Using a SAT solver to generate periodic hex still lifes

Post by Hunting » November 30th, 2020, 12:36 am

pcallahan wrote:
November 30th, 2020, 12:16 am
free software
Isn't Wolfram Language free?

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Using a SAT solver to generate periodic hex still lifes

Post by pcallahan » November 30th, 2020, 1:01 am

Hunting wrote:
November 30th, 2020, 12:36 am
pcallahan wrote:
November 30th, 2020, 12:16 am
free software
Isn't Wolfram Language free?
Eh. Not sure. As I explained, I have a different goal here. BTW, it just took a few hours to code up the Python part, and this was after putting the effort into exploring some other possibilities (mostly https://conwaylife.com/wiki/Logic_Life_Search, which doesn't generalize to hex rules).

If you can get a timing on generating a similar still life in LifeFind, I'm curious. LifeFind does not seem to be listed in the software page on the Wiki. I can't really benchmark against lifesrc either, even for CGOL still lifes, because there is no easy way to force them to be dense.

I have an example of using a SAT solver for 128x128 still lifes here https://conwaylife.com/forums/viewtopic ... 00#p113231 While there is nothing very interesting about generating unconstrained still lifes, I was still surprised that the SAT solver took only 18 seconds. It is unlikely that a naive backtracking solution could work this fast.

Hunting
Posts: 4395
Joined: September 11th, 2017, 2:54 am

Re: Using a SAT solver to generate periodic hex still lifes

Post by Hunting » November 30th, 2020, 1:09 am

pcallahan wrote:
November 30th, 2020, 1:01 am
If you can get a timing on generating a similar still life in LifeFind, I'm curious.
LifeFind took 45s to find a 64x64 unconstrained SL in Life.

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Using a SAT solver to generate periodic hex still lifes

Post by pcallahan » November 30th, 2020, 1:30 am

Hunting wrote:
November 30th, 2020, 1:09 am
pcallahan wrote:
November 30th, 2020, 1:01 am
If you can get a timing on generating a similar still life in LifeFind, I'm curious.
LifeFind took 45s to find a 64x64 unconstrained SL in Life.
Regular Life or the hex rule? For regular life, the SAT solver (lingeling) can find a solution in 0.9s:

Code: Select all

...
c    0.646  71% simplifying
c    0.264  29% search
c ==================================
c    0.910 100% all
c 
c          2612 conflicts,        2870.3 confs/sec
c             0 ternaries,           0.0 confs/ternary
c             0 binaries,            0.0 confs/binary
c             0 iterations,          0.0 confs/iteration
c 
c             1 reductions,          1.1 redus/sec,   2612.0 confs/reduction
c           122 restarts,          134.1 rests/sec,     21.4 confs/restart
c        244124 decisions,      268264.0 decis/sec,     93.5 decis/conflict
c        529687 propagations,   582064.7 props/sec,      2.2 props/decision
c 
c 0.9 seconds, 109.0 MB
That's with 4096 variables and 552960 clauses. I'm not sure why the second hex rule is so slow at 64x64. I think it is hard to make those loops fit the spacing and I wonder is some periodicities are easier than others.

Added: I see this in the LifeFind README:
This is a Mathematica package for finding patterns in life-like cellular automata. Inspired by Oscar Cunningham's Logic Life Search, it converts the problem to a SAT problem, and solves it with the built-in function SatisfiabilityInstances.
So yes, in that sense what I'm doing here is very similar (also inspired by Logic Life Search). However, I need something I know how to work with, so Python-generated DIMACS files is easier for me.

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Using a SAT solver to generate periodic hex still lifes

Post by pcallahan » November 30th, 2020, 2:30 am

Never mind. I messed up my own rule format, since my script needs to express all the 3 and 4 cell shapes explicitly. Here is the command to generate the SAT problem for a B2o/S2m34H still life. (I'll update the other post too.)

Code: Select all

python hexsat.py 64 64 02o 2m3o3p3mr3ml4o4m4p > sat.txt
./solvers/lingeling sat.txt | python decode.py 64 64  
lingeling takes 0.2 seconds on this. But the result is not as aesthetically pleasing. In the first post, I was using a much more limited survival rule of 2m. The only way for a cell to survive is to have live two neighbors 120° apart. Hence you have to pack everything into loops, making it harder to fit the constraints.

Note to Hunting. The appropriate benchmark for the hard example (first post) is

Code: Select all

LifeFind[32, 32, 1, "Agar" -> True, "Rule" -> "B02o/S2mH"]
lingeling solves that SAT problem in 19.5s. (Birth on 0 to rule out any empty neighborhoods.)

Tail of lingeling output.

Code: Select all

c    0.211  92% simplifying
c    0.018   8% search
c ==================================
c    0.229 100% all
c 
c           301 conflicts,        1316.1 confs/sec
c             0 ternaries,           0.0 confs/ternary
c             0 binaries,            0.0 confs/binary
c             0 iterations,          0.0 confs/iteration
c 
c             0 reductions,          0.0 redus/sec,      0.0 confs/reduction
c             6 restarts,           26.2 rests/sec,     50.2 confs/restart
c         40444 decisions,      176843.0 decis/sec,    134.4 decis/conflict
c         76321 propagations,   333716.7 props/sec,      1.9 props/decision
c 
c 0.2 seconds, 27.3 MB

Here's the still life (kind of dense and ugly).

Code: Select all

x = 64, y = 64, rule = B2o/S2m34H:T64,64
2ob3obobob3ob4ob3obob10obob3o2bob4o2b2o5bo2bo$ob2o2b6ob2o2b4o2bobo4b2o
b2o2b4o2b5obob3o2b6obo$3bo2b2obob2ob4o4b4ob4ob2obobobob3o4b5ob5obob2o$
7ob3ob3ob4ob3ob3ob2ob2obob4ob2ob4o6b2o2b2obo$b2obob2obob2o3bo2b4ob2ob
2o2bobob3obobobob3o2b3o2bob2ob4o$o2bobobob3ob5obobo4bobo2bob2obob4o2b
2o2b9ob2obobo$bob5obob2ob2ob2ob11ob6obob6o3bo3b2ob2obob2o$b3o2bo2b2obo
bobob3obob2o2bo2b3o2bob3o3bo2b8obo2b5o$bob4ob3ob2ob3o3b4obob4obob2obob
2ob3ob4o2b2ob5o$4obob3o2b2obob5obob4ob2obob5obob2ob2o4b2ob3obob3o$bobo
b4o3b2ob2obob2ob4ob2obob3o2bob2ob2obo2b7o2bobob2o$3ob2obob5obob3o3b2o
2b2obobobob3obobobob5obo2b8o$o2b3ob3obo2b4o2b5ob3obob2obob3ob6ob2ob3ob
ob2obo$2ob2o2b2ob3obo2b4ob2o2b2o2b2ob3obo2b3o2bobo3bob2ob2o2b4o$b3ob4o
b2ob5ob4ob4o2b3o2b5o2bo2b3ob4o2bob5obo$o3bob2ob3obobob3o2bo2b2ob3o2b2o
bo2b7o2b4ob5ob2o$7ob2o2b4o3b7ob7ob5obobob5o2bob2ob3ob3o$ob3ob3o3b2ob2o
2bob2o2b4o3b4o2b2ob5ob2o3b3ob2ob2obo$o6bob4obob6obo2bobob2o3b4o2b2obob
2ob4obo2b2ob4o$13ob3o2bo2b5o2b5o3b2ob2ob3ob3ob2ob2obobo2bo$2bob4obo3b
3ob5o3b2ob3o2b5ob2obo2b2o4bob2ob5ob2o$2ob2o3b4o4bob2o2b4ob3ob3ob2o3b6o
b2ob3ob3o3b4o$b4ob3obob2ob3o2b3ob4obob3obob4obobo2b5ob2o2b4obo$3bob2ob
o2bob3ob3ob3o4bob2o2b6ob3ob3o2bob2ob3ob2ob2o$b3o3b5obo5b3o2bob3ob2ob3o
bo2bo2b3ob2ob2obob2ob2obobo$2ob3obo3b9ob4ob3ob2ob2ob3ob3o2b2ob5ob2ob3o
b3o$b3ob2ob4obob2ob2o4b3o2b2ob2o2bob4ob3ob2obo2b2obobob2obo$bob3ob5ob
3ob2ob4obobobo3b2ob2o4b11ob5obo2bo$3o3b2o4b3o6b2ob2obob5ob8o7bo2b2obob
ob4o$2b2ob6o3bob6ob2ob5ob2obo3b2ob9ob3obob2obobo$o2b4o2bob10ob2ob3o4bo
b4o2bobobobob2ob3o2b2ob4o$3o4b2ob4o2bo4b2o3bob8ob8obo2bobobob3obo2b2o$
bob5ob3o2b14ob3obobobobobobob9ob2o2b3obo$b2o2b5o2b5ob2obo2b2obobo3b4ob
5obobob2obobob2ob3ob2o$ob4o4b5o2b2obob3o2b5ob2ob2obo2b4ob2ob6ob2obo2bo
$b2o2b8o2b10o2b2obobobobob2ob2o2b3obo4bobobob4o$2b2obo2bobo2b3obo2bo4b
3ob2ob2ob3ob3o2b2ob10o2bobobo$b2ob11o2bob6obob2ob3o3bobobo2b2o5bob2o2b
7o$3obobobo3bo2b6ob6ob2obob5ob6ob5obob5obo$bob6ob3o2bobo2bobo3bobob3o
2b3ob3obo2b5o2b2ob2o2b3o$2o4bob19ob3ob2obo2b3ob6o3b4obobo3b2o$b2ob5obo
3bobobobobob2ob2o4b2obobobob2ob2ob4obo2b3o4bo$2ob4o2b7obob5obo2b6ob2o
2bobobobobob2obob4ob2ob2o$b2obo3b3o2b2ob5o2b2ob3ob4o2b6ob6obob5o3b3o$
2obobob3obo2bo3bo2b2ob3ob2o4b3ob2ob4obo2b2o2bo3b4o2bo$ob2ob4ob5ob5ob2o
bo3b8o3bobobobob2o2b6ob2o2bo$obo2b2obobo2b2obobo2bo2b5o2bobo3bob3ob2ob
4ob3obob3obo$b6o2bob3o3bob4obobob5ob4ob2obob3obob3o2b2o4b3o$2obobobob
2ob3o2b4ob7obob5o2b2ob3obob4ob4ob5o$12o3b4obobobo2bob3obo3b3o2bo3b4o4b
o2b4o2bo$o4bobobo2bob4ob3obobob2obob6ob2ob5o3bob5o4b3o$b2ob2ob9o4bob
11o2b5ob3ob9obob4obo$8obob2obob7obobo3bo2b3o3b2o2bobo2b2o2bo2b3ob4o$2o
2bo2b3obob2ob2ob2obob2ob4ob4ob2obob6obob5ob3o2b2o$2b3o4b6ob2obob4ob4ob
2o3b4ob3obo2b4o2bobo2b3obo$obob2ob3obo2bob2ob2o2bob3o2bob6o2b3obob3obo
b3ob3obob2o$o2bob4obob5ob2ob3ob2ob3obob2obo2b2ob3obob3ob2ob2ob4o$4o3bo
b3ob2o3bob4o2bo2b2ob3o2b2o2bobob2ob3obobob2obobobo$o2b5o3b3ob7o2b4obob
3ob4o2b2ob2obobo2b4obob4o$o4b4o3bobob2obo3b4ob3obobob2ob4obo2b3ob3o2b
3obob2o$2ob2o4b2ob3o2bo2b5o3bo2b5obob2obob4obob2ob4ob2obo$2b6o2b3ob3ob
6ob5ob2obob2obo2bobobob2o2bo2b2obo3b2o$b3o2bob3ob3ob4o6b2ob3ob3ob2ob4o
b3ob7ob4ob2o$3obob2obo2bob2o2bob7obo6b2obob2ob2o3b2o2bob5ob3o!
Added:
The loop constraint appears easier to solve if you add survival on 2p (cells 180° apart). Here's a 64x64 example:

Code: Select all

x = 64, y = 64, rule = B2o/S2m2pH:T64,64
4bo3bo2bo3b2o2bo3bob3o3bobob2obo4bob2obo5bo5bob2o$5ob3o2bob2o4bo2b2obo
3b2obob2o2bob2obobo3bob2o2b2ob3obo$6bo3b2obobob3ob2o3bob2obobo3b2obobo
bobo2bobob2o2b2o3bo$5o2b2obo3b2obo3bo4bobo3bob2obo2bobo2bob2obobo2bo5b
2o$o4b2o2b2ob2o4b2obo3b2obo2b2o3bobobo2bobo3bobobobo3b3o$bob2o2bo4bobo
b2o2bobob2o3b3o2b3obobob2obob3obobo2bob2o$bobobobo2b2obob2obobobobo2b
2o5bo4bob2o2bobo4bob3obo2b3o$obobob2ob2ob2o4bobobobo2bobob3ob2o2bo5bo
2bob3o6bobo$obobo4bo5b3obobobob2ob2obo2bo2b3ob3o2b2ob2o3b5obobo$obo2b
3o2b4obo2b2obobo3bo4bo2b2o4bo2b2o2bo4b2o4bobobo$3b2o3b2o4bob2o3bobob3o
b3ob2o2bob2obo3bo2bob3o2b2o2bobo$b2o2b3o2bob2obo2bob2obobo3bo2bo2b3obo
b2ob2ob2ob2o4bob2ob2o$2ob2o3bobobobob3obo2bobob2obobo7bo3bobo2bo3b3obo
2bo$o4bob2obo2bobo5bo2bob2ob2o2bob4obob2obobobo2b2o2bobo2bobo$2b2obobo
3b2obobob3ob2obo6b2obo3b2obob2obobob2o3bobo2bobo$2bobob2ob2o2bobob2o2b
o2b2o2b5o2bob2o4bo4bob2o2b3obob2obo$b2o2bo3bob2obobo5bo4b2o6bobob3obob
2obo4b2o3bobo2bo$bo2b2ob2obo2bob2o2b2obo3b2o2b6obo4bob2ob2ob2obo2b2obo
b3o$bo2bo2bobobo2bo3b2obobob2o2b2o7bob2obo6bobobobob2o$2b2obobobobo2bo
2b2o2bobobo3bo2b5obobobobob3obobobobo4b3o$2o2b2obo2bob3ob2o3bo2b2ob2ob
3o4bobobob2obo2bobobobob3obo$2b2o4b2obo4bo2b2ob2o3bobo4b2obobobo4bo2bo
bo2b2o4bobo$2o2bob2o2bobob2obobobo2b3obob3obobob2obob2o2b2obob2o3b4obo
$obobobob2obob2obobobobo4b2o4bobobo3bobob2o2bobo2bob2o4bo$b2obobo3bobo
4b2obobob3o3b2o2bob2ob3o2bo2bobobob2obo3b2obo$5bob2obo2bob2o3bobobo2b
2obob3o4bo3b2ob2obobobo3bob2ob2o$b3obo3bob2ob2obob2obo2bo3b2o5b3ob2obo
2bo2bobo2bob2obo$2o2bob4o3bo4b2o3bobo6b5o2bo2bobobo2bo2bobobo3bo2bo$4b
o6b3o2b2o3b2obob2ob2obo6bo2bo2bob2obobo2bob3ob3o$b3obo2b2obo3b2ob4ob2o
3b2obobob2o3bo2bobo3bobob3o4bo$2o2bob3obob2obo10b2o3bobobob2obo2bobob
3obo5b3obobo$4bo6bo2bobo2b8ob3obobobo2bobo2b2obo3bob3obo2b2obo$ob2ob6o
bobobob2o11bob2obo3bob2o4b2obobo2bob2o$obobo6bobobob2o2b7ob3o5bob2o3bo
b2o2b2obob2o3bob2o$3bob3ob2ob2o2bo4bo6b2o3b2o2bobo2b2ob2ob2o3bobo2b3ob
o$o2bo4b2obo3b2ob3obob3o4b3ob2obobobobo5b2obobob2o4bo$b2ob3o5b2obo2bo
2b2obo2b3obo5b2o2bobobob3o2bob2obo2b3o$3bo3b2ob2o2bobo2bo5bo4bobob3o3b
2obobobo2bo2bo3bo2bo2bo$3ob3o2b2ob3obo2bo3b3o2b3obobo2b2obo2bo2bob2ob
2ob3ob2obo$3bo3b2o8bo2bob2o3b2o3bo2b2o2bob2obobo3bo2bo3bo2bob2o$ob2ob
2o2bob3ob3o2bobo2b3o2b2ob2o2b3o3bobob2obob2ob3ob2o$b2o2bobobobo2b2o3b
2obob2o4bobo2bo5b2obobo2bob2o2bo3bo2b2o$o5bobobobo4b3o2bobo3b2obobobo
3b3obob2o2bo4b2o2b2ob2o$b4obobobobob2obo4bobob3obobobobob2o4bo3b2ob4o
2b2o2bo$o4b2o2bobob2obob4obob2o3bo2bobob2o2b3obob2o2bo5bo2b2obo$b3o4b
2obo4bo5bobo3b2obobobo5bo2bob2o3bob2o3bobo2bo$4b5o3b3o2b5obobob2obobob
obo2b2obo2bo4b2obob2obo2bobo$b2o7b2o3b2o5bob2obo2bobo2bob3ob2ob2o2b3o
2bo3bobobobo$2ob4ob3ob3o2bob2obo5bobo2bobo8bo2b2o5bo2bo2bobo$7b2o6bobo
bobobob2obo2b2obobob2ob2obob2o3b2obo3bobo2bo$b6o3b5obob2o2bob2obob2o2b
ob2obob2obob2o3b2obob2obo2bobo$2o5b2obo4bobo3b2o5bo2bobo4bo4bo4b3o3bo
2bob2obo$3b3o3bob4obobob2o2b2o2bo2bobob4ob3obob3o3b2obobo3bobo$b3o2b4o
5bobob2o2b2ob2obo2b2obo4bo2b2obo3b3obobob2obobo$2o9b3o2bobo4bo4bob2o3b
o2b2ob2o4b2obo4bobo2bobo$3b3ob5o2b2obobob2obo3bo3b2obob2obo2bob2o2b2ob
2obo2bobobo$2b2o2b2o8bob2obob2o2b2ob2o2bob2o3bobobobo4bobob2obobobo$b
2o6b5o2bo5bo3b2o2bobo2bo5bobobobo2b2ob2o3bob2obo$bo4b4o4b2ob5ob2obo3bo
bo2bob3o2b2obobob2obo3b2obo3bo$obo2b2o4b2o3bo5bo2bob3obob3obo2b2o4bob
2o2bo2b2obob3o$obob2o2b4ob2obob4obobo4bobo5bo3b2ob2o5bob2o3bo3bo$2bobo
2b2o6b2obo3bobobob3o2bob4ob2o2b2o2b5obo4bob2o$obo2bobo2b3o6b2o2b2obobo
3b2obo4bobo5bo5bob2o2b2obo$b2ob2obo2bo2b2ob3o2b2o4bob2obo3bob3obo3b2ob
5ob2ob2o!
I like the look of B2o/S2m still lifes a lot more though.

Added: (birth on 6 neighbors to rule out the isolated loops. This took about a minute to find.)

Code: Select all

x = 32, y = 32, rule = B2o6/S2mH:T32,32
bo2bo6bob2o4b2ob2o2b2ob2o$bob2o2b2o2bobo3b2o2bo4bo4bo$2b2o2b2ob2obobob
2obobob2o2b2o2bo$2o3b2o4b2obobo2bo2b2ob2o2b2o$2bob2o3b2o4bob2ob2o5b2o
2bo$b2obo3b2ob2o2bo3bo2bob2o3bobo$2o3bob2o4b2ob2obo2bobob2obo$4b2obo3b
2o2bo2bobo2bobo2bob2o$2ob2o3bob2obobo2bobob2obob2o$2b2o3b2obo2bo2bo2bo
b2o3b2o2b2o$2o4b2o3b2obobo2bo4b2o3b2o$2b2ob2o2b2o2b2o2bo2bo2b2obob2o$
2o2b2o2b2ob2o3b2ob2ob2o2bobo$ob2o3b2o4b2obo2bo2bo4bobobo$4b2obo2b2o3bo
b2ob2ob2ob2obobo$2o4bobobob2obo3bo2bo2b2o3bo$2b2o2bobo2bo2bobo2bo2bo6b
2o$2o2b2obobobo2bobo3bo2bob2ob2o$ob2o2b2obo2bo2bobob2ob2obob2o2bo$4b2o
4bobob2obobo2bo3bo3b2o$b2o3b2o2bo2b2o3bobo2bob2o2b2o$2ob2o3b2ob2o4b2ob
o2bobo2b2o$o4b2o3bo2b2ob2o3bo2bobobo$b2o4b2obo4b2o4bob2obo2b2o$o2b2o4b
obob2o3b2o2b2o3b2o2bo$b2o2b2o2bobobob2obob2o3b2o2b2o$o2b2o2b2obobobo2b
obo2bob2ob2o2bo$b2o2b2o2b2obobo2bobo2bobo4b2o$o2bo3b2o4bob2obobo2bob2o
4bo$bobo5b2ob2o3b2obo2bo3b2o$bo2b2ob2o2b2o2b2o4bo2bo4b2o$ob2o2b2ob2o3b
2ob2o2bob2o2b2o2bo!
BTW, it's fairly easy to make a set of interlocking hex tiles to enforce these constraints. Unlike Moore neighborhoods, all neighboring cells are adjacent on a side, you can make a black-white boundary convex to concave, and black-black, white-white symmetric "s" and "z" curves. There are only 28 possible tiles (ignoring flips) and only subsets of tiles would come into play. It's possible that some subsets would make interesting puzzles or two-player games.

Added: Birth on 1 eliminates some gaps, but the result is more stringy than loopy, so less visually appealing (in my opinion).

Code: Select all

x = 32, y = 32, rule = B12o6/S2mH:T32,32
2bobo2bob2obobobo2bobo3bob2obo$b2o2bobo3bobobobobo2b2obobo3bo$bo2b2o2b
ob2obobobo2b2o2bobob2obo$obobo2b2obo3bobob2o2bobobo3bo$obo2bobo3bob2ob
o3bobo2bobob2o$bobobo2bob2obo3bob2o2bobobobo$bobo2bobobo3bob2obo2b2o2b
obob2o$obobobo2bob2obobo3bobo2b2obo$obobo2bobo3bobob2obo2bobo3bobo$3bo
bobo2bob2obo3bobobo2bob2obo$ob2obo2bobobo3bob2obo2bobobo$obo3bobo2bob
2obobo3bobo2bob2o$bob2obo2bobo3bobob2obo2bobo3bo$bo3bobobo2b2obobo3bob
obo2b2obo$ob2obobo2b2o2bobob2obobo2b2o2bo$o3bobob2o2bobobo3bobob2o2bob
o$b2obobo3bobo2bob2obobo3bobo2bo$3bobob2obo2bobo3bobobob2o2bobo$ob2obo
3bobobo2bob2obobobo2b2o$obo3bob2obo2bobobo3bobobobo2bo$3bob2obo3bobo2b
obob2obobo2bobo$2obobo3bob2o2bobobobo3bobobo$2bobob2obobo2b2o2bobob2ob
obo2b2o$obobo3bobobobo2b2obo3bobob2o$o2bob2obobobo2bobo3bob2obo3bo$bob
o3bobobobobo2b2obobo3bob2o$2o2bob2obobobo2b2o2bobobob2obo$o2b2obo3bobo
b2o2bobobobobo3bo$bobo3bob2obo3bobo2bobobob2obo$bo2b2obobo3bob2o2bobob
obo3bobo$2b2o2bobob2obobo2b2o2bobob2obobo$2o2bobobo3bobobobo2b2obo3bob
o!
If you allow some restricted branching (3p) then it's a lot easier to find satisfying patterns. Here are 4 copies of a 64x64 generated in under 15s.

Code: Select all

x = 128, y = 128, rule = B2o6/S2m3pH:T128,128
3bobo2b2o4b2obobo2b2obob2ob2o2b2ob2ob2obo2b2obo2b2ob2obo3bo4bobo2b2o4b
2obobo2b2obob2ob2o2b2ob2ob2obo2b2obo2b2ob2obo3bo$o2bobo4b2ob2o2bo2bobo
2bobo4b2o2b2o5bo2bo2bob2o2bo3b2o2b2o2bobo4b2ob2o2bo2bobo2bobo4b2o2b2o
5bo2bo2bob2o2bo3b2o2bo$b2obobob2o2b2ob2obobo2b2obobo2b2ob2o4b2o2b2ob2o
b2obo2bob2ob2o2b2obobob2o2b2ob2obobo2b2obobo2b2ob2o4b2o2b2ob2ob2obo2bo
b2ob2o$o2b2obobob2o5b2o2b2o2b2obob2o4b2ob2ob2o2b2obo3bo2bobo2bob2o2b2o
bobob2o5b2o2b2o2b2obob2o4b2ob2ob2o2b2obo3bo2bobo2bobo$b2o4bobo2b2o5b2o
2b2o4b2o3b2o2b2o4b2o3bob2obo2bobo2bo2b2o4bobo2b2o5b2o2b2o4b2o3b2o2b2o
4b2o3bob2obo2bobo2bo$3b2o2bobo2bob2ob2o2b2o2b2ob2o3b2ob2o4b2o2b2o2b2ob
2ob2obo2bo4b2o2bobo2bob2ob2o2b2o2b2ob2o3b2ob2o4b2o2b2o2b2ob2ob2obo2bo$
o4b2obob2obo2b2ob2o2b2o2b2o3b2o2bob2ob2ob2o2b2o5b2o3b2ob2o4b2obob2obo
2b2ob2o2b2o2b2o3b2o2bob2ob2ob2o2b2o5b2o3b2obo$b2ob2ob2obob2o7bo3b2o4b
2o4bo2b2o4bobob2o7b2ob2ob2ob2ob2obob2o7bo3b2o4b2o4bo2b2o4bobob2o7b2ob
2o$o2b2o6bo2b2ob2o2bob2o2b2ob2ob2ob2o4b2o2bo2bo2b2ob2ob2o4bo2b2o6bo2b
2ob2o2bob2o2b2ob2ob2ob2o4b2o2bo2bo2b2ob2ob2o$o6b2o2bob2ob2ob2ob2ob2o2b
2o2bob2obob2o2b2obobo4b2ob2obo2b2o6b2o2bob2ob2ob2ob2ob2o2b2o2bob2obob
2o2b2obobo4b2ob2obo2bo$bob2ob2ob2ob2o7bo2bo2bo3b2obo3bobob2o2b2o2b2ob
2o2bo2bob2obob2ob2ob2ob2o7bo2bo2bo3b2obo3bobob2o2b2o2b2ob2o2bo2bob2o$b
obob2o4b2o3b2o3bob2ob2o5b2ob2obobo2bo3b2o2b2o4bo2b2o2bobob2o4b2o3b2o3b
ob2ob2o5b2ob2obobo2bo3b2o2b2o4bo2b2o$2bobo2bo2b2o3b2ob2o2b2o2bob2ob2o
2b2ob2obob2o2b2obobo4b2o2bo4bobo2bo2b2o3b2ob2o2b2o2bob2ob2o2b2ob2obob
2o2b2obobo4b2o2bo$b2obo2bob2obob2o4b2o2bo2bo2b2obo8b2o2b2o2bo2bo2b2ob
2ob2ob2obo2bob2obob2o4b2o2bo2bo2b2obo8b2o2b2o2bo2bo2b2ob2ob2o$2obobo2b
2o2bobo4b2obobo2bob2o2bo3b2ob2o2bobo4bobob2o4bo2b2obobo2b2o2bobo4b2obo
bo2bob2o2bo3b2ob2o2bobo4bobob2o4bo$o2bobob2obo2bobo2b2o2bo2b2ob2o4bob
2ob2obobo2bo2b2o2b2ob2ob2ob2o2bobob2obo2bobo2b2o2bo2b2ob2o4bob2ob2obob
o2bo2b2o2b2ob2ob2obo$4bob2o2bob2obob2o4b2o2b2ob2ob2obo5bo2bobob2o2b2ob
o2b2ob2o4bob2o2bob2obob2o4b2o2b2ob2ob2obo5bo2bobob2o2b2obo2b2ob2o$2ob
2o3b2ob2o3b2o4b2ob2o2bo2b2obob2ob2obobo2b2obobo2bob2obo2b2ob2o3b2ob2o
3b2o4b2ob2o2bo2b2obob2ob2obobo2b2obobo2bob2obo$ob2ob2o3b2o2b2o2b2ob2o
4bobo2bo2bo3b2ob2o2bobo2bo2b2ob2o2bob2ob2ob2o3b2o2b2o2b2ob2o4bobo2bo2b
o3b2ob2o2bobo2bo2b2ob2o2bobo$bo2bo2b2obo2b2ob2o2b2o2b2obo2b2ob2ob2o7b
2o2b2obobob2ob2ob2obo2bo2b2obo2b2ob2o2b2o2b2obo2b2ob2ob2o7b2o2b2obobob
2ob2ob2o$bob2o4bobobo4bobo2b2obobobob2ob2ob2ob2ob2o2b2ob2o2bo2bo2b2o2b
ob2o4bobobo4bobo2b2obobobob2ob2ob2ob2ob2o2b2ob2o2bo2bo2b2o$ob2ob2ob2ob
o2bo2b2o2bobo2bobo2bo2bo3bob2ob2o3bo2bo2b2o2bo4b2ob2ob2ob2obo2bo2b2o2b
obo2bobo2bo2bo3bob2ob2o3bo2bo2b2o2bo4bo$b2obo2b2o3bobob2o2b2o2b2obobob
ob2ob2obo2bo3b2ob2obobob2ob2ob2ob2obo2b2o3bobob2o2b2o2b2obobobob2ob2ob
o2bo3b2ob2obobob2ob2ob2o$4bo4bob2o2b2o2b2o2b2ob2obo2b2ob2ob2ob2o2b2ob
2ob2o2bo2b2ob2o5bo4bob2o2b2o2b2o2b2ob2obo2b2ob2ob2ob2o2b2ob2ob2o2bo2b
2ob2o$b2o2b2o2bobo2b2obobo3bo2bo3b2o2bo5b2o2b2obo5bobob2o6b2o2b2o2bobo
2b2obobo3bo2bo3b2o2bo5b2o2b2obo5bobob2o$2ob2o2b2obobobo2bo2b2o2b2obob
2obobob2ob2o3bo2bob2o2bo2b2o3b2ob2ob2o2b2obobobo2bo2b2o2b2obob2obobob
2ob2o3bo2bob2o2bo2b2o3b2o$obo2bo3b2obo2bo2bobob2o2b2obo2bo2b2ob2o2b2ob
o2b2ob2ob2o4b2ob2obo2bo3b2obo2bo2bobob2o2b2obo2bo2b2ob2o2b2obo2b2ob2ob
2o4b2obo$2bo2bo7bobob2o2bo2bo3bob2ob2o7bob2ob2o4b2ob2ob2o2bo2bo2bo7bob
ob2o2bo2bo3bob2ob2o7bob2ob2o4b2ob2ob2o2bo$2ob2ob2ob2ob2o2b2o2b2ob2o2b
2o3bo2b2ob2o3bo2b2o2b2o3bo2b2ob2ob2ob2ob2ob2ob2o2b2o2b2ob2o2b2o3bo2b2o
b2o3bo2b2o2b2o3bo2b2ob2o$2b2ob2ob2ob2o2b2obobob2o2b2ob2obo2bob2ob2obo
6bob2obob2o4bo2b2ob2ob2ob2o2b2obobob2o2b2ob2obo2bob2ob2obo6bob2obob2o
4bo$2bo12bo2bo2bo2bobo4bobo2bo2bo2bobob2o3bo2bob2o2b2obo2bo12bo2bo2bo
2bobo4bobo2bo2bo2bobob2o3bo2bob2o2b2obo$2obo3b2ob2ob2ob2obobo2bo2bo2b
2obo2bo2bo2bobobob2obob2o4b2obob2obo3b2ob2ob2ob2obobo2bo2bo2b2obo2bo2b
o2bobobob2obob2o4b2obo$2b2o2b2ob2ob2ob2ob2o2b2obobob2o3bo2bo2bo2bobobo
2bob2obo2b2o2bo3b2o2b2ob2ob2ob2ob2o2b2obobob2o3bo2bo2bo2bobobo2bob2obo
2b2o2bo$b2o2b2obo2bo3bo5b2ob2o2b2obo2bob2o2bo2bobobo2bobo2bob2ob2obob
2o2b2obo2bo3bo5b2ob2o2b2obo2bob2o2bo2bobobo2bobo2bob2ob2obo$bo3bo2bo2b
ob2obo3b2o5b2o2bo3b2ob2ob2obobob2obob2ob2o4b2obo3bo2bo2bob2obo3b2o5b2o
2bo3b2ob2ob2obobob2obob2ob2o4b2o$2b2o2b2obo2b2ob2o2b2o2b2ob2ob2obob2ob
o2b2ob2obo3b2o3b2o3b2o4b2o2b2obo2b2ob2o2b2o2b2ob2ob2obob2obo2b2ob2obo
3b2o3b2o3b2o$2bob2o2b2o2bo2bo2b2o2b2ob2obo2b2obo2bob2o2bo3b2o4b2o4b2ob
2o2bob2o2b2o2bo2bo2b2o2b2ob2obo2b2obo2bob2o2bo3b2o4b2o4b2ob2o$2obo2b2o
2b2ob2obobo3bo5bob2o3b2ob2o4bob2ob2ob2ob2ob2o4b2obo2b2o2b2ob2obobo3bo
5bob2o3b2ob2o4bob2ob2ob2ob2ob2o$ob2ob2obo3b2ob2o2b2o2b2ob2ob2o3b2ob2ob
o2b2obo2bob2obo2b2o4b2ob2ob2obo3b2ob2o2b2o2b2ob2ob2o3b2ob2obo2b2obo2bo
b2obo2b2o4bo$5bo2bo9b2ob2o2b2ob2o3b2o2bo2bob2o3b2obo3bo4b2ob2o5bo2bo9b
2ob2o2b2ob2o3b2o2bo2bob2o3b2obo3bo4b2ob2o$2ob2ob2ob2ob2ob2obo4bo6bob2o
b2ob2ob2o3b2ob2ob2ob2ob2ob2ob2ob2ob2ob2ob2ob2obo4bo6bob2ob2ob2ob2o3b2o
b2ob2ob2ob2ob2o$2b2obo2bo2b2ob2obobo2b2o2b2ob2obo4b2ob2o3b2o4b2ob2ob2o
2bo4b2obo2bo2b2ob2obobo2b2o2b2ob2obo4b2ob2o3b2o4b2ob2ob2o2bo$b2o2bob2o
5bo2bobob2o2b2ob2o3b2ob2o6b2o3b2o2bo5bo2bo2b2o2bob2o5bo2bobob2o2b2ob2o
3b2ob2o6b2o3b2o2bo5bo2bo$2o4b2obob2o2b2obob2o2b2o5b2o2b2o3b2ob2o3b2obo
bob2o2bo2bob2o4b2obob2o2b2obob2o2b2o5b2o2b2o3b2ob2o3b2obobob2o2bo2bo$o
2b2obo2bobob2o2b2o4b2o2b2ob2ob2o4b2ob2o3b2o2bo2b2ob2obo2b2o2b2obo2bobo
b2o2b2o4b2o2b2ob2ob2o4b2ob2o3b2o2bo2b2ob2obo2bo$2b2obobo2bobo2bo3b2ob
2o2b2ob2o4b2ob2o6b2ob2obobo4b2ob2o2b2obobo2bobo2bo3b2ob2o2b2ob2o4b2ob
2o6b2ob2obobo4b2ob2o$2bo2bobob2obob2ob2o2b2o2b2o6b2o2b2o3b2ob2obo2b2o
2b2o2bob2o3bo2bobob2obob2ob2o2b2o2b2o6b2o2b2o3b2ob2obo2b2o2b2o2bob2o$
2ob2obob2o3b2ob2ob2o4bo3b2ob2ob2o4b2ob2o2bob2o2b2ob2obo3b2ob2obob2o3b
2ob2ob2o4bo3b2ob2ob2o4b2ob2o2bob2o2b2ob2obo$ob2ob2o4b2o2bo5bob2obob2ob
2obo2b2ob2o4bo2b2o3bo4b2o2b2ob2ob2o4b2o2bo5bob2obob2ob2obo2b2ob2o4bo2b
2o3bo4b2o2bo$7b2ob2obobob2ob2obob2obo2bo2bo2bob2ob2o2bo2bob2o2b2o2bo2b
2o7b2ob2obobob2ob2obob2obo2bo2bo2bob2ob2o2bo2bob2o2b2o2bo2b2o$2b2ob2o
2b2o2bo2b2ob2o3bo2bob2ob2obo2bo5b2obo2bo2b2o2b2obobo3b2ob2o2b2o2bo2b2o
b2o3bo2bob2ob2obo2bo5b2obo2bo2b2o2b2obobo$b2ob2obobo4b2o7b2o2bo3b2ob2o
b2o2b2o3b2o2bob2ob2o2b2o2bob2ob2obobo4b2o7b2o2bo3b2ob2ob2o2b2o3b2o2bob
2ob2o2b2o2bo$bo2bo2bo2b2ob2ob2ob2ob2ob2ob2obo4b2o2b2ob2o3b2ob2o4b2o3b
2obo2bo2bo2b2ob2ob2ob2ob2ob2ob2obo4b2o2b2ob2o3b2ob2o4b2o3b2o$2b2obo2b
2o2b2o4b2ob2obo2bo2bob2o4bobo2bob2o3b2o2b2o3b2obo3b2obo2b2o2b2o4b2ob2o
bo2bo2bob2o4bobo2bob2o3b2o2b2o3b2obo$obob2ob2obobo3b2o2bo3bob2ob2o3b2o
b2o2bo2bo2b2o4b2ob2o3bob2obob2ob2obobo3b2o2bo3bob2ob2o3b2ob2o2bo2bo2b
2o4b2ob2o3bobo$bobo2b2o2bo2bob2obobob2ob2ob2o2b2o2b2o2b2ob2ob2ob2ob2o
4b2obo3bobo2b2o2bo2bob2obobob2ob2ob2o2b2o2b2o2b2ob2ob2ob2ob2o4b2obo$bo
bo4b2obobobo2bo2b2ob2o2bo2b2ob2o4bo2bo2bo4b2o3b2o2bob2obobo4b2obobobo
2bo2b2ob2o2bo2b2ob2o4bo2bo2bo4b2o3b2o2bob2o$obob2ob2ob2o2bobo2bobo2bo
4bobo4bob2ob2ob2ob2ob2obob2obobo3bobob2ob2ob2o2bobo2bobo2bo4bobo4bob2o
b2ob2ob2ob2obob2obobo$obo3b2o2bo2b2obob2o2bo2bo2b2o2b2ob2obob2ob2obo2b
2o2bobo2bo2b2obobo3b2o2bo2b2obob2o2bo2bo2b2o2b2ob2obob2ob2obo2b2o2bobo
2bo2b2o$bob2o3b2obobo3b2obobo2bob2o2b2ob2o3bo2bo3bo2bob2obob2ob2o2bobo
b2o3b2obobo3b2obobo2bob2o2b2ob2o3bo2bo3bo2bob2obob2ob2o2bo$bo3b2o3b2o
2bob2o2bo2bo2b2o3bo2bo3b2o2bob2obo2bo2b2o3bo2bobobo3b2o3b2o2bob2o2bo2b
o2b2o3bo2bo3b2o2bob2obo2bo2b2o3bo2bobo$ob2o3b2o4b2obo4bobob2ob2o2b2obo
b2obo2b2ob2ob2ob2obo2bob2o2bob2o3b2o4b2obo4bobob2ob2o2b2obob2obo2b2ob
2ob2ob2obo2bob2o$o3b2o3b2ob2o3b2ob2o2b2o4b2o2b2obo2bob2obo2b2o2bo2bo3b
2o2b2o3b2o3b2ob2o3b2ob2o2b2o4b2o2b2obo2bob2obo2b2o2bo2bo3b2o2bo$b2obob
2o3b2o2b2o2b2o2b2o3b2o2b2o4b2ob2o2bob2ob2obo2bob2o2b2ob2obob2o3b2o2b2o
2b2o2b2o3b2o2b2o4b2ob2o2bob2ob2obo2bob2o2b2o$3bobo2b2o4b2obobo2b2obob
2ob2o2b2ob2ob2obo2b2obo2b2ob2obo3bo4bobo2b2o4b2obobo2b2obob2ob2o2b2ob
2ob2obo2b2obo2b2ob2obo3bo$o2bobo4b2ob2o2bo2bobo2bobo4b2o2b2o5bo2bo2bob
2o2bo3b2o2b2o2bobo4b2ob2o2bo2bobo2bobo4b2o2b2o5bo2bo2bob2o2bo3b2o2bo$b
2obobob2o2b2ob2obobo2b2obobo2b2ob2o4b2o2b2ob2ob2obo2bob2ob2o2b2obobob
2o2b2ob2obobo2b2obobo2b2ob2o4b2o2b2ob2ob2obo2bob2ob2o$o2b2obobob2o5b2o
2b2o2b2obob2o4b2ob2ob2o2b2obo3bo2bobo2bob2o2b2obobob2o5b2o2b2o2b2obob
2o4b2ob2ob2o2b2obo3bo2bobo2bobo$b2o4bobo2b2o5b2o2b2o4b2o3b2o2b2o4b2o3b
ob2obo2bobo2bo2b2o4bobo2b2o5b2o2b2o4b2o3b2o2b2o4b2o3bob2obo2bobo2bo$3b
2o2bobo2bob2ob2o2b2o2b2ob2o3b2ob2o4b2o2b2o2b2ob2ob2obo2bo4b2o2bobo2bob
2ob2o2b2o2b2ob2o3b2ob2o4b2o2b2o2b2ob2ob2obo2bo$o4b2obob2obo2b2ob2o2b2o
2b2o3b2o2bob2ob2ob2o2b2o5b2o3b2ob2o4b2obob2obo2b2ob2o2b2o2b2o3b2o2bob
2ob2ob2o2b2o5b2o3b2obo$b2ob2ob2obob2o7bo3b2o4b2o4bo2b2o4bobob2o7b2ob2o
b2ob2ob2obob2o7bo3b2o4b2o4bo2b2o4bobob2o7b2ob2o$o2b2o6bo2b2ob2o2bob2o
2b2ob2ob2ob2o4b2o2bo2bo2b2ob2ob2o4bo2b2o6bo2b2ob2o2bob2o2b2ob2ob2ob2o
4b2o2bo2bo2b2ob2ob2o$o6b2o2bob2ob2ob2ob2ob2o2b2o2bob2obob2o2b2obobo4b
2ob2obo2b2o6b2o2bob2ob2ob2ob2ob2o2b2o2bob2obob2o2b2obobo4b2ob2obo2bo$b
ob2ob2ob2ob2o7bo2bo2bo3b2obo3bobob2o2b2o2b2ob2o2bo2bob2obob2ob2ob2ob2o
7bo2bo2bo3b2obo3bobob2o2b2o2b2ob2o2bo2bob2o$bobob2o4b2o3b2o3bob2ob2o5b
2ob2obobo2bo3b2o2b2o4bo2b2o2bobob2o4b2o3b2o3bob2ob2o5b2ob2obobo2bo3b2o
2b2o4bo2b2o$2bobo2bo2b2o3b2ob2o2b2o2bob2ob2o2b2ob2obob2o2b2obobo4b2o2b
o4bobo2bo2b2o3b2ob2o2b2o2bob2ob2o2b2ob2obob2o2b2obobo4b2o2bo$b2obo2bob
2obob2o4b2o2bo2bo2b2obo8b2o2b2o2bo2bo2b2ob2ob2ob2obo2bob2obob2o4b2o2bo
2bo2b2obo8b2o2b2o2bo2bo2b2ob2ob2o$2obobo2b2o2bobo4b2obobo2bob2o2bo3b2o
b2o2bobo4bobob2o4bo2b2obobo2b2o2bobo4b2obobo2bob2o2bo3b2ob2o2bobo4bobo
b2o4bo$o2bobob2obo2bobo2b2o2bo2b2ob2o4bob2ob2obobo2bo2b2o2b2ob2ob2ob2o
2bobob2obo2bobo2b2o2bo2b2ob2o4bob2ob2obobo2bo2b2o2b2ob2ob2obo$4bob2o2b
ob2obob2o4b2o2b2ob2ob2obo5bo2bobob2o2b2obo2b2ob2o4bob2o2bob2obob2o4b2o
2b2ob2ob2obo5bo2bobob2o2b2obo2b2ob2o$2ob2o3b2ob2o3b2o4b2ob2o2bo2b2obob
2ob2obobo2b2obobo2bob2obo2b2ob2o3b2ob2o3b2o4b2ob2o2bo2b2obob2ob2obobo
2b2obobo2bob2obo$ob2ob2o3b2o2b2o2b2ob2o4bobo2bo2bo3b2ob2o2bobo2bo2b2ob
2o2bob2ob2ob2o3b2o2b2o2b2ob2o4bobo2bo2bo3b2ob2o2bobo2bo2b2ob2o2bobo$bo
2bo2b2obo2b2ob2o2b2o2b2obo2b2ob2ob2o7b2o2b2obobob2ob2ob2obo2bo2b2obo2b
2ob2o2b2o2b2obo2b2ob2ob2o7b2o2b2obobob2ob2ob2o$bob2o4bobobo4bobo2b2obo
bobob2ob2ob2ob2ob2o2b2ob2o2bo2bo2b2o2bob2o4bobobo4bobo2b2obobobob2ob2o
b2ob2ob2o2b2ob2o2bo2bo2b2o$ob2ob2ob2obo2bo2b2o2bobo2bobo2bo2bo3bob2ob
2o3bo2bo2b2o2bo4b2ob2ob2ob2obo2bo2b2o2bobo2bobo2bo2bo3bob2ob2o3bo2bo2b
2o2bo4bo$b2obo2b2o3bobob2o2b2o2b2obobobob2ob2obo2bo3b2ob2obobob2ob2ob
2ob2obo2b2o3bobob2o2b2o2b2obobobob2ob2obo2bo3b2ob2obobob2ob2ob2o$4bo4b
ob2o2b2o2b2o2b2ob2obo2b2ob2ob2ob2o2b2ob2ob2o2bo2b2ob2o5bo4bob2o2b2o2b
2o2b2ob2obo2b2ob2ob2ob2o2b2ob2ob2o2bo2b2ob2o$b2o2b2o2bobo2b2obobo3bo2b
o3b2o2bo5b2o2b2obo5bobob2o6b2o2b2o2bobo2b2obobo3bo2bo3b2o2bo5b2o2b2obo
5bobob2o$2ob2o2b2obobobo2bo2b2o2b2obob2obobob2ob2o3bo2bob2o2bo2b2o3b2o
b2ob2o2b2obobobo2bo2b2o2b2obob2obobob2ob2o3bo2bob2o2bo2b2o3b2o$obo2bo
3b2obo2bo2bobob2o2b2obo2bo2b2ob2o2b2obo2b2ob2ob2o4b2ob2obo2bo3b2obo2bo
2bobob2o2b2obo2bo2b2ob2o2b2obo2b2ob2ob2o4b2obo$2bo2bo7bobob2o2bo2bo3bo
b2ob2o7bob2ob2o4b2ob2ob2o2bo2bo2bo7bobob2o2bo2bo3bob2ob2o7bob2ob2o4b2o
b2ob2o2bo$2ob2ob2ob2ob2o2b2o2b2ob2o2b2o3bo2b2ob2o3bo2b2o2b2o3bo2b2ob2o
b2ob2ob2ob2ob2o2b2o2b2ob2o2b2o3bo2b2ob2o3bo2b2o2b2o3bo2b2ob2o$2b2ob2ob
2ob2o2b2obobob2o2b2ob2obo2bob2ob2obo6bob2obob2o4bo2b2ob2ob2ob2o2b2obob
ob2o2b2ob2obo2bob2ob2obo6bob2obob2o4bo$2bo12bo2bo2bo2bobo4bobo2bo2bo2b
obob2o3bo2bob2o2b2obo2bo12bo2bo2bo2bobo4bobo2bo2bo2bobob2o3bo2bob2o2b
2obo$2obo3b2ob2ob2ob2obobo2bo2bo2b2obo2bo2bo2bobobob2obob2o4b2obob2obo
3b2ob2ob2ob2obobo2bo2bo2b2obo2bo2bo2bobobob2obob2o4b2obo$2b2o2b2ob2ob
2ob2ob2o2b2obobob2o3bo2bo2bo2bobobo2bob2obo2b2o2bo3b2o2b2ob2ob2ob2ob2o
2b2obobob2o3bo2bo2bo2bobobo2bob2obo2b2o2bo$b2o2b2obo2bo3bo5b2ob2o2b2ob
o2bob2o2bo2bobobo2bobo2bob2ob2obob2o2b2obo2bo3bo5b2ob2o2b2obo2bob2o2bo
2bobobo2bobo2bob2ob2obo$bo3bo2bo2bob2obo3b2o5b2o2bo3b2ob2ob2obobob2obo
b2ob2o4b2obo3bo2bo2bob2obo3b2o5b2o2bo3b2ob2ob2obobob2obob2ob2o4b2o$2b
2o2b2obo2b2ob2o2b2o2b2ob2ob2obob2obo2b2ob2obo3b2o3b2o3b2o4b2o2b2obo2b
2ob2o2b2o2b2ob2ob2obob2obo2b2ob2obo3b2o3b2o3b2o$2bob2o2b2o2bo2bo2b2o2b
2ob2obo2b2obo2bob2o2bo3b2o4b2o4b2ob2o2bob2o2b2o2bo2bo2b2o2b2ob2obo2b2o
bo2bob2o2bo3b2o4b2o4b2ob2o$2obo2b2o2b2ob2obobo3bo5bob2o3b2ob2o4bob2ob
2ob2ob2ob2o4b2obo2b2o2b2ob2obobo3bo5bob2o3b2ob2o4bob2ob2ob2ob2ob2o$ob
2ob2obo3b2ob2o2b2o2b2ob2ob2o3b2ob2obo2b2obo2bob2obo2b2o4b2ob2ob2obo3b
2ob2o2b2o2b2ob2ob2o3b2ob2obo2b2obo2bob2obo2b2o4bo$5bo2bo9b2ob2o2b2ob2o
3b2o2bo2bob2o3b2obo3bo4b2ob2o5bo2bo9b2ob2o2b2ob2o3b2o2bo2bob2o3b2obo3b
o4b2ob2o$2ob2ob2ob2ob2ob2obo4bo6bob2ob2ob2ob2o3b2ob2ob2ob2ob2ob2ob2ob
2ob2ob2ob2ob2obo4bo6bob2ob2ob2ob2o3b2ob2ob2ob2ob2ob2o$2b2obo2bo2b2ob2o
bobo2b2o2b2ob2obo4b2ob2o3b2o4b2ob2ob2o2bo4b2obo2bo2b2ob2obobo2b2o2b2ob
2obo4b2ob2o3b2o4b2ob2ob2o2bo$b2o2bob2o5bo2bobob2o2b2ob2o3b2ob2o6b2o3b
2o2bo5bo2bo2b2o2bob2o5bo2bobob2o2b2ob2o3b2ob2o6b2o3b2o2bo5bo2bo$2o4b2o
bob2o2b2obob2o2b2o5b2o2b2o3b2ob2o3b2obobob2o2bo2bob2o4b2obob2o2b2obob
2o2b2o5b2o2b2o3b2ob2o3b2obobob2o2bo2bo$o2b2obo2bobob2o2b2o4b2o2b2ob2ob
2o4b2ob2o3b2o2bo2b2ob2obo2b2o2b2obo2bobob2o2b2o4b2o2b2ob2ob2o4b2ob2o3b
2o2bo2b2ob2obo2bo$2b2obobo2bobo2bo3b2ob2o2b2ob2o4b2ob2o6b2ob2obobo4b2o
b2o2b2obobo2bobo2bo3b2ob2o2b2ob2o4b2ob2o6b2ob2obobo4b2ob2o$2bo2bobob2o
bob2ob2o2b2o2b2o6b2o2b2o3b2ob2obo2b2o2b2o2bob2o3bo2bobob2obob2ob2o2b2o
2b2o6b2o2b2o3b2ob2obo2b2o2b2o2bob2o$2ob2obob2o3b2ob2ob2o4bo3b2ob2ob2o
4b2ob2o2bob2o2b2ob2obo3b2ob2obob2o3b2ob2ob2o4bo3b2ob2ob2o4b2ob2o2bob2o
2b2ob2obo$ob2ob2o4b2o2bo5bob2obob2ob2obo2b2ob2o4bo2b2o3bo4b2o2b2ob2ob
2o4b2o2bo5bob2obob2ob2obo2b2ob2o4bo2b2o3bo4b2o2bo$7b2ob2obobob2ob2obob
2obo2bo2bo2bob2ob2o2bo2bob2o2b2o2bo2b2o7b2ob2obobob2ob2obob2obo2bo2bo
2bob2ob2o2bo2bob2o2b2o2bo2b2o$2b2ob2o2b2o2bo2b2ob2o3bo2bob2ob2obo2bo5b
2obo2bo2b2o2b2obobo3b2ob2o2b2o2bo2b2ob2o3bo2bob2ob2obo2bo5b2obo2bo2b2o
2b2obobo$b2ob2obobo4b2o7b2o2bo3b2ob2ob2o2b2o3b2o2bob2ob2o2b2o2bob2ob2o
bobo4b2o7b2o2bo3b2ob2ob2o2b2o3b2o2bob2ob2o2b2o2bo$bo2bo2bo2b2ob2ob2ob
2ob2ob2ob2obo4b2o2b2ob2o3b2ob2o4b2o3b2obo2bo2bo2b2ob2ob2ob2ob2ob2ob2ob
o4b2o2b2ob2o3b2ob2o4b2o3b2o$2b2obo2b2o2b2o4b2ob2obo2bo2bob2o4bobo2bob
2o3b2o2b2o3b2obo3b2obo2b2o2b2o4b2ob2obo2bo2bob2o4bobo2bob2o3b2o2b2o3b
2obo$obob2ob2obobo3b2o2bo3bob2ob2o3b2ob2o2bo2bo2b2o4b2ob2o3bob2obob2ob
2obobo3b2o2bo3bob2ob2o3b2ob2o2bo2bo2b2o4b2ob2o3bobo$bobo2b2o2bo2bob2ob
obob2ob2ob2o2b2o2b2o2b2ob2ob2ob2ob2o4b2obo3bobo2b2o2bo2bob2obobob2ob2o
b2o2b2o2b2o2b2ob2ob2ob2ob2o4b2obo$bobo4b2obobobo2bo2b2ob2o2bo2b2ob2o4b
o2bo2bo4b2o3b2o2bob2obobo4b2obobobo2bo2b2ob2o2bo2b2ob2o4bo2bo2bo4b2o3b
2o2bob2o$obob2ob2ob2o2bobo2bobo2bo4bobo4bob2ob2ob2ob2ob2obob2obobo3bob
ob2ob2ob2o2bobo2bobo2bo4bobo4bob2ob2ob2ob2ob2obob2obobo$obo3b2o2bo2b2o
bob2o2bo2bo2b2o2b2ob2obob2ob2obo2b2o2bobo2bo2b2obobo3b2o2bo2b2obob2o2b
o2bo2b2o2b2ob2obob2ob2obo2b2o2bobo2bo2b2o$bob2o3b2obobo3b2obobo2bob2o
2b2ob2o3bo2bo3bo2bob2obob2ob2o2bobob2o3b2obobo3b2obobo2bob2o2b2ob2o3bo
2bo3bo2bob2obob2ob2o2bo$bo3b2o3b2o2bob2o2bo2bo2b2o3bo2bo3b2o2bob2obo2b
o2b2o3bo2bobobo3b2o3b2o2bob2o2bo2bo2b2o3bo2bo3b2o2bob2obo2bo2b2o3bo2bo
bo$ob2o3b2o4b2obo4bobob2ob2o2b2obob2obo2b2ob2ob2ob2obo2bob2o2bob2o3b2o
4b2obo4bobob2ob2o2b2obob2obo2b2ob2ob2ob2obo2bob2o$o3b2o3b2ob2o3b2ob2o
2b2o4b2o2b2obo2bob2obo2b2o2bo2bo3b2o2b2o3b2o3b2ob2o3b2ob2o2b2o4b2o2b2o
bo2bob2obo2b2o2bo2bo3b2o2bo$b2obob2o3b2o2b2o2b2o2b2o3b2o2b2o4b2ob2o2bo
b2ob2obo2bob2o2b2ob2obob2o3b2o2b2o2b2o2b2o3b2o2b2o4b2ob2o2bob2ob2obo2b
ob2o2b2o!

User avatar
pcallahan
Posts: 854
Joined: April 26th, 2013, 1:04 pm

Re: Using a SAT solver to generate periodic hex still lifes

Post by pcallahan » December 6th, 2020, 1:23 am

[Note: I keep updating the red and blue indicators in the first image. I think I finally have the matching conditions right. It is easier to see with convex and concave boundaries but I don't have an easy way to do that.)

I was able to generate some more complex forms of periodicity (and I'm not sure this is available in any other hex search). Instead of pure toroidal periodicities, consider other symmetries of the rhombus formed by an NxN grid of hexagons. 60°-120° rhombuses can be tiled in a variety of ways, corresponding to plane partitions as shown by MacMahon https://en.wikipedia.org/wiki/Percy_Alexander_MacMahon.
output-onlinepngtools (10).png
output-onlinepngtools (10).png (222.43 KiB) Viewed 1887 times
The above rhombus can be tiled against itself flipped and rotated, and as long as boundaries are lined up so red and blue circles match squares of the same color, the cell neighborhoods are a still life with the rule B02o/S2m. When it is flipped (about the long diagonal) it can be tiled like a checkerboard and when rotated, it can be made to form hexagons as shown and extended indefinitely. These operations can be combined (again provided colored squares and circles match) and the result remains a still life patch:
Screen Shot 2020-12-05 at 10.05.57 PM.png
Screen Shot 2020-12-05 at 10.05.57 PM.png (1.24 MiB) Viewed 1921 times
Here's the flip-based form as a periodic still life.

Code: Select all

x = 64, y = 64, rule=B2o/S2mH:T64,64
b2o2bo3b2o3b2ob2o2b2o3bo2b2o3b2ob2obobo2bob2obob2obob2ob2o$o2b2obob2o
3b2ob2ob2o2b2obob2o2b2o3bo2bobo2bo5b2o3bo2bo3bo$b2o2b2obo3b2o7b2o2bob
2o2b2ob2o2b2obobo2bo2b2o4b2ob2o2b2o$3bo5bob2o4b2o4bobo5bo4b2o2b2obob2o
b2ob2ob2o2bo2b2o$2b2o2b2obobo4b2ob2o2bo2b2ob2ob2o4bo5b2o2bo4b2o4bobo$b
2o2b2obobobo2b2o4b2ob2o2b2obo2b2o2bo3b2o5bob2o3b2obo2b2o$2o2b2o2bobobo
b2o2b2o3bo2bo4bo4b2obob2obob2obobobob2obob2o$3b2o4bobob2o2b2ob2obob2o
2b2obob2o2b2obo2bobobobob2obo2bo3bo$2b2o2b2obobo5bo4bob2o2b2ob2obob2o
4b2obob2obo5b2ob2obo$b2o3bobobobo2b2obo2b2o4b2o6bo2bob2o2b2o5bo2b2o2bo
2bobo$bo2b2ob2obobob2ob2ob2o2b2obo3b2ob2ob2obob2o3b2o2bob2obobo2bobo$o
bobobo4bob2o5bo3bobobob2ob2o2bo3bo2bob2ob2ob2o2bo2bo2bo$obo2b2ob2obo6b
2ob2o2b2obobo7bob2ob2obo4bo5bobo2bo$bob2o3bobobob2ob2obo2b2o4bob2ob2ob
2obo2bo3bo2b2ob2ob2o2bo2bo$bo3b2o2b2obobob2o2bo4b2ob2o3b2ob2o3bo2bob2o
b2o2bob2o2b2ob2o$2bo4b2o4bobo5bob2o2b2o2b2o8bob2obo2bo4bo3b2o2bo$b2o2b
2o2b2o2bobob2ob2obobo5bobob2ob2o2b2o3b2obo2b2o2b2o4bo$bo2b2ob2o2b2obob
2ob2o3b2o2b2o2b2obob2ob2o3b2o2b2ob2o2b2o4b2o$2bobo4b2o2b2o7b2o3b2ob2o
4bo5b2obob2o3bo3bo4b2o$b2o2bob2o2b2o3b2ob2obob2obo4b2ob2o2b2o3bobo2b2o
2b2o2b2ob2o$2o2b2obob2o2bob2ob2obobo2bob2o4b2o2b2ob2obobo4b2o2b2o2b2o$
o3bo3bo2bobobo5bobob2o3b2o6bo4bobobob2o2b2o2b2o4bo$2b2ob2obo2bo2bob2ob
2obob2o2b2o2b2ob2o2b2o2bobobobobo3b2o2b2ob2o$b2obo2bobo2bobo3b2ob2o5bo
b2o2b2ob2o2b2obobobob2ob2o2b2o2b2o$bo2bo2bobob2o2bo8b2o3bo2bo6b2o2b2ob
obo4bobo3bo$2bo2bo2bob2o2b2o2b2ob2obob2obob2o2b2o4bo5bobob2ob2o2b2ob2o
$obo2bo2bo5bo2b2ob2obobo2bob2o2b2ob2o2bob2ob2obobobo3b2o2bobo$bobo2bo
2bo2b2obobo5bobo2bo5bo4b2ob2ob2o3bob2o2b2o4bo$bobob2ob2ob2ob2o2bo2b2ob
obo2bob2o2b2o4bo8bo4b2o2b2obo$2bob2o2bo2bo5b2ob2ob2obo2bobob2o2b2ob2o
2b2ob2o2b2ob2o2b2obobo$2bo6bo2bob2obo2bo6bo2bobo2b2o2b2o2b2ob2ob2o2b2o
2b2o2bobo$2obo2b2obo2bobobobo2bob2o2bob2obo4bo4b2o7b2o4bo4bo$2b2ob2obo
bo2bob2obob2obob2ob2o3b2o2bo3b2o3b2ob2o2b2o3bo2b2o$2o3bo2bobo2bo5b2o3b
o2bo3b2o2b2obob2o3b2ob2ob2o2b2obob2o$ob2o2b2obobo2bo2b2o4b2ob2o2b2ob2o
2b2obo3b2o7b2o2bob2o2bo$4b2o2b2obob2ob2ob2ob2o2bo2b2o4bo5bob2o4b2o4bob
o5bo$2o4bo5b2o2bo4b2o4bobo4b2o2b2obobo4b2ob2o2bo2b2ob2o$2b2o2bo3b2o5bo
b2o3b2obo2b2ob2o2b2obobobo2b2o4b2ob2o2b2obo$4b2obob2obob2obobobob2obob
2o2b2o2b2o2bobobob2o2b2o3bo2bo4bo$ob2o2b2obo2bobobobob2obo2bo3bo4b2o4b
obob2o2b2ob2obob2o2b2o$obob2o4b2obob2obo5b2ob2obo3b2o2b2obobo5bo4bob2o
2b2obo$3bo2bob2o2b2o5bo2b2o2bo2bobob2o3bobobobo2b2obo2b2o4b2o$ob2ob2ob
ob2o3b2o2bob2obobo2bobobo2b2ob2obobob2ob2ob2o2b2obo3bo$b2o2bo3bo2bob2o
b2ob2o2bo2bo2bobobobobo4bob2o5bo3bobobob2o$6bob2ob2obo4bo5bobo2bobobo
2b2ob2obo6b2ob2o2b2obobo$ob2ob2obo2bo3bo2b2ob2ob2o2bo2bobob2o3bobobob
2ob2obo2b2o4bobo$b2ob2o3bo2bob2ob2o2bob2o2b2ob2obo3b2o2b2obobob2o2bo4b
2ob2o$o8bob2obo2bo4bo3b2o2bo3bo4b2o4bobo5bob2o2b2o2bo$bob2ob2o2b2o3b2o
bo2b2o2b2o4bob2o2b2o2b2o2bobob2ob2obobo5bo$2obob2ob2o3b2o2b2ob2o2b2o4b
2obo2b2ob2o2b2obob2ob2o3b2o2b2o$4bo5b2obob2o3bo3bo4b2o3bobo4b2o2b2o7b
2o3b2ob2o$2ob2o2b2o3bobo2b2o2b2o2b2ob2o3b2o2bob2o2b2o3b2ob2obob2obo$2b
2o2b2ob2obobo4b2o2b2o2b2o3b2o2b2obob2o2bob2ob2obobo2bob2o$6bo4bobobob
2o2b2o2b2o4b2o3bo3bo2bobobo5bobob2o3b2o$2ob2o2b2o2bobobobobo3b2o2b2ob
2o2b2ob2obo2bo2bob2ob2obob2o2b2o$2b2ob2o2b2obobobob2ob2o2b2o2b2o2b2obo
2bobo2bobo3b2ob2o5bob2o$o6b2o2b2obobo4bobo3bo5bo2bo2bobob2o2bo8b2o3bo$
o2b2o4bo5bobob2ob2o2b2ob2o3bo2bo2bob2o2b2o2b2ob2obob2obobo$2b2ob2o2bob
2ob2obobobo3b2o2bob2obo2bo2bo5bo2b2ob2obobo2bob2o$2bo4b2ob2ob2o3bob2o
2b2o4bo2bobo2bo2bo2b2obobo5bobo2bo$o2b2o4bo8bo4b2o2b2obo2bobob2ob2ob2o
b2o2bo2b2obobo2bobo$b2o2b2ob2o2b2ob2o2b2ob2o2b2obobo2bob2o2bo2bo5b2ob
2ob2obo2bobo$o2b2o2b2o2b2ob2ob2o2b2o2b2o2bobo2bo6bo2bob2obo2bo6bo2bo$o
4bo4b2o7b2o4bo4bob2obo2b2obo2bobobobo2bob2o2bob2o!
This could be used as a decorative scheme, since the rhombus tiles are pretty easy to lay out with matching boundaries, but there there is enough room for variety that it might not be obvious to an observer that the the same tile is reused.

For completeness, here is the script used to generate the SAT instance. (I haven't tried to clean it up for distribution.)

Code: Select all

import re
import sys

m = int(sys.argv[1])
n = int(sys.argv[2])

birth = re.sub(r'([0-9])', ' \\1', sys.argv[3]).strip().split(" ")
survival = re.sub(r'([0-9])', ' \\1', sys.argv[4]).strip().split(" ")

HEXRULES = {
  '0': ['000000'],
  '1': ['100000', '010000', '001000', '000100', '000010', '000001'],
  '2o': ['110000', '011000', '001100', '000110', '100001', '000011'],
  '2m': ['101000', '010100', '100010', '001010', '010001', '000101'],
  '3o': ['111000', '011100', '001110', '110001', '100011', '000111'],
  '2p': ['100100', '010010', '001001'],
  '3mr': ['101100', '110010', '010110', '011001', '100101', '001011'],
  '3ml': ['110100', '011010', '100110', '101001', '001101', '010011'],
  '4o': ['111100', '011110', '111001', '110011', '100111', '001111'],
  '3p': ['101010', '010101'],
  '4m': ['111010', '101110', '110101', '011101', '101011', '010111'],
  '4p': ['110110', '101101', '011011'],
  '5': ['111110', '111101', '111011', '110111', '101111', '011111'],
  '6': ['111111']
}

# rotate 120 degrees in integer coordinate system
def rotate(x, y):
  return y - x, -x

# map coordinates to equivalent periodic range
def equivalence(x, y, period):
  return (x + y) % (3 * period) - y % period, y % period

# find rotation and coordinates in unrotated rhombus
def map_to_base(i, j, base_period):
  # convert i, j to (x, y) at centers of unit triangles
  period = base_period * 3
  x, y = 3 * j + 2, 3 * i + 1
  # find rotation and return corresponding i, j values
  for rotation in range(3):
    xp, yp = equivalence(x, y, period)
    if xp >= 0 and xp < period and yp >= 0 and yp < period:
      return yp / 3, xp / 3, rotation
    x, y = rotate(x, y)

def flip_delta(i, j, di, dj):
  i += di
  if i == -1 or i == m:
    (i, j) = (n - 1 - j, i - di)
    if dj != 0:
      return flip_delta(i, j, -dj, 0)
  j += dj
  if j == -1 or j == n:
    (i, j) = (j - dj, m - 1 - i)
  return (i, j)

def rotate_delta(i, j, di, dj):
  return map_to_base(i + di, j + dj, n)[:2]

def toroid_delta(i, j, di, dj):
  return ((i + di) % m, (j + dj) % n)

def ix(i, j):
  return n * i + j + 1

def neighborhood(i, j, delta_fn):
  neighbors = [ix(i, j)]
  for (di, dj) in [(-1, -1), (-1, 0), (0, 1), (1, 1), (1, 0), (0, -1)]:
    neighbors.append(ix(*delta_fn(i, j, di, dj)))
  return neighbors

def clauses(i, j, live, dead):
  res = []
  for fn in (rotate_delta, flip_delta):
    if fn != rotate_delta and i > 0 and j > 0 and i < m - 1 and j < m - 1: 
      continue

    cells = neighborhood(i, j, fn)
    for shape in sorted(HEXRULES):
      if shape not in live and shape not in dead:
        for ngh in HEXRULES[shape]:
          res.append([-val if bit == '1' else val for (val, bit) in zip(cells[1:], ngh)]) 
      elif shape not in live:
        for ngh in HEXRULES[shape]:
          res.append([-cells[0]] + [-val if bit == '1' else val for (val, bit) in zip(cells[1:], ngh)]) 
      elif shape not in dead:
        for ngh in HEXRULES[shape]:
          res.append([cells[0]] + [-val if bit == '1' else val for (val, bit) in zip(cells[1:], ngh)]) 
  return res

dead = [x for x in HEXRULES if x not in birth]

all_clauses = []
for i in range(m):
  for j in range(n):
    all_clauses.extend(clauses(i, j, survival, dead))
 
print "p cnf %d %d" % (m * n, len(all_clauses))
print "c tilecount: %d live: %s dead: %s" % (len(survival) + len(dead),
                                             ",".join(sorted(survival)), 
                                             ",".join(sorted(dead)))

for clause in all_clauses:
  print " ".join([str(x) for x in clause]), 0
It is invoked with

Code: Select all

python hexsat2.py 32 32 02o 2m > sat.txt

Post Reply