I've been working on this fun problem for a while. Here is my basic design. It uses only eight gliders. The eight 90 degree reflectors that are involved are reset at offset (-3, -6) using another 5 * 8 + 3 * 10 = 70 gliders.
My hope is to avoid any seeds that fire more than one glider. Once the reflectors have been reset it should be possible that eight gliders from the main SW/NE channel can be used to restart the reaction. Correct timing can hopefully be achieved by altering the spacing between the reflectors. E.g. moving a reflector one square to the north east will delay the returning SW glider by 8 generations. Putting an extra half-bakery in the way of a SW glider delays the glider by an odd number of cycles, so hopefully any timing is achievable.
Next I have four monochromatic salvos that reset both of the refelectors and give SW gliders of either colour. They are reasonably optimised for the number of "passes" required but could definitely be improved. More on this later.
Finally I have a very silly monochromatic salvo that shifts a honey farm by (-3, -6) and produces an extra loaf that can be pulled arbitrarily far away from the honey farm. Also as shown, it is easy to transform this loaf back into a honey farm of either color to act as a seed for any of the above 4 salvos. This pattern is very inefficient and was made almost entirely by hand. It would of course be better to be able to reconstitute the honey farm seeds directly from the ash of the big monochromatic salvos but it seemed daunting to do that once never mind four times over.
Here is a bit of explanation of how I came up with these salvos.
First of all I hacked gencols with the following little patch so that gencols only considers "even" translations in both the printing and the generation stages.
It seems to work as expected but I do not understand the gencols code well enough to be 100% sure.
Next I used this very crude script to filter for patterns that only produce gliders in a single direction (either NW or SE). It is based on a script that dvgrn wrote elsewhere on this forum. I can't remember where exactly.
From here I noted on which lane the glider was shot for each turner and how many passes were required to build the reflector (both in the shown orientation and the reflected one). Also, for the ash of each turner I found by hand a list of locations where a new honey farm could be created. The number of passes in the regeneration stage is unoptimised.
Code: Select all
# Data format:
#
# 0. color of hf
# 1. glider shoot distance
# 2. rough cost for right shot
# 3. rough cost for left shot
# 4. distances new hf's can be generated at. 1 in the second element of the
# tuple indicates transformation is via a block and so up to MAX block
# pulls are permitted before making the new hf.
#
# All data was generated by hand so could easily contain mistakes.
dat = [ (1, +11, 2, 2, [(+13,1),(+9,0),(18,1),(23,1)]), #2 loaf, 3 ship,
(0, -11, 3, 2, [(+7,1),(-12,0),(-17,1),(-3,1),(3,1)]),
(0, +3, 3, 1, [(-7,1),(-31,1),(-19,1),(-17,1)]),
(1, -1, 2, 3, [(+13,0),(+2,1),(+3,1),(+15,1),(+14,0)]),
(1, +55, 3, 4, [(+36,1),(+48,1),(+2,1),(+32,0),(34,0),(-2,0)]), #5 sh to h
(1, +6, 2, 4, [(+21,1),(+3,1),(-12,0),(8,1)]), #4 blinkers
(0, +29, 2, 3, [(+23,1),(+14,1),(-1,1),(+11,0),(+7,1)]), #5 via loaf
(0, +2, 4, 2, []),
(1, +5, 2, 3, [(-12,1)]),
(0, -7, 3, 3, [(-16,1)]),
(1, +15, 4, 4, [(-2,0)]),
(1, +20, 3, 3, [(4,1),(-5,0),(-10,1)]),
(1, -1, 3, 4, [(+14,0),(-2,1),(+13,0)]),
(1, +20, 3, 3, [(13,0),(14,1),(38,1),(36,1),(33,0),(35,1),(34,0)]),
(0, -2, 4, 3, [(8,1),(12,0),(-11,1),(-2,1)]), #3 kill h, bt to b
(0, +23, 3, 3, [(5,0),(17,1),(-4,1),(-7,0)]),
(1, +3, 4, 4, [(1,1),(27,1),(16,1),(17,1)])
]
MAX = 4
RIGHT = 2
LEFT = 3
def doit(sofar, hf, cost, maxcost, targets, direction):
if cost <= maxcost:
for z in dat:
if (hf - z[0]) % 2 == 0 and hf + z[1] == targets[0]:
if len(targets) == 1:
if cost + z[2] <= maxcost:
sofar.append((z[1], None, None))
print sofar, cost + z[2]
sofar.pop()
else:
for a, b in z[4]:
for pulls in range((MAX + 1) if b else 1):
newhf = hf + a + 3 * pulls
newcost = cost + z[direction]
if pulls > 0:
newcost += (pulls + 1) / 2
if pulls % 2 == 0 and newhf % 2 == 0:
newcost += 1
sofar.append((z[1], a, 3 * pulls))
doit(sofar, newhf, newcost, maxcost,
targets[1:], direction)
sofar.pop()
def go(targets, odd, maxcost, direction):
targets = [x + odd for x in targets]
for z in dat:
if (targets[0] - z[1] - z[0]) % 2 == 0:
doit([], targets[0] - z[1], 0, maxcost, targets, direction)
print "South East"
targets = [2,-4,-5,+4,+1,+8,-1,+20,+5-3]
# Try to exploit redundancy in the salvo. Any offset from -3 to +2
# kills the first block. Offsets 20 or 13 both kill the hive with the
# eighth glider.
for color in range(2):
print "color " + str(color)
targets[7] = 20
for i in range(-3, 3):
targets[0] = i
go(targets, color, 28.5 - color, RIGHT)
targets[7] = 13
for i in range(-3, 3):
targets[0] = i
go(targets, color, 28.5 - color, RIGHT)
print "North West"
targets = [-5, 0, 3, -7, -17, -11, 18, 9, 7, 5, 5]
#-9 <= targets[0] <= -4 and 0 can move to 2
#-12 <= targets[5] <= -7 and 5 can move to 9
for color in range(2):
print "color " + str(color)
for i in range(-9, -3):
a = targets[:]
a[0] = i
for j in range(3):
for k in range(-12, -8):
b = a[:]
b[5] = k
for l in range(5, 10):
go(b, color, 27 + 4 * color, LEFT)
b[l], b[l+1] = b[l+1], b[l]
a[j], a[j+1] = a[j+1], a[j]
With more careful optimisation and perhaps a collection of turners that can be made from objects other that a honey farm (hive would definitely be the next most useful starting object) I'm sure these salvos could be improved a lot. Nevertheless I think it should be possible to build a complete spaceship based on these components.