dvgrn wrote:How many more lanes do we need to solve before the first following glider becomes so exposed that it can be picked off before the front one?

Here's quick look at lane offsets N=3 through 7. Here's the farthest forward that a following glider can be placed on lane N, while still allowing the combination construct-then-shove on lane 0. At lane 7, the following glider no longer guards the lead one, and can be picked off directly by the loaf-and-beehive insertion mechanism:

I think this leaves just a few cases for lanes 1-6 where the trailing glider is farther forward than the ones shown. Seems likely that these can all be handled in similar ways. Maybe a proof of universal slow-constructibility can consist of a complete collection of all possible glider offsets at the front corner of a large salvo, with a mechanism for constructing one of the front gliders in each case.

dvgrn wrote:I think this leaves just a few cases for lanes 1-6 where the trailing glider is farther forward than the ones shown. Seems likely that these can all be handled in similar ways. Maybe a proof of universal slow-constructibility can consist of a complete collection of all possible glider offsets at the front corner of a large salvo, with a mechanism for constructing one of the front gliders in each case.

Extrementhusiast's clock-to-glider trick works down to the minimum leading distance for lane offsets from 0 to 6, as shown:

The 6-lane offset case seems particularly impressive. It makes me wonder if there might be a relatively simple rule for a proof by induction -- something like "in any SW-traveling salvo, the first glider that touches an arbitrary line with slope 1/5 is always constructible with a clock conversion."

-- Actually I think the above trial pattern implies that a simple horizontal line could be used... just pick the rightmost glider if multiple gliders touch at once. Can any Evil Salvo counterexample be constructed that successfully guards the rightmost first glider to touch an arbitrary horizontal line, against a clock+domino construction?

Then... are there any other options besides clock+domino that work in all the same cases -- any P1 constellations, in particular? It's kind of expensive to go around smashing clocks all the time.

I have written a script that reproduces any SW glider salvo using Extrementhusiast's clock based inserter (or at least I hope I have).

The primary idea is to sort the gliders by distance to the south-west followed by distance to the north-west. In this lexicographic ordering a glider that it is "greater" than another can always be constructed without obstruction except in a small number of cases.

Specifically, those cases are when two gliders differ by 7 lanes and the back glider is 1, 2, 3 or 4 ticks behind the lead glider and south-east of it.

In those cases I calculate a set of more advanced gliders that need to be made before the back one. I think the code gives a more obvious description than I can:

It only does anything if it detects that the current pattern is made up solely of non-colliding SW gliders. In that case it places a bunch of NW gliders and clock-turners that (hopefully) reproduce the SW glider salvo but shifted west by some number of cells.

Here it is in action eating Evil Glider Salvo #2 for breakfast with an annoying wing of "chained" gliders added to make things more difficult. It seems to be working well but some proper crash testing is definitely in order.

EDIT: here is an updated version of the script. When it finds a chained glider it advances the front by the minimum amount possible instead of always by 4 ticks. I think both approaches work but this way is more in the spirit of the intended algorithm. Also I made the placement of turners more compact by advancing by diagonally rather than by x-coordinate. The small step size of 23 is a new source of potential bugs but I think it should work properly.

chris_c wrote:Here it is in action eating Evil Glider Salvo #2 for breakfast with an annoying wing of "chained" gliders added to make things more difficult. It seems to be working well but some proper crash testing is definitely in order....EDIT: here is an updated version of the script.

Rather than attempt to prove that all possible cases work -- too much thinking for tonight! -- I just wrote a script to randomly generate very tight glider spacings in a large square region.

Allow me to introduce Evil Glider Salvo #Borg ("Resistance is Futile. You Will Be Duplicated."):

Cool! So no problems found so far. Forgive my hopelessly amateur Herschel plumbing but here is a stable 2H->G front glider inserter using the clock method. It could be the basis of an automatic gun making script.

Yes, I built a 500x500 random packed glider fleet overnight. Your revised script successfully built #SuperBorg in a few seconds this morning with no trouble.

Completing an official proof now should just be a matter of finding the easiest way to enumerate a limited number of cases, and demonstrate that the clock insertion works in each case -- farthest forward neighboring gliders on both sides at L=1..N, maybe. Other cases can be taken care of by "gliders that aren't [Here] by [Now] can't possibly affect the insertion area before the reaction is complete, because c/4. Q.E.D."

chris_c wrote:Forgive my hopelessly amateur Herschel plumbing but here is a stable 2H->G front glider inserter using the clock method. It could be the basis of an automatic gun making script.

Oh, that's a perfectly adequate Herschel construction for this purpose. Good use of Snarks. Can always cut it down to size later.

Seems as if an automatic gun maker could use cheaper methods for almost all cases. The old three-glider inserter works down to T=15:

And I'm kind of betting there's a four- or five-glider 180-degree collision that can replace the clock for most if not all T=14 insertions. Seems as if that problem might be within reach of an exhaustive LifeAPI search.

Anyway, an utterly unreasonable but rather nice trick for an automated gun-making script might be to add one more leading glider on each side of the salvo to be built. These gliders can be used to trigger a string of stable pseudo-Heisenburp devices, which produce the initial Herschels that create the sideways gliders for the insertion reactions. Then it becomes trivial to string together as many inserter guns as are needed to produce an arbitrary salvo.

The resulting shotgun will be -- um -- a bit oversized, but that doesn't seem to be something we need to worry about here.

More reasonably, we can build a conventional G-to-H-to-G with the output glider on the same lane, and add adjustable delay circuits so that each insertion occurs just when the salvo arrives. The lead gliders have to start very far ahead in that case, and each successive inserter will have a shorter delay than the last. But the repeat time won't suffer, and it's just a matter of having the script move a couple of Snarks by N cells and substitute one of eight components with [N..N+7] timing somewhere in the circuit. Could borrow most of this from simsim314's O(log N) gun builder.

Those ~100 lines of code, include the iteration on states of 3 gliders, skip duplicates, check for reflected glider in the correct orientation, check that glider 14 ticks behind is not colliding, and it's all in half hour of coding and 1 min run. I think golly python script would be of similar size if not bigger (as LifeAPI iterators, replace the need for million loops).

EDIT2 It would be nice to go over "evil salvo list" to "rate" the placer. As for now I just place single glider 14 ticks behind, and report success, if everything worked. If we want more fine tuned results, we need better rating/filtering definitions.

dvgrn wrote:Completing an official proof now should just be a matter of finding the easiest way to enumerate a limited number of cases, and demonstrate that the clock insertion works in each case -- farthest forward neighboring gliders on both sides at L=1..N, maybe. Other cases can be taken care of by "gliders that aren't [Here] by [Now] can't possibly affect the insertion area before the reaction is complete, because c/4. Q.E.D."

I had another think about completing a formal proof. By picking off gliders on a non-diagonal front I think the selection algorithm can be just a simple sort rather than the recursive stuff I was doing previously. I changed calculcate_salvo to:

simsim314 wrote:EDIT2 It would be nice to go over "evil salvo list" to "rate" the placer. As for now I just place single glider 14 ticks behind, and report success, if everything worked. If we want more fine tuned results, we need better rating/filtering definitions.

If an inserter can work at 14 ticks on lane 0 and 7 ticks on lanes +/-6 then I think it is likely to be a perfect inserter:

chris_c wrote:I had another think about completing a formal proof. By picking off gliders on a non-diagonal front I think the selection algorithm can be just a simple sort rather than the recursive stuff I was doing previously. If an inserter can work at 14 ticks on lane 0 and 7 ticks on lanes +/-6 then I think it is likely to be a perfect inserter...

A good-enough inserter, anyway. On second thought I probably shouldn't ask for a cheaper reaction that can replace the clock inserter in every possible situation, because the clock inserter is just ridiculously better than we need for construction universality:

The [7@-6,14@0,7@6] test seems like a likely one -- sufficient, at least, though possibly not necessary. Seems as if there might be a construction order that would allow an inserter that fails this test to still construct any possible salvo. For example, would an inserter that can drop a glider a couple of cells into a slope-6 line allow universality? and what's a good way to measure this kind of thing?

chris_c wrote:It would be great to find a 4 or 5 glider method of achieving this so that we can use just one inserter for every scenario.

It seems vaguely possible that there's a 4-glider collision that will produce a perfect inserter directly. A 3-glider solution seems a bit too much to hope for -- somebody would have noticed it by now.

It appears that none of simsim314's 5-glider solutions so far can quite match the clock+spark insertion. But there are lots of options left to try, including colliding with an active 2-glider collision -- no starting target still life. Blinkers and traffic lights are also fair game as intermediate targets, of course.

If the front one is made last then that requires the 7@+/-6 property. If one of the back ones is made last then that requires the recipe to be able to do back insertions with at least a one lane overhang. I can't get my head round how that would be practical in a recipe that also has good front insertion characteristics.

Unfortunately it seems that the condition is not sufficient either. I tweaked one of simsim's loaf based inserters to get this:

So what I think is a necessary condition is that the recipe is perfect on lanes -6, ... +6 (concretely, that means the gaps should be [7,9,11,13,14,14,14,14,14,13,11,9,7]) and that the sum of the gaps on lanes +/-N are less than or equal to 1 for all N >= 7.

Reasoning: suppose that the minimum gap at +N is t1 and the minimum gap at -N is t2 and that t1 + t2 > 1. Let t = t1 - 1. Then t < t1 and -t = 1 - t1 = t2 - (t1 + t2 - 1) < t2. So gliders differing by N lanes and time t cannot be built by this recipe.

I am going to try brute force and hope that something good enough shows up.

chris_c wrote:It's perfect on lanes -6, ... +6 but it can make neither of the gliders in this salvo:

You don't have to use the same recipe all the time. You need a set of recipes that work universally.

chris_c wrote:So what I think is a necessary condition...

I couldn't understand this section. It seems to me that we need inserter for any "3 gliders front". So all we need is:

1. List of "gliders fronts". 2. For each glider front, recipe that works for it. 3*. Preferably a proof of universality. That is having N recipes from #1, we can get universal insertion algorithm. There is no need to optimize #1, we just need N cases, for very large N. As we have it all done by scripts, we can allow ourselves very large number of cases and recipes.

Probably me neither. It seems like we definitely need an inserter that works with 7 ticks on lanes +6 and -6. That definitely seems like the hardest case. After that it is probably easy to complete the other cases using different recipes. But I was really hoping for a cheap(ish) recipe that can give a universal solution on its own.

chris_c wrote: But I was really hoping for a cheap(ish) recipe that can give a universal solution on its own.

I think your 8 glider solution is actually not that bad. I'll run more exhaustive search for 4/5 gliders later on, but from what I can see there is some sort of magic done with the clock inserter, which is pretty rare.

chris_c wrote:I also tried to search for a head on 4 glider clock synthesis but had no luck.

Bidirectional slow salvo?

I guess if there was a SL + 2G collision that made a clock then it would already be known, right? I was kind of surprised I couldn't find a head on 4 glider clock synthesis but it just goes to show how rare clocks are (or there was a bug in my search).

Anyway, I have updated my script to calculate glider based inserters. I added the 3-glider, 4-glider and 8-glider inserters that I already mentioned in this thread. More can easily be added. When applied to the Borg Salvo, the 3-glider inserter is used 37% of the time, the 4-glider 49% and the 8-glider %14. I'm pretty happy with that result already.

The selection method used in the script guarantees that a glider that already exists N lanes to the NW of the current glider will be at most N ticks in front and that a glider that exists N lanes to the SE will be at least N+1 ticks behind. If an inserter cannot meet the requirements for a particular lane then that must be listed in the exceptions dict of the recipe.

The selection method was chosen because:

a) it is simpleb) it works well with the 3 and 4 glider inserters.

I would love to see efficient stable converters for the inserters --- in particular the 4-glider inserter looks like it could be a good work-horse.

chris_c wrote:Anyway, I have updated my script to calculate glider based inserters.

What will happen if we will add say 20-30 (pretty good) recipes, using 3-5 gliders. Then instead of giving each recipe all the combinations they work in as input dictionary, we just add to the current "glider list" a recipe, evolve it, and see if it works. We will start from 3 to 5 gliders recipes, if some recipe is working we just continue to the next glider. Obviously we can add the clock recipe as last resort.

My guess is that combined power of all 3-5 gliders recipes is enough, at least for 99% of cases.

Another place to improvement will be to optimize the insertion order. This might also be considered last resort - if no 3-5 recipe worked, we try to change the insertion order around that particular glider, and see if this helps.

My guess is if we do all that - the chances we will need a clock inserter will go down to be very low if any.

simsim314 wrote:What will happen if we will add say 20-30 (pretty good) recipes, using 3-5 gliders.

Ok, I added a couple more 4 glider inserters. They have a larger set of exceptions but the exceptions are distinct from the exceptions of the other 4 glider inserter. The clock inserter usage in the Borg Salvo drops to 6.5% after this change.

chris_c wrote:Also note that recipes 4 and 4a would be sufficient to make a p160 Dart gun:

I'm really not sure where we're going with this "universality" stuff. But this proves to me as of practical applications are concerned, we're pretty much covered for any salvo, with your script, while having very good efficiency.

The next step would probably be "universal salvo gun" script. And "gun generation" script per any glider recipe.

chris_c wrote:Also note that recipes 4 and 4a would be sufficient to make a p160 Dart gun:

I'm really not sure where we're going with this "universality" stuff...

Don't know about anybody else, but I've been thinking in terms of formal proofs just because of the various mechanisms that I've been calling "universal constructors" for the past few years. They're only really universal if slow salvos can provably construct any synchronized glider salvo.

If there had turned out to be some glider spacings that synchronized glider collisions couldn't construct, then it would be necessary to prove that anything that could be constructed by gliders with those spacings could also be constructed with wider-spaced salvos. Seems as if that would be unlikely to be provable, so I'm glad that there don't seem to be any such cases.

simsim314 wrote:The next step would probably be "universal salvo gun" script. And "gun generation" script per any glider recipe.

Another possible goal will be a script that builds a stable 1G seed constellation for any given input salvo -- i.e., hit the constellation with one glider, and eventually the required salvo emerges with no leftover ash. I suppose there could be P1 and P2 versions of this, since it's obviously much easier if you can start with occasional clocks in the constellation!

Is there a way to move any of those front-edge gliders forward and still replace that glider? It seems just barely possible that the solution below can be improved, at least slightly. Maybe a glider sneaking in from the SW could hit a small still life near a clock to make the required spark?

It could be a two-bit diagonal spark, or a domino spark on either side. As chris_c's eight-glider recipe shows, the spark doesn't have to be disconnected, as long as it fades away quickly when modified by one cell from the clock.

Here's the best recipe I've found so far, eight gliders again, to solve the above insertion problem:

dvgrn wrote:Just spent a little more time looking at the clock-based insertion reaction. Turns out there's a way to use it to replace the sabotaged glider in this salvo:

Is there a way to move any of those front-edge gliders forward and still replace that glider? It seems just barely possible that the solution below can be improved, at least slightly.

There could well be. I think I chose that pair of trigger gliders because they have the same color and mod 8 timing relative to the gliders that make the clock. If you check my oversized Herschel plumbing you should see that the final inserters on either side only differ in terms of position.

Some while ago I made a more up to date version of that pattern. It's a lot better than the original but there were still two things that bugged me. First, I think the last pair of inserters can be done a lot better. Second, the fact that the design has glider crossings means the repeat time is somewhere just short of 500 ticks.

chris_c wrote:Some while ago I made a more up to date version of [the stable clock-based glider inserter]. It's a lot better than the original but there were still two things that bugged me. First, I think the last pair of inserters can be done a lot better. Second, the fact that the design has glider crossings means the repeat time is somewhere just short of 500 ticks.

I think I'll pass on trying my hand at that construction for the time being, in case an improved recipe shows up. I'd be tempted to build an edge-shooter with adjustable clearance, though of course it would be bigger than your version: build a clock and a spark-making bait by colliding an LWSS with some number of gliders, and then send the trigger glider in at the right time.

Not sure if that would make it easier to write a universal salvo gun script, or not. It would be possible to send a trigger signal down just one side of the construction lane, with no synchronization needed between two opposing sets of guns. But stable LWSS-makers are still pretty awkward, either huge or slow to recover or probably both.

Anyway, here's a spark-making boat elimination reaction from pentadecathlon.com, that allows a glider insertion into a fairly narrow pocket, which can be as deep as you want:

dvgrn wrote:So... is there a constellation that can provide the clock-conversion spark, that fits directly behind the clock, and allows the trigger glider to come in from directly behind the clock as well?

It looks like the boat annihilation may be hard to beat. I'm interested in minimizing the number of cases that need to be enumerated to complete a formal proof.

One of the versions of the boat annihilation stays inside a width-7 diagonal stripe. The other version needs a width-9 stripe, but it may be even better because the glider ends up on the edge of the stripe instead of in the middle:

It's possible to sneak up on the clock with a spark from a more distant constellation, as in the two-blinker examples on the right. But so far it appears that that just widens the stripe without really improving anything.

With any of several variants of that edge-of-stripe return glider, it seems as if you can add a glider to the south/southwest edge of an existing salvo, without having to worry about gliders to the northwest or north. If the glider can be added at all, then the insertion will work.

It looks like it might be simplest to complete a proof using a slope of 1/2 -- Cartesian slope of -1/2, I guess I should say. The claim is that this insertion reaction can always add the SE-most glider, of the gliders in a salvo that first touch an arbitrary line with that slope:

There are a few more worrisome cases to enumerate, but it looks like they all work (?). This is pretty much the exact approach that chris_c's script uses, and there are quite a wide range of line slopes that could be chosen. Unfortunately a nice simple slope of 1 is too high, though, and a slope of 0 is too low.

-- I'm just trying to boil down the explanation of why the insertion always works, to the smallest number of cases. Anyone see a cleaner way to tackle a proof? Possibly having a choice of two different insertion reactions might end up simplifying the proof somehow, but I don't see it yet.

dvgrn wrote:I'd be tempted to build an edge-shooter with adjustable clearance, though of course it would be bigger than your version: build a clock and a spark-making bait by colliding an LWSS with some number of gliders, and then send the trigger glider in at the right time.

Woah, sounds scary. I have never been able to find any clock syntheses except for the symmetric one with 6 gliders. Making a clock with only LWSS and gliders and then triggering it sounds hard indeed.

dvgrn wrote:It looks like the boat annihilation may be hard to beat.

Agreed. I can't get anything to work that is thinner.

dvgrn wrote:I'm just trying to boil down the explanation of why the insertion always works, to the smallest number of cases. Anyone see a cleaner way to tackle a proof?

In terms of Cartesian co-ordinates my script uses a slope of 1 in 3 and I consider this to be the cleanest way of doing things because of the existence of the following 4 glider inserter that works except on a small handful of lanes: