(27,1)c/72 caterpillar challenge

For discussion of specific patterns or specific families of patterns, both newly-discovered and well-known.
User avatar
biggiemac
Posts: 515
Joined: September 17th, 2014, 12:21 am
Location: California, USA

Re: (27,1)c/72 caterpillar challenge

Post by biggiemac » September 20th, 2016, 4:51 pm

Code: Select all

x = 172, y = 246, rule = B3/S23
66b2o$66b2o$54b2o$54b2o3$58b2o$58b2o11b2o$70bo2bo$54b2o14bobo$54b2o15b
o4$52b2o$51bo2bo$52b2o3$2bo$b3o$2obo$3o$b2o2$7b3o$7bo2bo$7bo57b2o$7bo
57b2o$8bobo42b2o$16bo36b2o$15b3o$14b2obo$14b3o40b2o$15b2o40b2o11b2o$
69bo2bo$69bobo$4bo65bo$3b3o$2b2obo$2b3o$3b2o46b2o$50bo2bo$9b3o39b2o$9b
o2bo$9bo$9bo$10bobo$18bo$17b3o$16b2obo$16b3o$17b2o2$64b2o$6bo57b2o$5b
3o44b2o$4b2obo44b2o$4b3o$5b2o$56b2o$11b3o42b2o11b2o$11bo2bo53bo2bo$11b
o40b2o14bobo$11bo40b2o15bo$12bobo$20bo$19b3o$18b2obo28b2o$18b3o28bo2bo
$19b2o29b2o3$8bo$7b3o$6b2obo$6b3o$7b2o2$13b3o$13bo2bo$13bo49b2o$13bo
49b2o$14bobo34b2o$22bo28b2o$21b3o$20b2obo$20b3o32b2o$21b2o32b2o11b2o$
67bo2bo$67bobo$10bo57bo$9b3o$8b2obo$8b3o$9b2o38b2o$48bo2bo$15b3o31b2o$
15bo2bo$15bo153b2o$15bo153bobo$16bobo150bo$24bo$23b3o$22b2obo$22b3o$
23b2o2$62b2o86b2o$12bo49b2o86bobo$11b3o36b2o98bo$10b2obo36b2o$10b3o$
11b2o$54b2o$17b3o34b2o11b2o$17bo2bo45bo2bo$17bo32b2o14bobo62b2o$17bo
32b2o15bo63bobo$18bobo110bo$26bo$25b3o$24b2obo20b2o$24b3o20bo2bo$25b2o
21b2o2$112b2o$14bo97bobo$13b3o96bo$12b2obo$12b3o$13b2o2$19b3o$19bo2bo$
19bo41b2o30b2o$19bo41b2o30bobo$20bobo26b2o42bo$28bo20b2o$27b3o$26b2obo
$26b3o24b2o$27b2o24b2o11b2o$65bo2bo$65bobo6b2o$16bo49bo7bobo$15b3o56bo
$14b2obo$14b3o$15b2o30b2o$46bo2bo$21b3o23b2o$21bo2bo$21bo$21bo$22bobo
44b3o$30bo40bo$29b3o38bo$28b2obo$28b3o$29b2o3$18bo$17b3o28b2o36b3o$16b
2obo28b2o38bo$16b3o68bo$17b2o$52b2o$23b3o26b2o$23bo2bo$23bo24b2o$23bo
24b2o$24bobo$32bo$31b3o12b2o$30b2obo12b2o$30b3o12bo2bo$31b2o12bo3b2o$
46b2o2$20bo$19b3o$18b2obo$18b3o$19b2o2$25b3o11bo$25bo2bo10bo$25bo$25bo
$26bobo$34bo$33b3o$32b2obo6bo$32b3o6bobo$33b2o5b2o2bo$44bo$38b2obo2bo$
22bo15b4o$21b3o13b3o3bo$20b2obo13b2o2bo$20b3o15bobo2b3o$21b2o16b6o$42b
3o$27b3o$27bo2bo$27bo15bobo$27bo15bobo$28bobo13bo8$24bo$23b3o$22b2obo$
22b3o$23b2o2$29b3o$29bo2bo$29bo$29bo$30bobo8$26bo$25b3o$24b2obo$24b3o$
25b2o2$31b3o$31bo2bo$31bo$31bo$32bobo!
This is a way to build the x2 streams, but it seems a little costly at 5 SL. The reflected NE glider is used to start a new construction target far enough right to align with the next ship. Using splitters with different timing should allow matching any color/phase LWSS - the one shown matches the middle LWSS in the 5 LWSS design chris_c posted.

x2 information is lost in this example, making the next synthesis require some explicit period doubler. I looked into NW/NE rake collisions to see if any are period doubling without being monstrously messy - none showed up. If we are looking for a self-sustaining x2 feedback loop, there should be an additional signal released by the no-fire option. There was a different block placement that gave off a SE glider but it also left two blocks behind so it seemed unusable.

With this as the example though, maybe someone can find significantly better ways to accomplish the same thing.
Physics: sophistication from simplicity.

chris_c
Posts: 966
Joined: June 28th, 2014, 7:15 am

Re: (27,1)c/72 caterpillar challenge

Post by chris_c » September 20th, 2016, 6:22 pm

biggiemac wrote: This is a way to build the x2 streams, but it seems a little costly at 5 SL.
It looks pretty good to me. 3SL for a clean and edgy LWSS seems reasonable and we can probably reduce the cost of the splitter by searching for ones directly from slow salvo instead of from 2SL seeds.
biggiemac wrote:If we are looking for a self-sustaining x2 feedback loop, there should be an additional signal released by the no-fire option. There was a different block placement that gave off a SE glider but it also left two blocks behind so it seemed unusable.

With this as the example though, maybe someone can find significantly better ways to accomplish the same thing.
I couldn't find anything that gives a clean glider using a single still life but I did find these alternative vanish reactions which may be useful:

Code: Select all

x = 119, y = 17, rule = B3/S23
3b2o49b2o44b3o$3b2o49b2o$107b2o$107b2o$7b2o49b2o$7b2o42bo6b2o$50bobo
58b2o$3b2o7bobo35bobo10bobo45b2o$3b2o7b2o37bo11b2o$13bo50bo51bobo$116b
2o$117bo$b2o49b2o$o2bo47bo2bo$b2o49b2o51b2o$104bo2bo$105b2o!
We can have blinkers (of this particular color and phase at least) as our x2 component using the following method:

Code: Select all

x = 78, y = 32, rule = B3/S23
2b3o37b3o2$o5bo33bo5bo$o5bo33bo5bo$o5bo33bo5bo2$42b3o3$15b3o37b3o$15bo
39bo$16bo39bo5$28b3o37b3o$28bo39bo$29bo39bo11$35b3o37b3o$35bo39bo$36bo
39bo!
I don't know about hives but there should be a method involving honey farms I imagine.

Since there is so much clearance in the LWSS recipe we could investigate alternative LOM seeds (possibly ones that are easy to make with our slow salvos) and hope that a clean glider can be made to pop out that way.

EDIT: A B-heptomino seed of opposite phase to that used below would yield a simple period doubler:

Code: Select all

x = 118, y = 130, rule = B3/S23
11bo$10bobo$11b2o2$3b2o$3b2o22$10bo$9bobo$10b2o2$2b2o$2b2o22$9bo$8bobo
$9b2o2$b2o$b2o2$69b2o$69bobo$69bo7$50b2o$50bobo$50bo7$31b2o$31bobo$8bo
22bo$7bobo$8b2o2$2o$2o2$12b2o$12bobo$12bo10$116b2o$115b2o$117bo7$97b2o
$96b2o$98bo7$78b2o$77b2o$79bo7$59b2o$58b2o$60bo!
Last edited by chris_c on September 20th, 2016, 8:20 pm, edited 1 time in total.

User avatar
biggiemac
Posts: 515
Joined: September 17th, 2014, 12:21 am
Location: California, USA

Re: (27,1)c/72 caterpillar challenge

Post by biggiemac » September 20th, 2016, 7:42 pm

I just resurrected the scss thread over in scripts. What occurred to me as I was thinking about parallel construction is a way to use only 4 LWSS instead of 5. In fact, it could be as low as 2 given some heisenburns.

We begin with a x2-spaced trail of something large (HF in the example), and hit it with a x1 rake such that the debris is gliderless and spans enough construction lanes to begin parallel construction using x1 rakes.

Code: Select all

x = 75, y = 82, rule = B3/S23
8bo$7bobo$7bobo$8bo2$3b2o7b2o$2bo2bo5bo2bo$3b2o7b2o2$8bo$7bobo$7bobo$
8bo40$72b2o$72bobo$6bo65bo$5bobo$5bobo$6bo2$b2o7b2o$o2bo5bo2bo$b2o7b2o
41b2o$53bobo$6bo46bo$5bobo$5bobo$6bo4$34b2o$34bobo$34bo7$15b2o$15bobo$
15bo!
It removes a zigzag, and might be more usable for the x2 LWSS constructions. The (major) downside is, I don't know the comparison between the number of rakes needed to turn this into options (1) and (2) from before and the depth feasible from a parallel-construction search utility. I imagine it isn't in our favor. However, parallel construction is likely to take larger depth to suffer the ballooning effect due to more candidates getting thrown out for poor behavior on one or the other target. Can't know for sure until it's written..!

At some point I think it'd be good if the parallel effort converged to build a x1 trail of splitters, so that there's no worry about achieving the extremely unlikely outcome of both giving a clean NE glider at the same point in the recipe. The second glider from the splitter goes on to activate the LWSS in one and destroy the constellation in the other.

For later constructions, the same doubling trick as above works starting from a x1 HF trail, just with more colorful debris.

Code: Select all

x = 75, y = 109, rule = B3/S23
9bo$8bobo$8bobo$9bo2$4b2o7b2o$3bo2bo5bo2bo$4b2o7b2o2$9bo$8bobo$8bobo$
9bo15$8bo$7bobo$7bobo$8bo2$3b2o7b2o$2bo2bo5bo2bo$3b2o7b2o2$8bo$7bobo$
7bobo$8bo15$7bo$6bobo$6bobo$7bo2$2b2o7b2o$bo2bo5bo2bo$2b2o7b2o2$7bo$6b
obo$6bobo$7bo13$72b2o$72bobo$6bo65bo$5bobo$5bobo$6bo2$b2o7b2o$o2bo5bo
2bo$b2o7b2o41b2o$53bobo$6bo46bo$5bobo$5bobo$6bo4$34b2o$34bobo$34bo7$
15b2o$15bobo$15bo!
And for the final construction, of the tracks that turn this singleton into the 5-track cluster, having a x1 trail to start off from is ideal. So really, all that we need is another tailored search program.. :D
Physics: sophistication from simplicity.

User avatar
biggiemac
Posts: 515
Joined: September 17th, 2014, 12:21 am
Location: California, USA

Re: (27,1)c/72 caterpillar challenge

Post by biggiemac » September 22nd, 2016, 4:13 pm

The blocks in this pattern are on the same lane with respect to NW rakes, but 2 cells displaced NW/SE. Parallel construction would then involve building the same pattern but 2 fd separate, and incorporating a x2 hive. That could work.

Code: Select all

x = 290, y = 192, rule = B3/S23
171b2o$171bobo$171bo7$152b2o$152bobo$bo150bo$b2o$obo5$133b2o$133bobo$
133bo7$114b2o$114bobo$35bo78bo$35b2o$34bobo5$95b2o$95bobo$95bo7$76b2o$
76bobo$69bo6bo$69b2o$68bobo23$227b2o$227bobo$227bo7$208b2o$208bobo$
208bo7$189b2o$189bobo$189bo7$170b2o$170bobo$170bo7$151b2o$151bobo$151b
o7$132b2o$132bobo$132bo25$287b2o$287bobo$287bo7$268b2o$268bobo$268bo7$
249b2o$249bobo$249bo7$230b2o$230bobo$230bo7$211b2o$211bobo$211bo7$192b
2o$192bobo$192bo!
Edit: the above from only 2 *WSS, with the -4 offsets worked out. The second NW rake may be moved downward in steps of 180 to keep the heisenburn working. The remaining gliders can be killed off with another LWSS as far spaced as it needs to be, meaning the MWSS construction can safely leave debris.

Code: Select all

x = 564, y = 649, rule = B3/S23
421b2o$421bobo$421bo7$402b2o$402bobo$402bo7$383b2o$383bobo$383bo7$364b
2o$364bobo$364bo7$345b2o$345bobo$345bo7$326b2o$326bobo$326bo7$307b2o$
307bobo$307bo7$288b2o$288bobo$288bo7$269b2o$269bobo$269bo7$250b2o$250b
obo$250bo7$231b2o$231bobo$231bo7$212b2o$212bobo$212bo7$193b2o$193bobo$
193bo7$174b2o$174bobo$174bo7$155b2o$155bobo$155bo7$136b2o$136bobo$136b
o7$117b2o$117bobo$117bo7$98b2o$98bobo$98bo7$79b2o$79bobo$79bo7$60b2o$
60bobo$60bo7$41b2o$41bobo$41bo7$22b2o$22bobo$22bo7$3b2o$3bobo$3bo2$5bo
$4b3o$4bob2o$5b3o$5b2o5$2b3o$bo2bo$4bo$o3bo$4bo$bobo4$7bo$6b3o26bo$6bo
b2o25b2o$7b3o24bobo$7b2o5$4b3o$3bo2bo$6bo$2bo3bo$6bo$3bobo4$9bo$8b3o
58bo$8bob2o57b2o$9b3o56bobo$9b2o4$455b2o$6b3o446bobo$5bo2bo446bo$8bo$
4bo3bo$8bo$5bobo3$436b2o$11bo424bobo$10b3o90bo332bo$10bob2o89b2o$11b3o
88bobo$11b2o4$417b2o$8b3o406bobo$7bo2bo406bo$10bo$6bo3bo$10bo$7bobo3$
398b2o$13bo384bobo$12b3o122bo260bo$12bob2o121b2o$13b3o120bobo$13b2o4$
379b2o$10b3o366bobo$9bo2bo366bo$12bo$8bo3bo$12bo$9bobo3$360b2o$15bo
344bobo$14b3o154bo188bo$14bob2o153b2o$15b3o152bobo$15b2o4$341b2o$12b3o
326bobo$11bo2bo326bo$14bo$10bo3bo$14bo$11bobo3$322b2o$17bo304bobo$16b
3o186bo116bo$16bob2o185b2o$17b3o184bobo$17b2o$508b2o$508bobo$508bo$
303b2o$14b3o286bobo$13bo2bo286bo$16bo$12bo3bo$16bo$13bobo473b2o$489bob
o$489bo$284b2o$19bo264bobo$18b3o218bo44bo$18bob2o217b2o$19b3o216bobo$
19b2o$470b2o$470bobo$470bo$265b2o$16b3o246bobo$15bo2bo246bo$18bo$14bo
3bo$18bo$15bobo433b2o$451bobo$451bo2$21bo$20b3o$20bob2o$21b3o$21b2o$
432b2o$264b2o166bobo$255b2o3b2o2b2o166bo$227b2o31b2o$18b3o206bobo21b2o
2bo$17bo2bo206bo27bo$20bo234bo2bo$16bo3bo235bo$20bo$17bobo393b2o$413bo
bo$413bo2$23bo$22b3o$22bob2o$23b3o$23b2o240bo$263bo2bo127b2o$266bo127b
obo$266bo2b2o123bo$189b2o69b2o$20b3o166bobo64b2o2b2o3b2o$19bo2bo166bo
66b2o$22bo$18bo3bo$22bo$19bobo353b2o$375bobo$375bo2$25bo$24b3o$24bob2o
$25b3o$25b2o$356b2o$356bobo$356bo$151b2o$22b3o126bobo$21bo2bo126bo$24b
o$20bo3bo$24bo$21bobo313b2o$337bobo$337bo2$27bo$26b3o$26bob2o$27b3o$
27b2o$318b2o$262b2o54bobo$258b2o2b2o54bo$113b2o143b2o301b2o$24b3o86bob
o445bobo$23bo2bo86bo447bo$26bo$22bo3bo$26bo$23bobo273b2o$299bobo$299bo
$542b2o$29bo512bobo$28b3o511bo$28bob2o$29b3o$29b2o$280b2o$280bobo$280b
o$75b2o181b2o263b2o$26b3o46bobo176b2o2b2o263bobo$25bo2bo46bo178b2o267b
o$28bo$24bo3bo$28bo$25bobo233b2o$261bobo$261bo$504b2o$31bo472bobo$30b
3o471bo$30bob2o$31b3o$31b2o4$37b2o446b2o$28b3o6bobo445bobo$27bo2bo6bo
447bo$30bo$26bo3bo$30bo$27bobo3$466b2o$33bo432bobo$32b3o431bo$32bob2o$
33b3o$33b2o3$256b2o$256b2o189b2o$30b3o414bobo$29bo2bo414bo$32bo$28bo3b
o$32bo$29bobo3$428b2o$35bo392bobo$34b3o391bo$34bob2o$35b3o$35b2o4$409b
2o$32b3o374bobo$31bo2bo219b2o153bo$34bo219b2o$30bo3bo$34bo$31bobo$274b
obo$275b2o$248b2o4b2o19bo114b2o$37bo210b2o4b2o134bobo$36b3o351bo$36bob
2o$37b3o$37b2o4$371b2o$34b3o334bobo$33bo2bo334bo$36bo$32bo3bo$36bo$33b
obo3$352b2o$39bo312bobo$38b3o311bo$38bob2o$39b3o$39b2o3$254b2o$254b2o
77b2o$36b3o294bobo$35bo2bo294bo$38bo$34bo3bo$38bo$35bobo3$314b2o$41bo
272bobo$40b3o271bo$40bob2o$41b3o$41b2o4$295b2o$38b3o254bobo$37bo2bo
211b2o41bo$40bo211b2o$36bo3bo$40bo$37bobo3$246b2o4b2o$43bo202b2o4b2o$
42b3o$42bob2o$43b3o$43b2o4$257b2o$40b3o214bobo$39bo2bo214bo$42bo$38bo
3bo$42bo$39bobo4$45bo$44b3o$44bob2o$45b3o$45b2o3$252b2o$252b2o$42b3o$
41bo2bo$44bo$40bo3bo$44bo$41bobo4$47bo$46b3o$46bob2o$47b3o$47b2o5$44b
3o$43bo2bo$46bo$42bo3bo$46bo$43bobo203b2o$249b2o3$49bo$48b3o$48bob2o$
49b3o$49b2o2$250bo$249bobo$249bobo$46b3o201bo$45bo2bo$48bo$44bo3bo$48b
o$45bobo4$51bo$50b3o$50bob2o$51b3o$51b2o5$48b3o$47bo2bo$50bo$46bo3bo$
50bo$47bobo4$53bo$52b3o$52bob2o$53b3o$53b2o5$50b3o$49bo2bo$52bo$48bo3b
o$52bo$49bobo!
Edit2: The hive suppressing the LWSS chris_c found earlier still works with the no-fire pattern 2fd closer to the LWSS. Also, with the offset, x2 information is no longer lost to the next piece of trail, since the NE gliders will be caught to provide debris with the same offset. I like this a lot.

Code: Select all

x = 172, y = 248, rule = B3/S23
64b2o$64b2o$52b2o$52b2o3$56b2o$49bo6b2o11b2o$48bobo17bo2bo$48bobo17bob
o$49bo19bo4$50b2o$49bo2bo$50b2o5$2bo$b3o$2obo$3o$b2o2$7b3o$7bo2bo$7bo
57b2o$7bo57b2o$8bobo42b2o$16bo36b2o$15b3o$14b2obo$14b3o40b2o$15b2o40b
2o11b2o$69bo2bo$69bobo$4bo65bo$3b3o$2b2obo$2b3o$3b2o46b2o$50bo2bo$9b3o
39b2o$9bo2bo$9bo$9bo$10bobo$18bo$17b3o$16b2obo$16b3o$17b2o43b2o$62b2o$
50b2o$6bo43b2o$5b3o$4b2obo$4b3o47b2o$5b2o40bo6b2o11b2o$46bobo17bo2bo$
11b3o32bobo17bobo$11bo2bo32bo19bo$11bo$11bo$12bobo$20bo27b2o$19b3o25bo
2bo$18b2obo26b2o$18b3o$19b2o3$8bo$7b3o$6b2obo$6b3o$7b2o2$13b3o$13bo2bo
$13bo49b2o$13bo49b2o$14bobo34b2o$22bo28b2o$21b3o$20b2obo$20b3o32b2o$
21b2o32b2o11b2o$67bo2bo$67bobo$10bo57bo$9b3o$8b2obo$8b3o$9b2o38b2o$48b
o2bo$15b3o31b2o$15bo2bo$15bo153b2o$15bo153bobo$16bobo150bo$24bo$23b3o$
22b2obo$22b3o$23b2o35b2o$60b2o$48b2o100b2o$12bo35b2o100bobo$11b3o136bo
$10b2obo$10b3o39b2o$11b2o32bo6b2o11b2o$44bobo17bo2bo$17b3o24bobo17bobo
$17bo2bo24bo19bo$17bo113b2o$17bo113bobo$18bobo110bo$26bo19b2o$25b3o17b
o2bo$24b2obo18b2o$24b3o$25b2o2$112b2o$14bo97bobo$13b3o96bo$12b2obo$12b
3o$13b2o2$19b3o$19bo2bo$19bo41b2o30b2o$19bo41b2o30bobo$20bobo26b2o42bo
$28bo20b2o$27b3o$26b2obo$26b3o24b2o$27b2o24b2o11b2o$65bo2bo$65bobo6b2o
$16bo49bo7bobo$15b3o56bo$14b2obo$14b3o$15b2o30b2o$46bo2bo$21b3o23b2o$
21bo2bo$21bo$21bo$22bobo40b3o$30bo36bo$29b3o34bo$28b2obo$28b3o$29b2o2$
46b2o$18bo27b2o$17b3o66b3o$16b2obo68bo$16b3o31b2o35bo$17b2o24bo6b2o$
42bobo$23b3o16bobo$23bo2bo16bo$23bo$23bo$24bobo72b3o$32bo11b2o55bo$31b
3o9bo2bo2bobo48bo$30b2obo10b2o3b2o$30b3o17bo$31b2o3$20bo$19b3o98b3o$
18b2obo100bo$18b3o100bo$19b2o2$25b3o11bo$25bo2bo10bo$25bo$25bo$26bobo
108b3o$34bo104bo$33b3o102bo$32b2obo6bo$32b3o6bobo$33b2o5b2o2bo$44bo$
38b2obo2bo$22bo15b4o$21b3o13b3o3bo$20b2obo13b2o2bo$20b3o15bobo2b3o$21b
2o16b6o$42b3o$27b3o$27bo2bo$27bo15bobo$27bo15bobo$28bobo13bo8$24bo$23b
3o$22b2obo$22b3o$23b2o2$29b3o$29bo2bo$29bo$29bo$30bobo8$26bo$25b3o$24b
2obo$24b3o$25b2o2$31b3o$31bo2bo$31bo$31bo$32bobo!
Edit3: Oh drat. The LoM + 2 blocks inserter doesn't work with the MWSS where it is. Excitement back down a bit.

Code: Select all

x = 30, y = 60, rule = B3/S23
2b3o$bo2bo$4bo$o3bo$4bo$bobo20b2o$24b2o3$7bo20b2o$6b3o19b2o$6bob2o$7b
3o$7b2o4$22b2o$4b3o14bo2bo3bo$3bo2bo15b2o2b2o$6bo20b2o$2bo3bo$6bo$3bob
o4$9bo$8b3o$8bob2o$9b3o$9b2o5$6b3o$5bo2bo$8bo$4bo3bo$8bo$5bobo13$8b3o$
7bo2bo$10bo$6bo3bo$10bo$7bobo!
Edit4: Nor does the loaf+block+blinker inserter, nor the lauded champion. We might not get to use this *WSS pair.

Code: Select all

x = 25, y = 62, rule = B3/S23
16b2o$15bo2bo2b3o$16bobo2bo$17bo4bo5$18b3o$23b2o$23b2o10$3o$o2bo$o$o3b
o$o$bobo4$5bo$4b3o$3b2obo$3b3o$4b2o5$2b3o$2bo2bo$2bo$2bo3bo$2bo$3bobo
13$4b3o$4bo2bo$4bo$4bo3bo$4bo$5bobo!

Code: Select all

x = 44, y = 105, rule = B3/S23
41bobo$41b2o$42bo6$23b2o$23b2o13$28b2o$28b2o3$19b2o$18bobo$19bo35$3o$o
2bo$o$o3bo$o$bobo4$5bo$4b3o$3b2obo$3b3o$4b2o5$2b3o$2bo2bo$2bo$2bo3bo$
2bo$3bobo13$4b3o$4bo2bo$4bo$4bo3bo$4bo$5bobo!
Physics: sophistication from simplicity.

chris_c
Posts: 966
Joined: June 28th, 2014, 7:15 am

Re: (27,1)c/72 caterpillar challenge

Post by chris_c » September 22nd, 2016, 7:54 pm

biggiemac wrote:Oh drat. The LoM + 2 blocks inserter doesn't work with the MWSS where it is. Excitement back down a bit.
How annoying. It was looking pretty good. I found a couple of alternatives: the first one downgrades the MWSS to an LWSS and adds an extra LWSS to clean; the second is a different reflection but requires a closely spaced pair of LWSS in order to delete a glider. Unfortunately neither of these works with the LOM + blocks method either. Double drat.

Code: Select all

x = 261, y = 68, rule = B3/S23
44b2o$44bobo$44bo$105b2o$105bobo$105bo2$209b2o$209bobo$25b2o182bo$25bo
bo$25bo$86b2o$86bobo$86bo2$190b2o$190bobo$6b2o182bo$6bobo$6bo251b2o$
67b2o189bobo$8bo58bobo188bo$7b3o57bo$7bob2o$8b3o160b2o$8b2o161bobo$
171bo2$239b2o$239bobo$5b3o231bo$4bo2bo$7bo$7bo138b3o3b2o$4bobo139bo2bo
2bobo$146bo5bo$146bo$147bobo70b2o$220bobo$bo8bo209bo$3o6b3o141b3o$ob2o
5bob2o140bo2bo$b3o6b3o140bo$b2o7b2o141bo3bo$146bo6bo$145b3o6bobo$144b
2obo$144b3o$7b3o135b2o$6bo2bo$9bo$9bo138b3o$6bobo139bo2bo$148bo$148bo$
149bobo2$3bo$2b3o150b3o$2bob2o149bo2bo$3b3o149bo$3b2o150bo3bo$148bo6bo
$147b3o6bobo$146b2obo$146b3o$147b2o!

User avatar
biggiemac
Posts: 515
Joined: September 17th, 2014, 12:21 am
Location: California, USA

Re: (27,1)c/72 caterpillar challenge

Post by biggiemac » September 22nd, 2016, 8:39 pm

In the first example you posted, the first insertion can be done with the R + blinker + G method, assuming the R can be placed without interfering. There might be a way to use frozen tracks (or generic splitters) to get the second signal synchronized without too much frustration. Then the other two are LOM + blocks compatible.

Code: Select all

x = 34, y = 95, rule = B3/S23
9bo$8b3o$7b2obo$7b3o$8b2o3$16bo$14b3o$6b3o6bo$6bo2bo$6bo$6bo$7bobo3$
17bo$17bo6b2o$2bo14bo6bobo$b3o20bo$2obo$3o$b2o5$8b3o$8bo2bo$8bo$8bo$9b
obo5$4bo$3b3o$2b2obo$2b3o$3b2o$28b2o$28b2o3$10b3o19b2o$10bo2bo18b2o$
10bo$10bo$11bobo4$26b2o$6bo18bo2bo2bo$5b3o18b2o2bo$4b2obo22b3o$4b3o$5b
2o5$12b3o$12bo2bo$12bo$12bo$13bobo5$8bo$7b3o$6b2obo$6b3o$7b2o14$10bo$
9b3o$8b2obo$8b3o$9b2o!
I would rather use the second (only 3 *WSS total) but no method I know of is able to insert either of the LWSS with the other present. If one were, it would probably be able to solve the original problem anyway.

Edit: Well, we can get the better of both alternatives with this:

Code: Select all

x = 220, y = 93, rule = B3/S23
195bo$194b3o$67b3o123b2obo$67bo125b3o$68bo125b2o3$202bo$200b3o$192b3o
6bo$192bo2bo$48b3o141bo$48bo143bo$49bo143bobo$109b3o$109bo75b3o$110bo
73bo2bo15bo$187bo15bo6b2o$183bo3bo15bo6bobo$187bo22bo$29b3o152bobo$29b
o$30bo$90b3o$90bo$91bo2$194b3o$194bo2bo$10b3o181bo$10bo183bo$11bo183bo
bo$71b3o$12bo58bo115b3o$11b3o58bo113bo2bo$10b2obo175bo$10b3o172bo3bo$
11b2o176bo$186bobo3$214b2o$9b3o202b2o$9bo2bo$9bo$9bo186b3o19b2o$10bobo
183bo2bo18b2o$196bo$2b3o191bo$bo2bo192bobo$4bo$o3bo9bo174b3o$4bo8b3o
172bo2bo$bobo8b2obo175bo20b2o$12b3o172bo3bo19bo2bo2bo$13b2o176bo20b2o
2bo$188bobo25b3o4$11b3o$11bo2bo$11bo$11bo186b3o$12bobo183bo2bo$198bo$
4b3o191bo$3bo2bo192bobo$6bo$2bo3bo184b3o$6bo183bo2bo$3bobo187bo$189bo
3bo$193bo$190bobo13$193b3o$192bo2bo$195bo$191bo3bo$195bo$192bobo!
Avoid an extra LWSS later down the line with a MWSS doing double cleanup. And once again, this MWSS synthesis is permitted to be dirty.

Edit2: But of course there's an additional downside. Since the heisenburn before was in the MWSS spark, the pattern posted above doesn't allow for heisenburning the lower spare glider. (There is a LWSS heisenburn of a glider with the same shape but wrong color). So that would mean back up to 4 *WSS.

I was playing around earlier and there certainly exist precursors of patterns with the same footprint as an LWSS that can squeeze in between the MWSS in the original problem. Most interfere with the upper MWSS sparks but it can be done without destroying the MWSS. I can't really imagine tailoring a search to find *WSS-spark-assisted-edge-shooters but I know this isn't the first project where that has been desired. (Also brought up there is simultaneous production of both problematic ships. It's too bad apgsearch doesn't catalog closely-spaced standard spaceships since there might be some neat edgy double-shooters out there that someone's computer has run and long forgotten)

Edit3: I'm thinking the better option would be to try to look for similar ways to hit a target with a x1 rake that give a convergent-with-offset x1 trail with a small x2 defect. The blockade one was found with a manual search; higher depth on the HF posted earlier might give something nice.

Edit4: If we have any offset between the two patterns, there can be no help from frozen trails, so I'd really like a pattern where the ships can be simply slow-constructed. We can probably limp our way from something as sparse as a x2 block trail to the LOM if we really need to. I looked into the heisenburns more carefully. We can move a NW rake vertically by 2 cells by changing the climber phase, and with respect to constructions there are 14 different even lanes ((27+1)/2). Moving a rake down 28 cells gives the same intersection with the trail, while moving down 20 cells gives the same intersection with the x2 helix. If we end up needing a number of heisenburns to go through to reach a convergent-with-offset starting pattern, it only cuts the number of usable lanes in half (assuming the x2 helix is such that a heisenburn exists). Tomorrow I will try to categorize the reflectors in terms of synthesizability, heisenburnability, and whether the upper glider can be easily eliminated. Then we will try to see if we can get away with only 3 slow-constructible ships in the stream.
Physics: sophistication from simplicity.

chris_c
Posts: 966
Joined: June 28th, 2014, 7:15 am

Re: (27,1)c/72 caterpillar challenge

Post by chris_c » September 23rd, 2016, 6:11 am

biggiemac wrote: Well, we can get the better of both alternatives with this:
Well the R + G + blinker method can be made to work with the original LWSS + MWSS reflector so we would be done if there was a nice way to build this and to make the reaction vanish in half of the cases:

Code: Select all

x = 31, y = 43, rule = B3/S23
12bo$3o8bobo$o2bo7bo2bo$o11b2o$o3bo$o$bobo7b2o$11b2o$23b3o$23bo$5bo7bo
10bo$4b3o6bo$3b2obo6bo$3b3o$4b2o5$2b3o23b2o$2bo2bo22bobo$2bo25bo$2bo3b
o$2bo$3bobo13$4b3o$4bo2bo$4bo$4bo3bo$4bo$5bobo!
Both of those requirements look like quite big "ifs" though.
biggiemac wrote:Tomorrow I will try to categorize the reflectors in terms of synthesizability, heisenburnability, and whether the upper glider can be easily eliminated. Then we will try to see if we can get away with only 3 slow-constructible ships in the stream.
From what I have seen so far, compatibility with the LoM plus blocks recipe is very desirable. It's simple and the high clearance means that vanishing half of the construction sites is doable.

chris_c
Posts: 966
Joined: June 28th, 2014, 7:15 am

Re: (27,1)c/72 caterpillar challenge

Post by chris_c » September 23rd, 2016, 6:44 pm

I am attaching a file of roughly 500 dirty edge *WSS edge shooters (well, edgy enough for this project anway). I haven't gone through them mechanically but some of the best are capable of inserting into the LWSS + MWSS salvo:

Code: Select all

x = 201, y = 67, rule = B3/S23
28bo$27bo$27b3o$103bo$103bobo$103b2o$190b2o$14b2o173bo2bo$9b3o2bobo
172bo2bo$15b2o173b2o3$16b2o$16b2o$97b2o93b2o$96bobo92bo2bo$96b2o93bo2b
o$192b2o3$187b3o8b3o$3b3o192bo$2bo2bo88b2o103bo$5bo88bobo$5bo89bo$2bob
o$100b3o3$2bo$b3o$2obo$3o175b3o$3o174bo2bo$b2o177bo$84b3o93bo$83bo2bo
90bobo$86bo$86bo$83bobo$177bo$176b3o$175b2obo$83bo91b3o$82b3o90b3o$81b
2obo91b2o$81b3o$4bo76b3o$3b3o76b2o$2b2obo$2b3o$2b3o$3b2o6$179bo$178b3o
$177b2obo$85bo91b3o$84b3o90b3o$83b2obo91b2o$83b3o$83b3o$84b2o!
They are interesting but I haven't had any luck with both cleaning and making an x2 on/off mechanism with them. Hopefully something is possible with some more effort.

EDIT: HWSS might be possible. I haven't investigated clean up:

Code: Select all

x = 28, y = 26, rule = B3/S23
7b3o4$19bo$18bobo$17bo2bo4b2o$18b2o5bobo$25bo2$11b2o$11bobo$12bo7$3o$o
2bo$o$o3bo$o3bo$o$bobo!
Attachments
dirty_xwss.rle.gz
(10.42 KiB) Downloaded 468 times

User avatar
biggiemac
Posts: 515
Joined: September 17th, 2014, 12:21 am
Location: California, USA

Re: (27,1)c/72 caterpillar challenge

Post by biggiemac » September 23rd, 2016, 11:32 pm

A few excellent options in there, thanks for running that search.

Playing around a bit manually, I actually got one to work! It relies on a unit cell consisting of a vertical beehive and the same 3 SL constellation above and below, above having a 2fd offset. The beehive is the correct color with respect to the LWSS so it can be kept from the earlier pattern. The trick is that the 3SL constellation is shifted relative to the actual LWSS seed - the seed itself is two from the constellation "below" and one from the "above". In this way, the no-fire option (including the hive) cleans up all the debris. There is a spark from the MWSS involved as well, so this is pretty much blind luck working wonders.

The trigger glider is the wrong phase, but I was planning to have it activated using a splitter anyway, since we want to use a NW rake output to give us another target for the MWSS construction. My earlier excitement is back in business :)

Code: Select all

x = 133, y = 195, rule = LifeHistory
49.2A$49.2A3$50.2A$49.A2.A$49.A2.A$50.2A7$51.2A$51.2A10$46.2A$46.2A3$
47.2A$46.A2.A$46.A2.A$47.2A3$42.A$41.A.A$41.A.A$42.A5$52.2A$52.2A10$
47.2A$47.2A3$48.2A$47.A2.A$47.A2.A$48.2A2$19D17.19D$D17.D17.D17.D$D
17.D17.D17.D$D17.D17.D17.D$D17.D17.D17.D$D17.D17.D12.2A3.D$D17.D17.D
12.2A3.D$D17.D17.D17.D$D17.D17.D17.D$D17.D17.D17.D$D17.D17.D17.D$D17.
D17.D17.D$D17.D17.D17.D$D17.D17.D17.D$D17.D17.D17.D$D17.D17.D17.D$D2.
2A13.D17.D7.2A8.D$D2.2A13.D17.D7.2A8.D$D17.D17.D17.D$D17.D17.D17.D$D
17.D17.D8.2A7.D75.3A$D17.D17.D7.A2.A6.D75.A$D17.D17.D7.A2.A6.D76.A$D
17.D17.D8.2A7.D$D17.D17.D17.D$D17.D9.D7.D17.D$D3.A13.D10.D6.D3.A13.D$
D2.A.A12.D11.D5.D2.A.A12.D$D2.A.A12.D4.9D4.D2.A.A12.D$D3.A13.D11.D5.D
3.A13.D56.3A$D17.D10.D6.D17.D56.A$D17.D9.D7.D17.D57.A$D17.D17.D17.D$D
17.D17.D17.D$D17.D17.D13.2A2.D$D17.D17.D13.2A2.D$D17.D17.D17.D$D17.D
17.D17.D$D17.D17.D17.D37.3A$D17.D17.D17.D37.A$D17.D17.D17.D38.A$D17.D
17.D17.D$D17.D17.D17.D$D17.D17.D17.D$D17.D17.D17.D$D3.2A12.D17.D8.2A
7.D$D3.2A12.D17.D8.2A7.D$D17.D17.D17.D18.3A$D17.D17.D17.D18.A$D17.D
17.D9.2A6.D19.A$D17.D17.D8.A2.A5.D$D17.D17.D8.A2.A5.D$D17.D17.D9.2A6.
D$D17.D17.D17.D$19D17.19D2$54.3A$54.A$55.A$47.2A$47.2A4$30.3A$30.A2.A
$30.A$30.A$31.A.A4$29.A$28.3A$28.A.2A$29.3A$29.3A$29.2A13$31.A$30.3A$
30.A.2A$31.3A$31.3A$31.2A13$33.A$32.3A$32.A.2A$33.3A$33.3A$33.2A13$
35.A$34.3A$34.A.2A$35.3A$35.3A$35.2A!
Edit: There are a number of working hive placements with the right parity. The spare block included in the "below" constellation makes cleanup easy. This is a wonderfully convenient inserter. I'll look next for an MWSS that can be triggered directly by the rakes, remembering our starting target for the MWSS is just a glider collision alternatingly offset 2fd. It doesn't have to be clean.

Code: Select all

x = 277, y = 195, rule = LifeHistory
49.2A142.2A$49.2A142.2A3$50.2A142.2A$49.A2.A140.A2.A$49.A2.A140.A2.A$
50.2A142.2A7$51.2A142.2A$51.2A142.2A10$46.2A142.2A$46.2A142.2A3$47.2A
137.A4.2A$46.A2.A135.A.A2.A2.A$42.A3.A2.A135.A.A2.A2.A$41.A.A3.2A137.
A4.2A$41.A.A$42.A9$52.2A142.2A$52.2A142.2A10$47.2A142.2A$47.2A142.2A
3$48.2A142.2A$47.A2.A140.A2.A$47.A2.A140.A2.A$48.2A142.2A2$19D17.19D
89.19D17.19D$D17.D17.D17.D89.D17.D17.D17.D$D17.D17.D17.D89.D17.D17.D
17.D$D17.D17.D17.D89.D17.D17.D17.D$D17.D17.D17.D89.D17.D17.D17.D$D17.
D17.D12.2A3.D89.D17.D17.D12.2A3.D$D17.D17.D12.2A3.D89.D17.D17.D12.2A
3.D$D17.D17.D17.D89.D17.D17.D17.D$D17.D17.D17.D89.D17.D17.D17.D$D17.D
17.D17.D89.D17.D17.D17.D$D17.D17.D17.D89.D2.2A13.D17.D17.D$D17.D17.D
17.D89.D2.2A13.D17.D17.D$D2.2A13.D17.D17.D89.D17.D17.D17.D$D2.2A13.D
17.D17.D89.D17.D17.D17.D$D17.D17.D17.D89.D17.D17.D17.D$D17.D17.D17.D
89.D17.D17.D17.D$D17.D17.D7.2A8.D89.D17.D17.D7.2A8.D$D17.D17.D7.2A8.D
89.D17.D17.D7.2A8.D$D17.D17.D17.D89.D17.D17.D17.D$D17.D17.D17.D89.D
17.D17.D17.D$D17.D17.D8.2A7.D75.3A11.D3.A13.D17.D3.A4.2A7.D75.3A$D17.
D17.D7.A2.A6.D75.A13.D2.A.A12.D17.D2.A.A2.A2.A6.D75.A$D3.A13.D17.D3.A
3.A2.A6.D76.A12.D2.A.A12.D17.D2.A.A2.A2.A6.D76.A$D2.A.A12.D17.D2.A.A
3.2A7.D89.D3.A13.D17.D3.A4.2A7.D$D2.A.A12.D17.D2.A.A12.D89.D17.D17.D
17.D$D3.A13.D9.D7.D3.A13.D89.D17.D9.D7.D17.D$D17.D10.D6.D17.D89.D17.D
10.D6.D17.D$D17.D11.D5.D17.D89.D17.D11.D5.D17.D$D17.D4.9D4.D17.D89.D
17.D4.9D4.D17.D$D17.D11.D5.D17.D56.3A30.D17.D11.D5.D17.D56.3A$D17.D
10.D6.D17.D56.A32.D17.D10.D6.D17.D56.A$D17.D9.D7.D17.D57.A31.D17.D9.D
7.D17.D57.A$D17.D17.D17.D89.D17.D17.D17.D$D17.D17.D17.D89.D17.D17.D
17.D$D17.D17.D13.2A2.D89.D17.D17.D13.2A2.D$D17.D17.D13.2A2.D89.D17.D
17.D13.2A2.D$D17.D17.D17.D89.D17.D17.D17.D$D17.D17.D17.D89.D17.D17.D
17.D$D17.D17.D17.D37.3A49.D17.D17.D17.D37.3A$D17.D17.D17.D37.A51.D3.
2A12.D17.D17.D37.A$D17.D17.D17.D38.A50.D3.2A12.D17.D17.D38.A$D3.2A12.
D17.D17.D89.D17.D17.D17.D$D3.2A12.D17.D17.D89.D17.D17.D17.D$D17.D17.D
17.D89.D17.D17.D17.D$D17.D17.D17.D89.D17.D17.D17.D$D17.D17.D8.2A7.D
89.D17.D17.D8.2A7.D$D17.D17.D8.2A7.D89.D17.D17.D8.2A7.D$D17.D17.D17.D
18.3A68.D17.D17.D17.D18.3A$D17.D17.D17.D18.A70.D17.D17.D17.D18.A$D17.
D17.D9.2A6.D19.A69.D17.D17.D9.2A6.D19.A$D17.D17.D8.A2.A5.D89.D17.D17.
D8.A2.A5.D$D17.D17.D8.A2.A5.D89.D17.D17.D8.A2.A5.D$D17.D17.D9.2A6.D
89.D17.D17.D9.2A6.D$D17.D17.D17.D89.D17.D17.D17.D$19D17.19D89.19D17.
19D2$54.3A141.3A$54.A143.A$55.A143.A$47.2A142.2A$47.2A142.2A4$30.3A
141.3A$30.A2.A140.A2.A$30.A143.A$30.A143.A$31.A.A141.A.A4$29.A143.A$
28.3A141.3A$28.A.2A140.A.2A$29.3A141.3A$29.3A141.3A$29.2A142.2A13$31.
A143.A$30.3A141.3A$30.A.2A140.A.2A$31.3A141.3A$31.3A141.3A$31.2A142.
2A13$33.A143.A$32.3A141.3A$32.A.2A140.A.2A$33.3A141.3A$33.3A141.3A$
33.2A142.2A13$35.A143.A$34.3A141.3A$34.A.2A140.A.2A$35.3A141.3A$35.3A
141.3A$35.2A142.2A!
Physics: sophistication from simplicity.

chris_c
Posts: 966
Joined: June 28th, 2014, 7:15 am

Re: (27,1)c/72 caterpillar challenge

Post by chris_c » September 24th, 2016, 7:18 am

biggiemac wrote: Playing around a bit manually, I actually got one to work!
Great! The fact that the block when offset by (3, -25) provides a cleanup for the beehive is a fantastic coincidence.
biggiemac wrote:I'll look next for an MWSS that can be triggered directly by the rakes, remembering our starting target for the MWSS is just a glider collision alternatingly offset 2fd. It doesn't have to be clean.
There is a clean MWSS in the attached file and it has a few options for cleanup in the offset case:

Code: Select all

x = 261, y = 62, rule = B3/S23
41bo71bo69bo$41bobo69bobo67bobo72bo$41b2o70b2o68b2o73bobo$258b2o13$84b
2o$83bo2bo69b2o$12b2o69bobo69bo2bo$12b2o70bo70bobo$156bo3$14b2o70b2o
68b2o$13bo2bo68bo2bo66bo2bo72b2o$13bobo6b2o61bobo6b2o59bobo6b2o64bo2bo
$14bo6bo2bo61bo6bo2bo59bo6bo2bo63bobo6b2o$21bobo69bobo67bobo65bo6bo2bo
$22bo71bo69bo73bobo$239bo$14b2o70b2o68b2o$13bo2bo68bo2bo66bo2bo72b2o$
14b2o70b2o68b2o72bo2bo7bo$231b2o8bo$241bo9$20bo71bo69bo$20bobo69bobo
67bobo72bo$20b2o70b2o68b2o73bobo$237b2o2$11b2o70b2o68b2o$10bo2bo68bo2b
o66bo2bo72b2o$10bobo6b2o61bobo6b2o59bobo6b2o64bo2bo$11bo6bo2bo61bo6bo
2bo59bo6bo2bo63bobo6b2o$18bobo69bobo67bobo65bo6bo2bo$19bo71bo69bo73bob
o$236bo$2b3o6b2o61b3o6b2o59b3o6b2o$bo2bo5bo2bo59bo2bo5bo2bo57bo2bo5bo
2bo63b3o6b2o$4bo6b2o63bo6b2o61bo6b2o63bo2bo5bo2bo$o3bo67bo3bo65bo3bo
74bo6b2o$4bo71bo69bo70bo3bo$bobo69bobo67bobo75bo$218bobo!
EDIT: And here is a recipe for an x2 block from an x1-but-offset constellation (hopefully the color is correct... no time to check...)

Code: Select all

x = 65, y = 93, rule = B3/S23
12bo$11bobo$11bobo$6b2o4bo$5bo2bo$5bo2bo$6b2o19$9bo$8bobo$8bobo$3b2o4b
o$2bo2bo$2bo2bo$3b2o23$10bo$9bobo$9bobo$4b2o4bo$3bo2bo$3bo2bo$4b2o3$
62b2o$62bobo$62bo7$43b2o$43bobo$43bo5$7bo$6bobo$6bobo15b2o$b2o4bo16bob
o$o2bo20bo$o2bo$b2o5$5b2o$5bobo$5bo!

User avatar
biggiemac
Posts: 515
Joined: September 17th, 2014, 12:21 am
Location: California, USA

Re: (27,1)c/72 caterpillar challenge

Post by biggiemac » September 24th, 2016, 1:50 pm

For the MWSS, since it doesn't have to be clean, I am trying to find ways to trigger it directly using a rake, and have the debris be the next target instead of a NW output. Frustratingly, all of the properly-shaped options I have found so far are the wrong color.

Code: Select all

x = 254, y = 117, rule = B3/S23
138b2o$103bo33bobo$26bo37b2o36bobo20b2o10b2o$13bo11bobo23bo11bobo24b2o
10bobo20b2o$12bobo10bobo22bobo10b2o25b2o11bo27b2o$12bobo11bo23bobo43b
2o33bobo$13bo5b2o30bo5b2o37bobo32bo$19bobo35bobo36bo$19bo37bo3$132b2o$
97b2o33b2o$20b2o36b2o37b2o$20b2o36b2o14$114b3o$79b3o31bo2bo$2b3o35b3o
35bo2bo34bo$bo2bo34bo2bo38bo30bo3bo$4bo37bo34bo3bo34bo$o3bo33bo3bo38bo
31bobo$4bo37bo35bobo$bobo35bobo27$247b2o$246bo2bo$239bo6bobo$171bo66bo
bo6bo$171bo66bobo$27b2o142bo67bo4bo$21bo4bo2bo213bobo$21bo5b2o63bo89bo
60bo2bo$21bo70bo88bobo60b2o$92bo88b2o$174bo$173bobo75b2o$92bo79bo2bo
75bobo$91bobo4bo74b2o76bo$23b2o66bo2bo3bo$23bobo66b2o4bo$24b2o$174b2o
52b3o$174bobo50bo2bo$93b2o79bo55bo$93bobo130bo3bo$26b2o65bo136bo$26bob
o198bobo$26bo2$9b3o$8bo2bo$11bo$7bo3bo$11bo$8bobo15$151b3o$150bo2bo$
153bo$149bo3bo$82b3o68bo$81bo2bo65bobo$84bo$80bo3bo$84bo$81bobo!
Is there a slow-salvo friendly way to make this polyplet? It reacts with just a beehive to give a good MWSS. The file had two different collisions with closely spaced still lives, but I'm wondering if some constellation easier to make with salvo might trigger it using the right color and shape.

Code: Select all

x = 26, y = 27, rule = B3/S23
16b2o$15bo2bo$16b2o3$22b2o$21bo2b2o$24b2o$21b4o13$bo$3o$ob2o$b3o$b3o$b
2o!
Physics: sophistication from simplicity.

chris_c
Posts: 966
Joined: June 28th, 2014, 7:15 am

Re: (27,1)c/72 caterpillar challenge

Post by chris_c » September 25th, 2016, 8:44 am

biggiemac wrote: Is there a slow-salvo friendly way to make this polyplet? It reacts with just a beehive to give a good MWSS.
Here's one. The phase is correct modulo 2 but I haven't checked anything more than that.

Code: Select all

x = 915, y = 905, rule = B3/S23
b2o$o2bo$b2o$12b2o$12b2o101$109b3o$109bo$110bo96$211b3o$211bo$212bo99$
310b3o$310bo$311bo95$413b3o$413bo$414bo96$515b3o$515bo$516bo96$617b3o$
617bo$618bo104$711b3o$711bo$712bo101$808b3o$808bo$809bo94$912b3o$912bo
$913bo!
Here's the code I used to find it. You will need to set MAX_GLIDERS_NE to something higher to find more but it seems like quite a lot of effort to avoid one glider rephaser.

Code: Select all

import golly as g
from hashlib import sha256
from itertools import chain

#arbitrary numbers
MAX_GENERATIONS = 400
MAX_POPULATION = 30
MAX_HEIGHT = 24
MAX_GLIDERS_NE = 9
MAX_GLIDERS_SE = 0

GLIDER_NE = g.parse('3o$2bo$bo!')
GLIDER_SE = g.parse('bo$2bo$3o!')

#put any ad-hoc patterns that you want to bombard with slow gliders here.
TARGET_PATTERNS = ['2o$2o!', 'b2o$b2o!']

[
    'b2o$b2o!',
    'b2o$o2bo$b2o$5b2o$5b2o2$13b2o$13b2o!',
    '2bo$bobo4b2o$bobo4b2o$2bo!',
    '2b2o$bo2bo$bobo$2bo!',
    '2b3o7$3o3$7b2o$7b2o!',
    '2bo$bobo$bo2bo$2b2o2$10b2o$5b2o3b2o$bo3b2o$obo$obo$bo10bo$11bobo$11b2o!',
    '10bo$9bobo$9bo2bo$10b2o$bo$bo$bo13b2o$15b2o4$17bo$16bobo$16b2o!',
    '8bo$7bobo$7bo2bo$8b2o2$16b2o$b2o13b2o$b2o3$18bo$17bobo$17b2o!',
    '2b2o$2b2o6$2b2o$bo2bo$bobo$2bo3$3o!',
    '2b2o$2b2o6$bo4b2o$obo3b2o$b2o!',
    '11b2o$11b2o$b2o$o2bo$o2bo$b2o21bo$24bo$24bo3$6b2o$6b2o!',
    '11bo$11bo$b2o8bo$o2bo$b2o$5b2o19b2o$5b2o19b2o5$15b2o$15b2o!',
    '2b2o$bo2bo$2b2o4$35b2o$35b2o6$24b3o2$18bo$17bobo$18b2o!',
    '2o$obo$bo6$8b2o$8b2o!',
    'b2o$o2bo$bobo$2bo10$13b2o$13b2o!',
    'o$o$o7$15b2o$15b2o!',
    'b2o$b2o4$9b3o8$13b2o$13b2o!',
    'b2o$obo$2o$9b3o4$8b2o$8b2o4$12b2o$12b2o!',
    '6b3o8$7b2o$7b2o3$3b2o$2bo2bo$3b2o2$o$o$o!'
    ]

TARGET_PATTERNS = [('blob%d' % i, patt) for i, patt in enumerate(TARGET_PATTERNS)]

wanted = ["2b2o3b2o$bobo2bo2bo$bo5b2o$2o!",
          "2b2o$2b2o3$bo$obo$o2bo$b2o!"]

wanted_color = ["2b3o2$o5bo$o5bo$o5bo2$2b3o8$2b3o!",
                "$3b3o13$2b3o2$o5bo$o5bo$o5bo2$2b3o!"]

wanted = [g.parse(x) for x in wanted]
wanted_color = [g.parse(x) for x in wanted_color]

# test if sub_cells appears in cells_set (optionally with same color)
def find_wanted(cells_set, sub_cells, color=False):

    x0, y0 = sub_cells[0], sub_cells[1]
    for x, y in cells_set:
        dx, dy = x - x0, y - y0
        if color and ((dx ^ dy) & 1):
            continue
        if all((sub_cells[j] + dx, sub_cells[j+1] + dy) in cells_set for j in range(0, len(sub_cells), 2)):
            return True

    return False
   

TARGETS = []
for name, pattern in TARGET_PATTERNS:
  cells = g.parse(pattern)
  p = len(cells) / 2
  TARGETS.append((name, cells, p))

def patterns_identical(cells1, cells2):
  if len(cells1) != len(cells2):
    return False
  if sum(cells1) != sum(cells2):
    return False
  return sorted(zip(cells1[::2], cells1[1::2])) == sorted(zip(cells2[::2], cells2[1::2]))

def is_p2(cells):
  return patterns_identical(cells, g.evolve(cells, 2))

def get_shooting_range(cells):

  min_d1 = max_d1 = cells[0] + cells[1]
  min_d2 = max_d2 = cells[0] - cells[1]

  for i in range(2, len(cells), 2):
    min_d1 = min(min_d1, cells[i] + cells[i+1])
    max_d1 = max(max_d1, cells[i] + cells[i+1])
    min_d2 = min(min_d2, cells[i] - cells[i+1])
    max_d2 = max(max_d2, cells[i] - cells[i+1])
 
  min_lane_ne = min_d1 - 6
  max_lane_ne = max_d1 + 3
  shift_ne = 3 - min_d2 // 2

  min_lane_se = min_d2 - 4
  max_lane_se = max_d2 + 5
  shift_se = 4 - min_d1 // 2

  shift_se += (shift_se - shift_ne) % 2

  return min_lane_ne, max_lane_ne, shift_ne, min_lane_se, max_lane_se, shift_se

def get_pattern_to_try(cells, lane, offset=50):
    y = lane // 2 + offset
    return cells + g.transform(GLIDER_NE, lane - y, y)

def add_glider_se(cells, lane, offset=50):
    y = lane // 2 + offset
    return cells + g.transform(GLIDER_SE, lane - y, -y)

offset = 0

def display_solution(start, lanes, debug, last_cells):

  global offset

  cells = [c for n, c, _ in TARGETS if n == start][0]
  i = 100
  for lane in lanes:
    try:
        lane_ne, lane_se, delay = lane
        if lane_ne is not None:
            cells = get_pattern_to_try(cells, lane_ne, i)
        cells = add_glider_se(cells, lane_se, i + delay)
    except:
        cells = get_pattern_to_try(cells, lane, i)
    i += 100
  g.putcells(cells, 0, offset)
  for i, p in enumerate(debug):
    g.putcells(p, 100 + 100 * i, offset)
  g.putcells(last_cells, 100 + 100 * len(debug), offset)
  g.select(g.getrect())
  g.copy()
  g.select([])
  g.update()
  offset += 800
  g.update()


randoms = []
for i in range(4096):
  randoms.append(int(sha256(str(i)).hexdigest()[:16], 16))

def to_hashable(cells):
  if not cells:
    return 0

  minx = min(cells[::2])
  miny = min(cells[1::2])

  minx -= (minx & miny) & 1
 
  hash = 0
  for i in range(0, len(cells), 2):
    hash ^= randoms[64 * ((cells[i]-minx) & 63) + ((cells[i+1]-miny) & 63)]

  return hash

def try_it(start_cells, lanes, debug):

    global seen

    new_cells = g.evolve(start_cells, MAX_GENERATIONS)

    if len(new_cells) == 2 * 33:

        right = max(new_cells[::2])
        top = min(new_cells[1::2])
        
        l = t = 999
        r = b = -999
        
        for i in range(0, len(new_cells), 2):
            x, y = new_cells[i], new_cells[i+1]
            if x <= right - 3 or y >= top + 3:
                l = min(x, l)
                r = max(x, r)
                t = min(y, t)
                b = max(y, b)

        if r-l == 30 and b-t == 28:
            display_solution(start, lanes, debug, new_cells)
   
    if not new_cells or len(new_cells) > 2 * MAX_POPULATION:
        return None
   
    if max(new_cells[1::2]) - min(new_cells[1::2]) >= MAX_HEIGHT:
        return None
   
    if not is_p2(new_cells):
        return None
   
    new_hashable = to_hashable(new_cells)       
   
    if new_hashable in seen:
        return None
   
    seen.add(new_hashable)
   
    cells_set = set(zip(new_cells[::2], new_cells[1::2]))
   
#    if any(find_wanted(cells_set, w, False) for w in wanted):
#        display_solution(start, lanes, debug, new_cells)
       
#    if any(find_wanted(cells_set, w, True) for w in wanted_color):
#        display_solution(start, lanes, debug, new_cells)

    return new_cells


g.new('')

for i, (_,p) in enumerate(TARGET_PATTERNS):
    g.putcells(g.parse(p), 100*i, -800)

new_queue = []
for name, cells, _ in TARGETS:
  new_queue.append( (name, [], cells, [], MAX_GLIDERS_NE, MAX_GLIDERS_SE) )

seen = set()
loop = 0

while new_queue:

  queue = new_queue
  new_queue = []
 
  loop += 1
  count = 0

  for start, lanes, last, debug, num_ne, num_se in queue:
 
    g.show(str((loop,count,len(queue))))
    count += 1

    tup = get_shooting_range(last)
    min_lane_ne, max_lane_ne, shift_ne = tup[:3]
    min_lane_se, max_lane_se, shift_se = tup[-3:]
   
    if num_se > 0:
           
        se_end = min(min_lane_se + 27, max_lane_se)
       
        for lane_se in range(se_end-27, se_end+1):

            if lane_se % 2:
                continue
           
            start_cells = add_glider_se(last, lane_se, shift_se)
               
            new_lanes = lanes + [(None, lane_se, 0)]
            new_debug = debug + [start_cells]
           
            new_cells = try_it(start_cells, new_lanes, new_debug)
           
            if new_cells is not None and (num_se > 1 or num_ne > 0):
                new_queue.append( (start, new_lanes, new_cells, new_debug, num_ne, num_se-1) )

    if num_ne == 0:
        continue

    ne_end = min(min_lane_ne + 25, max_lane_ne)

    for lane in range(ne_end-25, ne_end+1):

        # monochromatic
        if lane % 2:
            continue
       
        start_cells = get_pattern_to_try(last, lane, shift_ne)

        new_lanes = lanes + [lane]
        new_debug = debug + [start_cells]   

        new_cells = try_it(start_cells, new_lanes, new_debug)

        if new_cells is not None and (num_ne > 1 or num_se > 0):
          new_queue.append( (start, new_lanes, new_cells, new_debug, num_ne-1, num_se) )

        if num_se > 0:
           
            se_end = min(min_lane_se + 27, max_lane_se)
           
            for lane_se in range(se_end-27, se_end+1):

                if lane_se % 2:
                    continue

                for delay in range(-6, 7, 2):

                    start_cells = get_pattern_to_try(last, lane, shift_ne + max(delay, 0))
                    start_cells = add_glider_se(start_cells, lane_se, shift_se - min(delay, 0))

                    new_lanes = lanes + [(lane, lane_se, shift_se - shift_ne - delay)]
                    new_debug = debug + [start_cells]

                    new_cells = try_it(start_cells, new_lanes, new_debug)

                    if new_cells is not None and (num_se > 1 or num_ne > 1):
                        new_queue.append( (start, new_lanes, new_cells, new_debug, num_ne-1, num_se-1) )
Down the line I think we will need a way to transition from an x1-but-offset trail to a plain x1 trail. For this task 4SL is an upper bound:

Code: Select all

x = 149, y = 154, rule = LifeHistory
D16.2A$.D14.A2.A$2.D14.A.A$3.D14.A$4.D$5.D$6.D$7.D7.A$8.D6.A$9.D5.A$
10.D$11.D$12.D$13.D$14.D$15.D$16.D$17.D$18.D$19.D$20.D$21.D6.A$22.D5.
A$23.D4.A$24.D$14.2A4.2A3.D$13.A2.A3.2A4.D$14.A.A10.D$D14.A12.D$.D27.
D$2.D27.D$3.D27.D$4.D7.A19.D$5.D6.A$6.D5.A$7.D$8.D$9.D$10.D$11.D$12.D
$13.D$14.D$15.D$16.D$17.D$18.D6.A$19.D5.A$20.D4.A$21.D$22.D$23.D$24.D
$25.D$15.2A4.2A3.D$14.A2.A3.2A4.D$D14.A.A10.D$.D14.A12.D$2.D27.D$3.D
27.D$4.D27.D$5.D7.A$6.D6.A$7.D5.A$8.D$9.D$10.D$11.D$12.D$13.D$14.D$
15.D$16.D$17.D$18.D$19.D6.A$20.D5.A$21.D4.A$22.D$12.2A4.2A3.D$11.A2.A
3.2A4.D$12.A.A10.D$13.A12.D$27.D$D27.D$.D27.D$2.D7.A19.D$3.D6.A20.D$
4.D5.A21.D$5.D$6.D$7.D$8.D$9.D$10.D$11.D$12.D$13.D$14.D$15.D$16.D6.A$
17.D5.A$18.D4.A$19.D$20.D81.2A$21.D80.A.A$22.D79.A$23.D$19.2A3.D$19.
2A4.D$26.D$27.D$28.D$29.D53.2A$30.D52.A.A$31.D51.A$32.D6$64.2A$64.A.A
$64.A81.2A$146.A.A$146.A5$45.2A$45.A.A$45.A81.2A$127.A.A$127.A7$108.
2A$108.A.A$108.A7$89.2A$89.A.A$89.A!

User avatar
biggiemac
Posts: 515
Joined: September 17th, 2014, 12:21 am
Location: California, USA

Re: (27,1)c/72 caterpillar challenge

Post by biggiemac » October 1st, 2016, 2:23 pm

After a while of trying to break up the search I was able to get this working. Here's a total of 29 rakes (counting the one that produces the x2 NE rake) leading to the LWSS inserter constellation with a couple blocks left to turn into the splitter.

Code: Select all

x = 2672, y = 2620, rule = B3/S23
97b3o$97bo$98bo7$78b3o$78bo$2o77bo$b2o$o5$59b3o$59bo$60bo7$40b3o$40bo$
34b2o5bo$35b2o$34bo41$153b3o$153bo$154bo7$134b3o$134bo$135bo7$115b3o$
115bo$116bo7$96b3o$96bo$97bo43$213b3o$213bo$214bo7$194b3o$194bo$195bo
7$175b3o$175bo$176bo7$156b3o$156bo$157bo39$293b3o$293bo$294bo7$274b3o$
274bo$275bo7$255b3o$255bo$256bo7$236b3o$236bo$237bo71$393b3o$393bo$
394bo7$374b3o$374bo$375bo7$355b3o$355bo$356bo7$336b3o$336bo$337bo73$
491b3o$491bo$492bo7$472b3o$472bo$473bo7$453b3o$453bo$454bo7$434b3o$
434bo$435bo74$588b3o$588bo$589bo7$569b3o$569bo$570bo7$550b3o$550bo$
551bo7$531b3o$531bo$532bo70$689b3o$689bo$690bo7$670b3o$670bo$671bo7$
651b3o$651bo$652bo7$632b3o$632bo$633bo71$789b3o$789bo$790bo7$770b3o$
770bo$771bo7$751b3o$751bo$752bo7$732b3o$732bo$733bo66$894b3o$894bo$
895bo7$875b3o$875bo$876bo7$856b3o$856bo$857bo7$837b3o$837bo$838bo72$
993b3o$993bo$994bo7$974b3o$974bo$975bo7$955b3o$955bo$956bo7$936b3o$
936bo$937bo68$1096b3o$1096bo$1097bo7$1077b3o$1077bo$1078bo7$1058b3o$
1058bo$1059bo7$1039b3o$1039bo$1040bo72$1195b3o$1195bo$1196bo7$1176b3o$
1176bo$1177bo7$1157b3o$1157bo$1158bo7$1138b3o$1138bo$1139bo68$1298b3o$
1298bo$1299bo7$1279b3o$1279bo$1280bo7$1260b3o$1260bo$1261bo7$1241b3o$
1241bo$1242bo70$1399b3o$1399bo$1400bo7$1380b3o$1380bo$1381bo7$1361b3o$
1361bo$1362bo7$1342b3o$1342bo$1343bo70$1498b3o$1498bo$1499bo7$1479b3o$
1479bo$1480bo7$1460b3o$1460bo$1461bo7$1441b3o$1441bo$1442bo76$1593b3o$
1593bo$1594bo7$1574b3o$1574bo$1575bo7$1555b3o$1555bo$1556bo7$1536b3o$
1536bo$1537bo72$1692b3o$1692bo$1693bo7$1673b3o$1673bo$1674bo7$1654b3o$
1654bo$1655bo7$1635b3o$1635bo$1636bo71$1792b3o$1792bo$1793bo7$1773b3o$
1773bo$1774bo7$1754b3o$1754bo$1755bo7$1735b3o$1735bo$1736bo73$1890b3o$
1890bo$1891bo7$1871b3o$1871bo$1872bo7$1852b3o$1852bo$1853bo7$1833b3o$
1833bo$1834bo65$1996b3o$1996bo$1997bo7$1977b3o$1977bo$1978bo7$1958b3o$
1958bo$1959bo7$1939b3o$1939bo$1940bo72$2095b3o$2095bo$2096bo7$2076b3o$
2076bo$2077bo7$2057b3o$2057bo$2058bo7$2038b3o$2038bo$2039bo69$2197b3o$
2197bo$2198bo7$2178b3o$2178bo$2179bo7$2159b3o$2159bo$2160bo7$2140b3o$
2140bo$2141bo69$2299b3o$2299bo$2300bo7$2280b3o$2280bo$2281bo7$2261b3o$
2261bo$2262bo7$2242b3o$2242bo$2243bo71$2399b3o$2399bo$2400bo7$2380b3o$
2380bo$2381bo7$2361b3o$2361bo$2362bo7$2342b3o$2342bo$2343bo64$2506b3o$
2506bo$2507bo7$2487b3o$2487bo$2488bo7$2468b3o$2468bo$2469bo7$2449b3o$
2449bo$2450bo66$2591b3o$2591bo$2592bo7$2572b3o$2572bo$2573bo7$2553b3o$
2553bo$2554bo7$2534b3o$2534bo$2535bo69$2669b3o$2669bo$2670bo7$2650b3o$
2650bo$2651bo7$2631b3o$2631bo$2632bo7$2612b3o$2612bo$2613bo!
Edit: I bet it's a half dozen or more from optimal, but I don't know particularly how to trim it down. Here was my approach:
Beginning from the hive and the block above it, I searched for salvos to depth 14 (but aborted at the end of depth 13 when RAM ran out) that produced the block pair above the pond in a location compatible with the hive. I actually was looking for any pair of target SLs, but the block pair was the one that showed up. I scanned through the final constellations for any which had all their debris on the correct side. The most promising one ended in a lower block pull, which still works if the pond is there, so to give more room I gave the second search the pre-block-pull constellation. At depth 11 some pond placers turned up, and this one was compatible with the block pull after deleting one leftover block.

Both scripts were shamelessly modified from chris_c's for this specific application. First script:

Code: Select all

import golly as g
from hashlib import sha256
from itertools import chain

#arbitrary numbers
MAX_GENERATIONS = 250
MAX_POPULATION = 50
MAX_HEIGHT = 27
MAX_LANES = 26
MAX_GLIDERS = 14

#NE glider
GLIDER = g.parse('3o$2bo$bo!')
# We'll begin with a hive and a block.  We need to reach a 3-SL constellation
# from the block without ever killing the hive.  The 3-SL constellation must
# be in one of a select few locations.  I will give one in "SAFE_*", and the
# others can be reached by translating by any of the amounts given in "OFFSETS"
START_HIVE = [(27,29),(28,28),(26,28),(28,27),(26,27),(27,26)]
START_BLOCK = [(27,16),(28,16),(27,17),(28,17)]
OFFSETS = [(0,0),(0,4),(0,6),(1,1),(2,0)]
SAFE_BLOCKh = [(17,5),(18,5),(17,6),(18,6)]
SAFE_BLOCKl = [(22,17),(22,16),(23,17),(23,16)]
SAFE_POND = [(20,21),(20,22),(21,20),(21,23),(22,20),(22,23)]
PAIRS = [SAFE_BLOCKh+SAFE_BLOCKl, SAFE_BLOCKh+SAFE_POND, SAFE_BLOCKl+SAFE_POND]
PAIRS_OFFSET = [[(x0 + dx, y0 + dy) for x0, y0 in pair] for pair in PAIRS for dx, dy in OFFSETS]

KEEPERS = []

#put any ad-hoc patterns that you want to bombard with slow gliders here.
#TARGET_PATTERNS = ['8$9bo$9bo7b2o$9bo7b2o2$20bo6b2o$19bobo7bo$18bo2bo4bo$19b2o6b2o4$16bo$16bo$16bo4$7b3o$27bo$26bobo$26bobo$27bo!',
#'11$17b2o$17b2o6$23b2o3bo$23b2o2bobo$27bobo$28bo2$16bo5bo$15bobo3bobo$15bobo3bobo$16bo5bo4bo$26bobo$18b3o5bobo$27bo!',
#'11$17b2o$17b2o10$24bo$23bobo$23bobo$24bo$27bo$26bobo$26bobo$27bo!','9$17b2o$17b2o11$10b2o$10b2o4$27bo$26bobo$26bobo$27bo!',
#'11$17b2o$17b2o9$21b3o5$27bo$26bobo$20b2o4bobo$20b2o5bo!']

#TARGET_PATTERNS = [('blob%d' % i, patt) for i, patt in enumerate(TARGET_PATTERNS)]

#wanted = ['2o$2o10$5b2o$5b2o3$4b2o$3bo2bo$3bo2bo$4b2o3$10bo$9bobo$9bobo$10bo!',
#'2o$2o10$5b2o$5b2o3$4b2o$3bo2bo$3bo2bo3bo$4b2o3bobo$9bobo$10bo!'
#'2o$2o10$5b2o$5b2o3$4b2o4bo$3bo2bo2bobo$3bo2bo2bobo$4b2o4bo!']

#wanted_color = ['']

#wanted = [g.parse(x) for x in wanted]
#wanted_color = [g.parse(x) for x in wanted_color]

# test if SAFE_* appears in cells_set
def find_wanted(cells_set):
  # Try to get 2 at once
  return any(all(j in cells_set for j in pair) for pair in PAIRS_OFFSET)
  

def to_pairs(cell_list):
  return zip(cell_list[::2], cell_list[1::2])

def from_pairs(cell_set):
  return list(sum(cell_set, ()))

# Return an empty cell list if the argument isn't p2 / p2 plus deletable gliders
# or if the height or population exceeds the specified values.  Nonempty cell
# lists continue on to the search tree.
KEEP_GLIDERS = False
def kosherify(cell_list):
  if KEEP_GLIDERS:
    cellset = set(to_pairs(cell_list))
    cellset8 = set(to_pairs(g.evolve(cell_list, 8)))
    # Not going to be correct in every case but pretty effective
    maybe_gliders = [a for a in cellset8 if a not in cellset]
    if len(maybe_gliders) % 5: # Not a multiple of 5
      return []
    # Do more processing to verify the excluded are gliders, if you want.
    rest = [b for b in cellset8 if b not in maybe_gliders]
  else:
    rest = set(to_pairs(cell_list))

  if not all(j in rest for j in START_HIVE):
    return[]
#  if not any(all(j in rest for j in KEEPERS + k) for k in OFFSETS):
#    return []
  if len(rest) < 6 or len(rest) > MAX_POPULATION:
    return []
  rest = from_pairs(rest)
  if max(rest[1::2]) - min(rest[1::2]) >= MAX_HEIGHT or not is_p2(rest):
    return []
  return rest


    

TARGETS = [('hive+block', from_pairs(START_HIVE + START_BLOCK))]

def patterns_identical(cells1, cells2):
  if len(cells1) != len(cells2):
    return False
  if sum(cells1) != sum(cells2):
    return False
  return sorted(to_pairs(cells1)) == sorted(to_pairs(cells2))

def is_p2(cells):
  return patterns_identical(cells, g.evolve(cells, 2))

def get_shooting_range(cells):

  min_d1 = max_d1 = cells[0] + cells[1]
  min_d2 = cells[0] - cells[1]

  for i in range(2, len(cells), 2):
    min_d1 = min(min_d1, cells[i] + cells[i+1])
    max_d1 = max(max_d1, cells[i] + cells[i+1])
    min_d2 = min(min_d2, cells[i] - cells[i+1])
  
  min_lane = min_d1 - 6
  max_lane = max_d1 + 3
  shift = 6 - min_d2 // 2

  return min_lane, max_lane, shift

def get_pattern_to_try(cells, lane, offset=50):
    y = lane // 2 + offset
    return cells + g.transform(GLIDER, lane - y, y)

offset = 0

def display_solution(start, lanes, debug, last_cells):

  global offset

  cells = [c for n, c in TARGETS if n == start][0]
  i = 100
  for lane in lanes:
    cells = get_pattern_to_try(cells, lane, i)
    i += 100
  g.putcells(cells, 0, offset)
  for i, p in enumerate(debug):
    g.putcells(p, 100 + 100 * i, offset)
  g.putcells(last_cells, 100 + 100 * len(debug), offset)
  g.select(g.getrect())
  g.copy()
  g.select([])
#  g.fit()
  g.update()
  g.show(' '.join(chain([str(start), str(len(lanes))], [str(lane) for lane in lanes])))
  offset += 400
  g.update()


randoms = []
for i in range(4096):
  randoms.append(int(sha256(str(i)).hexdigest()[:16], 16))

def to_hashable(cells):
  if not cells:
    return 0

  minx = min(cells[::2])
  miny = min(cells[1::2])
  
  hash = 0
  for i in range(0, len(cells), 2):
    hash ^= randoms[64 * (cells[i] & 63) + (cells[i+1] & 63)]

  return hash

g.new('')

new_queue = []
for name, cells in TARGETS:
  new_queue.append( (name, [], cells, []) )

seen = set()

for n in range(MAX_GLIDERS):

  queue = new_queue
  new_queue = []
  
  count = 0

  for start, lanes, last, debug in queue:
  
    g.show(str((n+1,count,len(queue))))
    count += 1

    min_lane, max_lane, shift = get_shooting_range(last)

    for lane in range(min_lane, min(min_lane + MAX_LANES, max_lane + 1)):

        # monochromatic
        if not lane % 2:
            continue
        
        start_cells = get_pattern_to_try(last, lane, shift)
        new_cells = kosherify(g.evolve(start_cells, MAX_GENERATIONS))

        if not new_cells:
          continue

        new_hashable = to_hashable(new_cells)        

        if new_hashable in seen:
          continue

        seen.add(new_hashable)
        
        new_lanes = lanes + [lane]
        new_debug = debug + [start_cells]

        cells_set = set(to_pairs(new_cells))

        if find_wanted(cells_set):
            display_solution(start, new_lanes, new_debug, new_cells)

        if n + 1 < MAX_GLIDERS:
          new_queue.append( (start, new_lanes, new_cells, new_debug) )
Second:

Code: Select all

import golly as g
from hashlib import sha256
from itertools import chain

#arbitrary numbers
MAX_GENERATIONS = 250
MAX_POPULATION = 50
MAX_HEIGHT = 27
MAX_LANES = 26
MAX_GLIDERS = 11

#NE glider
GLIDER = g.parse('3o$2bo$bo!')

START_KEEPERS = [(27,29),(28,28),(26,28),(28,27),(26,27),(27,26),(24,21),(25,21),(24,22),(25,22),(17,11),(18,11),(17,12),(18,12)]
START_TARGET = [(-2,24),(-1,23),(-1,25),(0,23),(0,25),(1,24),(3,26),(4,26),(3,27),(4,27),(4,21),(4,22),(5,21),(5,22)]
GOAL_POND = [(20,27),(20,28),(21,26),(21,29),(22,26),(22,29)]

#put any ad-hoc patterns that you want to bombard with slow gliders here.
#TARGET_PATTERNS = ['8$9bo$9bo7b2o$9bo7b2o2$20bo6b2o$19bobo7bo$18bo2bo4bo$19b2o6b2o4$16bo$16bo$16bo4$7b3o$27bo$26bobo$26bobo$27bo!',
#'11$17b2o$17b2o6$23b2o3bo$23b2o2bobo$27bobo$28bo2$16bo5bo$15bobo3bobo$15bobo3bobo$16bo5bo4bo$26bobo$18b3o5bobo$27bo!',
#'11$17b2o$17b2o10$24bo$23bobo$23bobo$24bo$27bo$26bobo$26bobo$27bo!','9$17b2o$17b2o11$10b2o$10b2o4$27bo$26bobo$26bobo$27bo!',
#'11$17b2o$17b2o9$21b3o5$27bo$26bobo$20b2o4bobo$20b2o5bo!']

#TARGET_PATTERNS = [('blob%d' % i, patt) for i, patt in enumerate(TARGET_PATTERNS)]

#wanted = ['2o$2o10$5b2o$5b2o3$4b2o$3bo2bo$3bo2bo$4b2o3$10bo$9bobo$9bobo$10bo!',
#'2o$2o10$5b2o$5b2o3$4b2o$3bo2bo$3bo2bo3bo$4b2o3bobo$9bobo$10bo!'
#'2o$2o10$5b2o$5b2o3$4b2o4bo$3bo2bo2bobo$3bo2bo2bobo$4b2o4bo!']

#wanted_color = ['']

#wanted = [g.parse(x) for x in wanted]
#wanted_color = [g.parse(x) for x in wanted_color]

def find_wanted(cells_set):
  return all(j in cells_set for j in GOAL_POND)
  

def to_pairs(cell_list):
  return zip(cell_list[::2], cell_list[1::2])

def from_pairs(cell_set):
  return list(sum(cell_set, ()))

# Return an empty cell list if the argument isn't p2 / p2 plus deletable gliders
# or if the height or population exceeds the specified values.  Nonempty cell
# lists continue on to the search tree.
KEEP_GLIDERS = False
def kosherify(cell_list):
  if KEEP_GLIDERS:
    cellset = set(to_pairs(cell_list))
    cellset8 = set(to_pairs(g.evolve(cell_list, 8)))
    # Not going to be correct in every case but pretty effective
    maybe_gliders = [a for a in cellset8 if a not in cellset]
    if len(maybe_gliders) % 5: # Not a multiple of 5
      return []
    # Do more processing to verify the excluded are gliders, if you want.
    rest = [b for b in cellset8 if b not in maybe_gliders]
  else:
    rest = set(to_pairs(cell_list))

  if not all(j in rest for j in START_KEEPERS):
    return[]
#  if not any(all(j in rest for j in KEEPERS + k) for k in OFFSETS):
#    return []
  if len(rest) < 6 or len(rest) > MAX_POPULATION:
    return []
  rest = from_pairs(rest)
  if max(rest[1::2]) - min(rest[1::2]) >= MAX_HEIGHT or not is_p2(rest):
    return []
  return rest


    

TARGETS = [('thingy', from_pairs(START_KEEPERS + START_TARGET))]

def patterns_identical(cells1, cells2):
  if len(cells1) != len(cells2):
    return False
  if sum(cells1) != sum(cells2):
    return False
  return sorted(to_pairs(cells1)) == sorted(to_pairs(cells2))

def is_p2(cells):
  return patterns_identical(cells, g.evolve(cells, 2))

def get_shooting_range(cells):

  min_d1 = max_d1 = cells[0] + cells[1]
  min_d2 = cells[0] - cells[1]

  for i in range(2, len(cells), 2):
    min_d1 = min(min_d1, cells[i] + cells[i+1])
    max_d1 = max(max_d1, cells[i] + cells[i+1])
    min_d2 = min(min_d2, cells[i] - cells[i+1])
  
  min_lane = min_d1 - 6
  max_lane = max_d1 + 3
  shift = 6 - min_d2 // 2

  return min_lane, max_lane, shift

def get_pattern_to_try(cells, lane, offset=50):
    y = lane // 2 + offset
    return cells + g.transform(GLIDER, lane - y, y)

offset = 0

def display_solution(start, lanes, debug, last_cells):

  global offset

  cells = [c for n, c in TARGETS if n == start][0]
  i = 100
  for lane in lanes:
    cells = get_pattern_to_try(cells, lane, i)
    i += 100
  g.putcells(cells, 0, offset)
  for i, p in enumerate(debug):
    g.putcells(p, 100 + 100 * i, offset)
  g.putcells(last_cells, 100 + 100 * len(debug), offset)
  g.select(g.getrect())
  g.copy()
  g.select([])
#  g.fit()
  g.update()
  g.show(' '.join(chain([str(start), str(len(lanes))], [str(lane) for lane in lanes])))
  offset += 400
  g.update()


randoms = []
for i in range(4096):
  randoms.append(int(sha256(str(i)).hexdigest()[:16], 16))

def to_hashable(cells):
  if not cells:
    return 0

  minx = min(cells[::2])
  miny = min(cells[1::2])
  
  hash = 0
  for i in range(0, len(cells), 2):
    hash ^= randoms[64 * (cells[i] & 63) + (cells[i+1] & 63)]

  return hash

g.new('')

new_queue = []
for name, cells in TARGETS:
  new_queue.append( (name, [], cells, []) )

seen = set()

for n in range(MAX_GLIDERS):

  queue = new_queue
  new_queue = []
  
  count = 0

  for start, lanes, last, debug in queue:
  
    g.show(str((n+1,count,len(queue))))
    count += 1

    min_lane, max_lane, shift = get_shooting_range(last)

    for lane in range(min_lane, min(min_lane + MAX_LANES, max_lane + 1)):

        # monochromatic
        if not lane % 2:
            continue
        
        start_cells = get_pattern_to_try(last, lane, shift)
        new_cells = kosherify(g.evolve(start_cells, MAX_GENERATIONS))

        if not new_cells:
          continue

        new_hashable = to_hashable(new_cells)        

        if new_hashable in seen:
          continue

        seen.add(new_hashable)
        
        new_lanes = lanes + [lane]
        new_debug = debug + [start_cells]

        cells_set = set(to_pairs(new_cells))

        if find_wanted(cells_set):
            display_solution(start, new_lanes, new_debug, new_cells)

        if n + 1 < MAX_GLIDERS:
          new_queue.append( (start, new_lanes, new_cells, new_debug) )
Output of the first (at depth 13) is attached if anyone else wants to fiddle around.
Attachments
salvo to sl pair.rle
(73.01 KiB) Downloaded 451 times
Physics: sophistication from simplicity.

User avatar
biggiemac
Posts: 515
Joined: September 17th, 2014, 12:21 am
Location: California, USA

Re: (27,1)c/72 caterpillar challenge

Post by biggiemac » October 2nd, 2016, 1:07 am

Can be done one rake better with a more straightforward approach. If only I could run a search with the depth to place both blocks simultaneously after the pond, I imagine that would save 4 or 5 rakes in the end.

Code: Select all

x = 2562, y = 2506, rule = B3/S23
97b3o$97bo$98bo7$78b3o$78bo$2o77bo$b2o$o5$59b3o$59bo$60bo7$40b3o$40bo$
34b2o5bo$35b2o$34bo41$153b3o$153bo$154bo7$134b3o$134bo$135bo7$115b3o$
115bo$116bo7$96b3o$96bo$97bo43$213b3o$213bo$214bo7$194b3o$194bo$195bo
7$175b3o$175bo$176bo7$156b3o$156bo$157bo39$293b3o$293bo$294bo7$274b3o$
274bo$275bo7$255b3o$255bo$256bo7$236b3o$236bo$237bo71$393b3o$393bo$
394bo7$374b3o$374bo$375bo7$355b3o$355bo$356bo7$336b3o$336bo$337bo67$
497b3o$497bo$498bo7$478b3o$478bo$479bo7$459b3o$459bo$460bo7$440b3o$
440bo$441bo74$594b3o$594bo$595bo7$575b3o$575bo$576bo7$556b3o$556bo$
557bo7$537b3o$537bo$538bo67$698b3o$698bo$699bo7$679b3o$679bo$680bo7$
660b3o$660bo$661bo7$641b3o$641bo$642bo80$789b3o$789bo$790bo7$770b3o$
770bo$771bo7$751b3o$751bo$752bo7$732b3o$732bo$733bo66$894b3o$894bo$
895bo7$875b3o$875bo$876bo7$856b3o$856bo$857bo7$837b3o$837bo$838bo70$
995b3o$995bo$996bo7$976b3o$976bo$977bo7$957b3o$957bo$958bo7$938b3o$
938bo$939bo77$1089b3o$1089bo$1090bo7$1070b3o$1070bo$1071bo7$1051b3o$
1051bo$1052bo7$1032b3o$1032bo$1033bo46$1178b3o$1178bo$1179bo7$1159b3o$
1159bo$1160bo7$1140b3o$1140bo$1141bo7$1121b3o$1121bo$1122bo69$1280b3o$
1280bo$1281bo7$1261b3o$1261bo$1262bo7$1242b3o$1242bo$1243bo7$1223b3o$
1223bo$1224bo63$1388b3o$1388bo$1389bo7$1369b3o$1369bo$1370bo7$1350b3o$
1350bo$1351bo7$1331b3o$1331bo$1332bo71$1488b3o$1488bo$1489bo7$1469b3o$
1469bo$1470bo7$1450b3o$1450bo$1451bo7$1431b3o$1431bo$1432bo70$1589b3o$
1589bo$1590bo7$1570b3o$1570bo$1571bo7$1551b3o$1551bo$1552bo7$1532b3o$
1532bo$1533bo79$1681b3o$1681bo$1682bo7$1662b3o$1662bo$1663bo7$1643b3o$
1643bo$1644bo7$1624b3o$1624bo$1625bo67$1785b3o$1785bo$1786bo7$1766b3o$
1766bo$1767bo7$1747b3o$1747bo$1748bo7$1728b3o$1728bo$1729bo77$1879b3o$
1879bo$1880bo7$1860b3o$1860bo$1861bo7$1841b3o$1841bo$1842bo7$1822b3o$
1822bo$1823bo53$1963b3o$1963bo$1964bo7$1944b3o$1944bo$1945bo7$1925b3o$
1925bo$1926bo7$1906b3o$1906bo$1907bo69$2065b3o$2065bo$2066bo7$2046b3o$
2046bo$2047bo7$2027b3o$2027bo$2028bo7$2008b3o$2008bo$2009bo79$2157b3o$
2157bo$2158bo7$2138b3o$2138bo$2139bo7$2119b3o$2119bo$2120bo7$2100b3o$
2100bo$2101bo65$2263b3o$2263bo$2264bo7$2244b3o$2244bo$2245bo7$2225b3o$
2225bo$2226bo7$2206b3o$2206bo$2207bo67$2367b3o$2367bo$2368bo7$2348b3o$
2348bo$2349bo7$2329b3o$2329bo$2330bo7$2310b3o$2310bo$2311bo73$2465b3o$
2465bo$2466bo7$2446b3o$2446bo$2447bo7$2427b3o$2427bo$2428bo7$2408b3o$
2408bo$2409bo77$2559b3o$2559bo$2560bo7$2540b3o$2540bo$2541bo7$2521b3o$
2521bo$2522bo7$2502b3o$2502bo$2503bo!
Physics: sophistication from simplicity.

User avatar
biggiemac
Posts: 515
Joined: September 17th, 2014, 12:21 am
Location: California, USA

Re: (27,1)c/72 caterpillar challenge

Post by biggiemac » October 3rd, 2016, 7:19 pm

I've made a more nontrivial modification to chris_c's script. It now uses numpy arrays and stores the salvo information in an ultracompact way, allowing it to reach a much higher depth before filling RAM. There is a speed tradeoff: it is a bit slower, though I've tried to mitigate that as much as I can. I'm perfectly content to just let this run in the background for a few days so long as I don't see 16GB RAM usage as was typical with the prior version.

Code: Select all

import golly as g
import numpy as np
from hashlib import sha256
from itertools import chain

#arbitrary numbers
MAX_GENERATIONS = 192
MAX_POPULATION = 50
MAX_HEIGHT = 27
MAX_LANES = 28

# MAX_GLIDERS has been set to hardcoded 17.  Execution can be interrupted at any time.

#NE glider
GLIDER = g.parse('3o$2bo$bo!')
# The piece that can't be harmed. 
START_KEEPERS = [(27,29),(28,28),(26,28),(28,27),(26,27),(27,26)]

# The piece that is to be manipulated
# Limitation: with this approach it is easiest to only allow a single initial target
START_TARGET = [(22,20),(21,21),(23,21),(21,22),(23,22),(22,23),
                (22,11),(21,12),(23,12),(21,13),(23,13),(22,14),
                (16,17),(17,18),(17,16),(18,18),(18,16),(19,17),
                (25,17),(26,18),(26,16),(27,18),(27,16),(28,17)]

# Any potential desired result
CONSTELLATION = [(20,21),(21,20),(20,22),(22,20),(21,23),(23,21),(22,23),(23,22),
                 (22,17),(22,16),(23,17),(23,16),(17,5),(17,6),(18,5),(18,6)]
OFFSETS = [(0,0),(1,1),(2,0),(0,4),(0,6)]
GOALS = [[(x0 + dx, y0 + dy) for x0, y0 in CONSTELLATION] for dx, dy in OFFSETS]

def to_pairs(cell_list):
  return zip(cell_list[::2], cell_list[1::2])

def from_pairs(cell_set):
  return list(sum(cell_set, ()))

TARGET = from_pairs(START_KEEPERS + START_TARGET)
btlist = [TARGET,[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]

def find_wanted(cells_set):
  return any(all(j in cells_set for j in k) for k in GOALS)

# Return an empty cell list if the argument is invalid as a target, either not p2
# or if the height or population exceeds the specified values.  Nonempty cell
# lists continue on to the search tree.
def kosherify(cell_list):
  rest = set(to_pairs(cell_list))
  if not all(j in rest for j in START_KEEPERS):
    return[]
  if len(rest) < 3 + len(START_KEEPERS) or len(rest) > MAX_POPULATION:
    return []
  rest = from_pairs(rest)
  if max(rest[1::2]) - min(rest[1::2]) >= MAX_HEIGHT or not is_p2(rest):
    return []
  return rest

def patterns_identical(cells1, cells2):
  if len(cells1) != len(cells2):
    return False
  if sum(cells1) != sum(cells2):
    return False
  return sorted(to_pairs(cells1)) == sorted(to_pairs(cells2))

def is_p2(cells):
  return patterns_identical(cells, g.evolve(cells, 2))

def get_shooting_range(cells):

  min_d1 = max_d1 = cells[0] + cells[1]
  min_d2 = cells[0] - cells[1]

  for i in range(2, len(cells), 2):
    min_d1 = min(min_d1, cells[i] + cells[i+1])
    max_d1 = max(max_d1, cells[i] + cells[i+1])
    min_d2 = min(min_d2, cells[i] - cells[i+1])
  
  min_lane = (min_d1 - 6) | 1 # monochromatic
  max_lane = max_d1 + 3
  shift = 6 - min_d2 // 2

  return min_lane, max_lane, shift

def get_pattern_to_try(cells, lane, offset=50):
    y = lane // 2 + offset
    return cells + g.transform(GLIDER, lane - y, y)

# Return the index of the first nibble (4 bits) in which two numbers differ.
def difnibble(currid,previd):
  if (previd == 0):
    return 0
  a = np.int64(currid)
  b = np.int64(previd)
  xorab = np.bitwise_xor(a,b)
  lsbmask = np.bitwise_and(xorab, -xorab)
  ret = 0
  while ((lsbmask & 15) == 0):
    ret += 1
    lsbmask >>= 4
  return ret

# Assumes all checks for well-behavedness already happened.  Blindly runs the salvo
# up to the current point to get the start constellation for the next iteration.
# The backtrace list btlist holds all intermediate constellations, and since there is
# significant expected overlap between consecutive ids in the array, it saves a bunch
# of computation to just check where the branch point is between them and start there
def salvoID_to_cells(currid, previd):
  global btlist
  starter = difnibble(currid, previd)
  startcells = btlist[starter]
  currid >>= (4*starter)
  while (currid > 0):
    lane, _, shift = get_shooting_range(startcells)
    lane += 2*((currid & 15) - 1)
    startcells = g.evolve(get_pattern_to_try(startcells, lane, shift), MAX_GENERATIONS)
    currid >>= 4
    starter += 1
    btlist[starter] = startcells # Update btlist for the next in line
  return startcells


# For viewing in golly
offset = 0
def display_solution(salvoID, laneID, n):
  # When this method is called, btlist holds all the intermediate constellations.
  global btlist
  global offset

  lanes = [get_shooting_range(btlist[i])[0] + 2*((salvoID >> 4*i) & 15 - 1) for i in range(n)]
  lanes.append(get_shooting_range(btlist[n])[0] + 2*(laneID - 1))
  cells = TARGET

  i = 100
  for lane in lanes:
    cells = get_pattern_to_try(cells, lane, i)
    i += 100
  g.putcells(cells, 0, offset)
  for i in range(n + 1):
    cells = get_pattern_to_try(btlist[i], lanes[i])
    g.putcells(cells, 100 + 100 * i, offset)
  g.putcells(g.evolve(cells, MAX_GENERATIONS), 200 + 100*n, offset)
  g.select(g.getrect())
  g.copy()
  g.select([])
#  g.fit()
  g.update()
  offset += 400


randoms = []
for i in range(4096):
  randoms.append(int(sha256(str(i)).hexdigest()[:16], 16))

def to_hashable(cells):
  if not cells:
    return 0

  minx = min(cells[::2])
  miny = min(cells[1::2])
  
  hash = 0
  for i in range(0, len(cells), 2):
    hash ^= randoms[64 * (cells[i] & 63) + (cells[i+1] & 63)]

  return hash

g.new('')
seen = set()
newids = np.zeros(1, dtype=np.int64)
count = 1

for n in range(17):

  ids = np.resize(newids, count)
  newids = np.zeros(4*count, dtype=np.int64)  
  count = 0
  previd = 0

  for idx, currid in enumerate(ids):

    g.show(str(idx)+" of "+str(len(ids))+" at depth "+str(n))

    last = salvoID_to_cells(currid, previd)
    min_lane, max_lane, shift = get_shooting_range(last)
    laneid = 0

    for lane in range(min_lane, min(min_lane + MAX_LANES, max_lane + 1), 2):

        laneid += 1

        start_cells = get_pattern_to_try(last, lane, shift)
        new_cells = kosherify(g.evolve(start_cells, MAX_GENERATIONS))

        if not new_cells:
          continue

        new_hashable = to_hashable(new_cells)        

        if new_hashable in seen:
          continue

        # If we're here, the resulting pattern is both valid and new.  It
        # goes into the next iteration.
        seen.add(new_hashable)

        cells_set = set(to_pairs(new_cells))

        if find_wanted(cells_set):
          display_solution(currid, laneid, n)

        if n < 16:
          newids[count] = np.bitwise_or(currid, np.int64(laneid) << (4 * n))
          count += 1
          if (count >= len(newids)):
            newids.resize(2*count) # Expensive, won't happen often if at all

    # Once all lanes have been checked:
    previd = currid
It is searching for something that simultaneously places all 3 still lives in one of the 5 acceptable locations without destroying the hive, and running to a depth of 17 gliders past the block pull and HF. While it will only save a few rakes from the patterns posted above, the bigger reason I did this is to get more intuition regarding just how expensive things are in this project.
Physics: sophistication from simplicity.

chris_c
Posts: 966
Joined: June 28th, 2014, 7:15 am

Re: (27,1)c/72 caterpillar challenge

Post by chris_c » October 4th, 2016, 11:35 am

biggiemac wrote:I've made a more nontrivial modification to chris_c's script. It now uses numpy arrays and stores the salvo information in an ultracompact way, allowing it to reach a much higher depth before filling RAM.
Cool. You have made nice progress so far. Good luck with the deeper searches.

At some point I will write a script that takes a list of lane numbers and produces a pattern with all the rakes set up correctly. It would be a real pain to do that with manual editing!

EDIT: Here is a simple script for the above. Not much testing but it seems to work ok. Edit the lanes list to change the output. Only the lane number modulo 28 counts. Adding any odd numbered lanes will result in an infinite loop :)

Code: Select all

import golly as g

lanes = [0, 2, 4, 6, 8]

glider = g.parse('obo$2o$bo!')
herschel = g.parse('3o$bo$b3o!')

for i in range(g.numlayers()):
    if g.getname(i) == '271rakes':
        g.setlayer(i)
        break

if g.getname() != '271rakes':
    g.addlayer()
    
g.new('271rakes')
g.putcells(glider, 11, -25)

gx, gy = 30, -70
hx, hy = 0, 0

i = 0 
t1 = 0
t2 = 9999

while i < len(lanes):

    if t1 == 0:

        g.putcells(glider, gx, gy)
        gx += 1
        gy -= 27
        t1 += 72

    if (hy - hx - lanes[i]) % 28 == 0 and t2 >= 104:

        g.putcells(herschel, hx, hy)
        hx -= 4
        hy += 20
        t2 = 0
        i += 1

    hx -= 1
    hy += 1
    t1 -= 4
    t2 += 4
    g.run(4)

g.fit()

User avatar
biggiemac
Posts: 515
Joined: September 17th, 2014, 12:21 am
Location: California, USA

Re: (27,1)c/72 caterpillar challenge

Post by biggiemac » October 20th, 2016, 5:23 am

I'm going to post what I have at the moment but then explain why it still is a fair distance from working.
271rakes.rle
(115.21 KiB) Downloaded 497 times
The attached does create the constellation for the LWSS insertion, and a splitter which triggers the reaction and sends another glider NE. It takes 35 rakes in total to achieve this. Unfortunately, there is one leftover block as debris, and there is no way to clean it, so it won't do. I need a truly clean splitter recipe (searching deeper right now). That's not the biggest concern though.

The nearness of the bottom to the track isn't a problem, as everything can be shifted left as needed. However, the top is incomplete for a reason. When getting the insertion and the heisenburn to work, I was unable to get the top to work as well. I need to still do some arithmetic to determine if there is a solution by just spacing things out more, or if the two rakes are in different cosets. The insertion can still work with the helix shifted 38N cells vertically. The heisenburn can still work with the helix shifted 20N cells vertically. The x2 NE gliders can be produced only if the helix is shifted by.. something. I'm afraid we might be overconstrained horizontally and need some more gliders to be fired to get the trigger glider the proper horizontal offset relative to the topmost rake. That's math for another day..
Physics: sophistication from simplicity.

User avatar
biggiemac
Posts: 515
Joined: September 17th, 2014, 12:21 am
Location: California, USA

Re: (27,1)c/72 caterpillar challenge

Post by biggiemac » October 20th, 2016, 4:50 pm

Worked it out, but it isn't pretty. Major edit 10/26 for improved explanation. Hopefully none of it is flat out wrong this time.

Problem Statement
There are lots of equivalent ways to pose the problem; the most practical one at this stage is as follows:
Given a helix that is aligned with the insertion stage, what needs to be changed for it to be viable at the top? Being viable at the top requires meeting 3 constraints: the heisenburn succeeding, the LoM collision succeeding, and the horizontal offset between the topmost and second rakes being correct.

Degrees of Freedom
What can we change? We can move the trigger glider back in increments of (19, 19). We can add a recipe glider assuming there is some deletion step of the recipe that can be made longer, which moves the trigger glider a minimum distance of (53, 53). We can also move the topmost gliders in increments of (1,-1), which causes them to meet the helix later but with the same impact parameter. This moves the NE rebound gliders by (-1,-1), as shown below.

Code: Select all

x = 33, y = 53, rule = LifeHistory
11.2D$11.D.D$11.D2$7.2A$7.A.A$7.A6$5.A$4.3A$4.A.2A$5.3A$5.2A5$2.3A$.A
2.A$4.A22.D$A3.A22.2D$4.A21.D.D$.A.A$31.A$31.2A$30.A.A$7.A$6.3A$6.A.
2A$7.3A$7.2A5$4.3A$3.A2.A$6.A$2.A3.A$6.A$3.A.A4$9.A$8.3A$8.A.2A$9.3A$
9.2A!
Part 1: Heisenburn
The heisenburn is a matter of satisfying an impact parameter with a NW glider. This means if we satisfy the heisenburn, the helix itself may then move any multiple of (1, -1), as well as its own translational symmetry of (2,18), with the heisenburn unaffected. The only thing we can actually do though is stall the helix creation, which is a vertical shift of some multiple of (0,2). A shift of (0, -20) is equivalent to (2, -2) via the symmetry of the helix, so there are 10 cosets and we can reach them all as 19 and 53 are both coprime to 10. Once aligned with the heisenburn, our realizable freedom is to shift the helix in increments of (2, -2).

Part 2: NE rake matchup
In this analysis we have been in the reference frame of the construction effort, so the LoM initial target is fixed, as are the rakes that produce it. Matching the NE gliders is a 2D constraint (mod (34,18), which is the translation between gliders in a x2 NE rake). As we showed above we can move these gliders in increments of (1, 1) without moving the helix. To get the other dimension of freedom, we need to move the helix some number of cells according to the freedom identified above, which moves everything in increments of (2, -2).

It is possible to be unable to meet this constraint, as these shifts all satisfy dx - dy = 4N, and half the time the circumstances might require dx - dy = 4N + 2. Assume though that we can shift everything to satisfy the NE gliders. What freedoms remain to use in matching the 3rd criteria for viability?

Part 3: Top rake horizontal offset
We matched the NE gliders modulo the (34, 18) symmetry of the NE stream. If we perform the following convoluted combination:
Translate the helix by (16, -16) via stalling the insertion glider by (80, 80)
Translate the top of the helix by (2, 18) by adding one unit cell
Move the NE gliders by (16, 16), and the topmost gliders the corresponding (-16, 16)

Then the net displacement of the NE gliders is (34, 18), exactly their symmetry. The net displacement of the NW gliders is (2, 18). The horizontal offset between the topmost and second rakes requires they be skewed by 4 mod 19; their vertical separation is irrelevant. Thus, the freedom identified above is a shift of 2 horizontal cells, sufficient to meet the 3rd and final criterion.

Assessment
We have everything now in terms of how much to shift the trigger glider modulo various parameters. Perform unit shifts to satisfy the heisenburn, then shifts mod (10, 10) to match the NE rake, then shifts mod (80, 80) to achieve the correct horizontal offset, modulo a total overall shift of (1520, 1520) which impacts nothing of interest.

Since 1520 is divisible by 19, the (53, 53) shift incurred by adding a recipe glider is generally necessary for the last part. However, we might have plenty of different recipes to choose from, all of which proceed via a splitter/rephaser. Depending on the properties of the rephaser portion of this, the number of required extra recipe gliders can change. I think I found a way to express that rather simply.

Additional freedoms
To thaw the LWSS, a glider needs to be provided which is advanced by one phase relative to the rakes and is of the same color. When a splitter provides that glider, it adjusts the incoming glider by moving it 2Y cells vertically and advancing it 1 + 4K generations. Y and K can be positive or negative, and only K is important to the result. Splitters may have different values of K.

Assuming the construction proceeds via the 2fd offset honeyfarm, we will call the rake that hits that honeyfarm the "first" rake. The eventual trigger glider is the Nth rake. In the earlier attachment, N = 33.

To have the correct horizontal match between the trigger rake and the LWSS, there is a restriction on N and K. I believe after redundant checks that the restriction is N = (8 - 5K) mod 19. That the modulus is 19 makes sense, since adding 19 to either N or K leaves the problem unchanged, and that the coefficients are 1 and 5 makes sense as adding 4 to K is equivalent to adding 1 to N.

In the earlier attachment K = -2, meaning we need N = 37, so we need to burn 4 more gliders. Perhaps there is a way to set up the same splitter to delete the problematic block when the recipe is 4 G longer, but I haven't found it.

Certain values of K are more reasonable than others. If K = 0 for example, we need a recipe of length 27 or 46, and 27 is too tight to expect the 3SL constellation and a clean splitter. I have found a number of recipes in the 32-36 glider range that nearly achieve the goal, so 46 would be needlessly wasteful (remembering that every rake fired also means a lot of downstream cleanup..)

That one other problem we swept under the rug
Earlier I said there was a 50% chance we can't match the NE gliders, because of requiring dx - dy = 4N + 2. Consider two splitters, A and B, where the K value of A is one greater than that of B, and which activate the same LWSS seed. If A is used, then the helix is 2 cells lower than if B is used, so dx - dy is changed by 2.

Consider instead two identical LWSS seeds built (1, -1) relative to one another. My adaptation to chris_c's program sought out a way to construct the seeds in one of the 5 hive-compatible positions, some of which had relative dx - dy of 4N + 2. For two of these seeds, their resulting helices also have dx - dy changed by 2.

Thus, depending on where the seed is ultimately placed, there is an additional constraint on the parity of K. The route I have been investigating requires K be even, but if the other background search I have been running shows some promise for a different positioning of the seed then an odd K might be necessary. It's just important to know this constraint also exists and how to meet it.
Physics: sophistication from simplicity.

User avatar
biggiemac
Posts: 515
Joined: September 17th, 2014, 12:21 am
Location: California, USA

Re: (27,1)c/72 caterpillar challenge

Post by biggiemac » October 31st, 2016, 7:04 pm

Code: Select all

x = 107, y = 155, rule = B3/S23
24b2o$24b2o11$15b2o$15b2o3$25b2o$25bobo$26bo3$29b2o$28bobo$29bo2$21b2o
$21b2o11$12b2o$12b2o7$26b2o$26bobo$27bo3$30b2o$29bobo$30bo2$22b2o$22b
2o11$13b2o$13b2o3$23b2o$23bobo$24bo3$27b2o$26bobo$27bo2$19b2o$19b2o11$
10b2o$10b2o7$24b2o$24bobo77b2o$25bo78bobo$104bo2$28b2o$27bobo$28bo2$
20b2o$20b2o63b2o$85bobo$85bo7$66b2o$66bobo$11b2o53bo$11b2o3$21b2o$21bo
bo$22bo$47b2o$47bobo$25b2o20bo$24bobo$25bo2$17b2o$17b2o2$28b2o$28bobo$
28bo11$2bo$b3o$2obo$3o$3o$b2o!
A potential MWSS reaction using the same staggered-offset trick as in the LWSS. The staggered TL with a pair of blocks should suffice to set up some LWSS seed to kill off the final glider at the top.

I couldn't find a way to use the clean MWSS seed from chris_c's search to produce nearly-clean x2 output without adding at least one x2 object, which probably costs a bit more than just the 4 cheap SL here.

As for fixing up the LWSS trigger issue, it has proven very frustrating. There should be a 37G recipe that uses the same splitter as the 33G one but is clean, I just don't know how far back I need to modify the search to find it. There are ways to make different splitters in 34G which are clean/cleanable, but the horizontal restriction means that a dozen or so additional gliders need to be wasted to use them.

Edit: The above MWSS inserter can avoid a rephaser by using a different wing seed with the right parity and phase mod 4. Here is one in 10 gliders from a block.

Code: Select all

x = 1035, y = 1061, rule = B3/S23
14b2o$14b2o11$5b2o$5b2o3$15b2o$15bobo$16bo5$32b2o$32b2o$11b2o$11b2o11$
2b2o$2b2o7$16b2o$16bobo$17bo5$33b2o$33b2o$12b2o$12b2o11$3b2o$3b2o3$13b
2o$13bobo$14bo5$30b2o$30b2o$9b2o$9b2o11$2o$2o7$14b2o$14bobo$15bo5$31b
2o$31b2o$10b2o$10b2o11$b2o$b2o3$11b2o$11bobo115b3o$12bo116bo$130bo4$
28b2o$28b2o$7b2o$7b2o101b3o$110bo$111bo7$91b3o$91bo$92bo7$72b3o$72bo$
73bo7$53b3o$53bo$54bo57$234b3o$234bo$235bo7$215b3o$215bo$216bo7$196b3o
$196bo$197bo7$177b3o$177bo$178bo7$158b3o$158bo$159bo65$331b3o$331bo$
332bo7$312b3o$312bo$313bo7$293b3o$293bo$294bo7$274b3o$274bo$275bo7$
255b3o$255bo$256bo66$427b3o$427bo$428bo7$408b3o$408bo$409bo7$389b3o$
389bo$390bo7$370b3o$370bo$371bo7$351b3o$351bo$352bo59$530b3o$530bo$
531bo7$511b3o$511bo$512bo7$492b3o$492bo$493bo7$473b3o$473bo$474bo7$
454b3o$454bo$455bo60$632b3o$632bo$633bo7$613b3o$613bo$614bo7$594b3o$
594bo$595bo7$575b3o$575bo$576bo7$556b3o$556bo$557bo61$733b3o$733bo$
734bo7$714b3o$714bo$715bo7$695b3o$695bo$696bo7$676b3o$676bo$677bo7$
657b3o$657bo$658bo67$828b3o$828bo$829bo7$809b3o$809bo$810bo7$790b3o$
790bo$791bo7$771b3o$771bo$772bo7$752b3o$752bo$753bo61$929b3o$929bo$
930bo7$910b3o$910bo$911bo7$891b3o$891bo$892bo7$872b3o$872bo$873bo7$
853b3o$853bo$854bo59$1032b3o$1032bo$1033bo7$1013b3o$1013bo$1014bo7$
994b3o$994bo$995bo7$975b3o$975bo$976bo7$956b3o$956bo$957bo!
Physics: sophistication from simplicity.

User avatar
muzik
Posts: 5612
Joined: January 28th, 2016, 2:47 pm
Location: Scotland

Re: (27,1)c/72 caterpillar challenge

Post by muzik » December 13th, 2016, 4:43 am

So how would those boats, etc. be generated again?

User avatar
biggiemac
Posts: 515
Joined: September 17th, 2014, 12:21 am
Location: California, USA

Re: (27,1)c/72 caterpillar challenge

Post by biggiemac » June 20th, 2017, 9:44 pm

Life update: I have completed classes. I might be able to put some spark back in this project. It just seemed a bit too thinkythonky to do in parallel with the whole not-failing-grad-level-physics-courses thing.

A couple remarks (mainly here to get present-me on the same page as past-me):

There is a climber and a helix. The helix is x3. The climber doesn't do much to rephase the track. A loaf+block constellation can serve as a frozen track, hopefully fixing the rephasing issue.

The fanouts for this helix have the potential to be extremely bulky. In order to minimize that, we came up with a way to produce a full constructor from just a single track, in theory. This means fanouts produce just 3 copies of the helix glider, rather than as many as 15.

The single track would fire a bunch of backrakes (byproducts of the natural reaction) at a target stream of x2 *WSS, and use the debris to recreate the *WSS and the additional tracks required to make the full constructor. This x2 closed loop has a bunch of wonky timing restrictions but the math I did last October details the constraints that places on our recipes. It is not ruled impossible.

The reason I had been so obsessive over optimizing the number of rakes to be as few as possible: during this single-track-becomes-constructor stage, every rake is dirty, and the constructor will spend a lot of time in its early life just destroying the debris that was left behind creating it. A similar process happened after each reset in the Waterbear, but this one will be at least an order of magnitude messier. I expect saving one backrake saves on the order of a dozen rakes later in the ship.

For convenience, once a single-track-to-clean-construction-unit module is complete, we can have a frozen-track-to-construction-unit just by starting from the loaf+block. This might actually be the easiest route to providing activation gliders in the right phase for the helix and fanout ships, since the climber itself is not an adept rephaser. So this mass of x2 *WSS syntheses and cleanup might have to happen at multiple points in the ship.

The 271rakes rle posted earlier gives a reasonable (from a distance) look at what the x2 syntheses are made of. It is missing the top, thanks to lacking in the nitty gritty of timing. After the *WSS syntheses, we probably need a constellation that can be activated to produce 4 synchronized-mod-(19,45) gliders to round out a full constructor.

There are options as to which 5-track constructor to go with. I might have to choose arbitrarily in order to make any progress. There are also undoubtedly constructors with more tracks, and possibly workable ones with fewer tracks that I haven't seen.

For now, just getting a single track to produce its own x2 *WSS feedback loop will be a good step forward. Hopefully I can post a demonstration of just that in the near future.
Physics: sophistication from simplicity.

googleplex
Posts: 308
Joined: January 24th, 2018, 4:36 pm
Location: The hertzsprung gap

Re: (27,1)c/72 caterpillar challenge

Post by googleplex » February 16th, 2018, 9:21 pm

Am I the only one still working on this anymore?
Look at me! I make patterns in golly and go on the forums! I wanna be Famous!

googoIpIex
Posts: 292
Joined: February 28th, 2019, 4:49 pm
Location: Sqrt(-1)

Re: (27,1)c/72 caterpillar challenge

Post by googoIpIex » May 7th, 2019, 9:09 am

I really want to help this, but I have no Idea how...
woomy on a vroomy

User avatar
dvgrn
Moderator
Posts: 10610
Joined: May 17th, 2009, 11:00 pm
Location: Madison, WI
Contact:

Re: (27,1)c/72 caterpillar challenge

Post by dvgrn » May 7th, 2019, 5:50 pm

googoIpIex wrote:I really want to help this, but I have no Idea how...
In June 2017, biggiemac wrote:After the *WSS syntheses, we probably need a constellation that can be activated to produce 4 synchronized-mod-(19,45) gliders to round out a full constructor.
I'm not paying enough attention to this project to know for sure. But it seems like this seed constellation that biggiemac mentioned might be one of the simpler things that could be usefully contributed.

Now, biggiemac hasn't logged in to the forums for quite a while -- maybe quantum physics is keeping him busier than he thought! Someone else might have to pick up this project if it's going to get done.

Specific to the suggestion about a 4G seed constellation, there definitely seems to be a shortage of people who are good at building seed constellations out of one-time turners and splitters. Otherwise I think by this time we'd have a lot more constellations that magically turn into various spaceships and oscillators and still lifes. And a script that builds constellations that can be triggered by one glider to make any arbitrary synchronized glider salvo, not just slow salvos... and who knows, maybe even a freeze-dried waterbear.

Seeds like this are currently a little tricky to get synchronized, because simsim314's collection of splitters isn't quite big enough yet, or quite organized enough. At least I _think_ it isn't organized enough... there's a series of posted stamp collections that seem to be divided into eight categories each, but it seems to me there are really 16 categories in some of those cases, so two different categories end up being mixed together.

Similarly, all the stamp collections labeled with numbers would be much more useful if the range of numbers could be made contiguous. The search could be extended to 3sL and/or 16x16 as necessary.

Let's say we need two gliders traveling away from each other on nearby lanes -- offset of N, relative phase P.
Eventually we should have a lookup table with a splitter for every possible N and P in a big range. When we need one, we just look it up and drop it into our seed pattern.

... Does that suggestion seem to point in an interesting direction, or no? The other holes suggested by biggiemac's last post seem more difficult to chop up into bite-sized pieces.

googoIpIex
Posts: 292
Joined: February 28th, 2019, 4:49 pm
Location: Sqrt(-1)

Re: (27,1)c/72 caterpillar challenge

Post by googoIpIex » May 13th, 2019, 3:21 pm

I don't really know what 4 synchronized-mod-(19,45) gliders means.
woomy on a vroomy

Post Reply