Oscillator Discussion Thread

For discussion of specific patterns or specific families of patterns, both newly-discovered and well-known.
User avatar
dvgrn
Moderator
Posts: 10612
Joined: May 17th, 2009, 11:00 pm
Location: Madison, WI
Contact:

Re: Oscillator Discussion Thread

Post by dvgrn » December 3rd, 2022, 11:42 am

I decided to stop my multi-day attempt to build a p1023 strictly volatile oscillator, because it looked likely that the script would fail with an out-of-memory error in the last few lines. That's when it grabs a copy of the singleton speed-0 Caterloopillar and pastes four copies in the correct places.

I bumped up Golly's allowed usage from 8GB to 14GB, and was then able to build a full oscillator out of four copies, using glider_rider's code, in about half an hour. So the required RAM might be somewhere in that range.

You can try running this snippet after opening the speed-0 Caterloopillar mega-*WSS-fleet shotgun attached to the last post, and make sure your system can handle the job:

Code: Select all

import golly as g

goalPeriod = 1024
#Arrange four copies so that ships annihilate, and step a bit to make it an oscillator
boundingRect = g.getrect()
g.show("Collecting single speed-0 Caterloopillar for duplication...")
singleLoop = g.getcells(boundingRect)
g.new("P" + str(goalPeriod) + " Strictly Volatile Loop")
xOffset = -boundingRect[0] - (boundingRect[2] // 2)
yOffset = -boundingRect[1] - (boundingRect[2] // 2) - boundingRect[3]
xOffset -= xOffset % 2
yOffset -= yOffset % 2
g.show("Pasting first speed-0 Caterloopillar...")
g.putcells(singleLoop, xOffset, yOffset, 1, 0, 0, 1, "or")
g.fit()
g.update()
g.show("Pasting second speed-0 Caterloopillar...")
g.putcells(singleLoop, -xOffset, -yOffset, -1, 0, 0, -1, "or")
g.fit()
g.update()
g.show("Pasting third speed-0 Caterloopillar...")
g.putcells(singleLoop, yOffset, xOffset, 0, 1, 1, 0, "or")
g.update()
g.show("Pasting fourth speed-0 Caterloopillar...")
g.putcells(singleLoop, -yOffset, -xOffset, 0, -1, -1, 0, "or")
g.show("Done")
You have to zoom in and out way down to the south of the initial pasted Caterloopillar, to see Golly's slow progress at pasting the first 180-degree inverted copy. Golly is much faster at pasting the first copy than at adding in the transformed copies.

... Come to think of it, it should be very easy to adjust this to do the copy/paste work in a few hundred or a few thousand separate stages, to cut down memory use. But the construction stage of the script can still use as much memory as it can get, so it's still a good idea to bump up Golly's limit to as high as possible.

Here's a proof-of-concept hard-coded script, to be run after opening the specific one-quarter-p1024-strictly-volatile.mc.gz file from my previous post. I re-uploaded a version with the top Caterloopillar in a more convenient location, to save an unnecessary cycle of copying, clearing, and re-pasting.

It still looks like it will take twenty minutes or so to complete the quadruplication process, but at least it won't try to eat scary amounts of memory while it's doing it:

Code: Select all

# Arrange four copies of one-quarter-p1024-strictly-volatile.mc.gz so that ships annihilate
# Stepping it a bit (presumably at step size 2^10) to make it an oscillator
#  ... is left as an exercise for the script runner.
import golly as g

g.setpos("0","0")
g.setmag(-12)
count = 0
for x in range(-692587, 692585, 1024):
  count += 1
  singleLoopPart = g.getcells([x,-720279, 1024, 27692])
  g.show("Pasting second speed-0 Caterloopillar, part " + str(count) + " out of 1352")
  g.putcells(singleLoopPart, 0, 0, -1, 0, 0, -1, "or")
  g.show("Pasting third speed-0 Caterloopillar, part " + str(count) + " out of 1352")
  g.putcells(singleLoopPart, 0, 0, 0, 1, 1, 0, "or")
  g.show("Pasting fourth speed-0 Caterloopillar, part " + str(count) + " out of 1352")
  g.putcells(singleLoopPart, 0, 0, 0, -1, -1, 0, "or")
  g.update()
EDIT: That's just a proof of concept, it doesn't actually quite work (puts the Caterloopillar-shotguns just slightly too close to each other at the NE and SW corners). It would need to be generalized properly anyway to work with any period.

User avatar
glider_rider
Posts: 160
Joined: February 20th, 2013, 5:41 pm
Location: CA

Re: Oscillator Discussion Thread

Post by glider_rider » December 3rd, 2022, 4:28 pm

dvgrn wrote:
December 3rd, 2022, 9:44 am
@glider_rider, do you have any rough statistics on how long it took your computer to run your script to build the p1024 oscillator? How much RAM did you have available? With 8GB allotted to Golly on my current laptop, it's looking like a p1023 oscillator might take between two and three days to build, but I won't know for sure until it's done.

I'm not clear yet on how much the non-HashLife-friendliness of 1023 might be slowing things down. Halfway through building the western convoys after completing the eastern ones, Golly has stepped the full pattern forward by 1.7 million ticks. It seems likely that a lot of the slowness of the script has to do with stepping the growing pattern forward in time, especially by a non-HashLife-friendly number of ticks as is happening here.
The p1024 was a lot faster, I don't remember the exact time but with 4GB allotted it was more on the order of hours than days. The HashLife friendliness of p1024 helps a lot.

EDIT:
In cases where the period isn't divisible by 8, it's possible to remove some of the ships since we can create more different phases of ship with the same recipe by constructing it later on in a different phase. This allows for periods 943 and 945+, and also should make the oscillators smaller in the non-multiple-of-8 case. Here's an updated script:

Code: Select all

import golly as g
from glife import *
from time import time
import copy

periodString = g.getstring("Enter period either 943 or greater than or equal to 945", "943")
goalPeriod = 943
if not validint(periodString):
    g.exit("Not a valid integer")

goalPeriod = int(periodString)
numPhaseTypes = 1 if goalPeriod % 2 == 1 else (2 if goalPeriod % 4 == 2 else (4 if goalPeriod % 8 == 4 else 8))

if goalPeriod - numPhaseTypes < 941:
    g.exit("Does not work for this period")

startTime = time()

g.new("P" + str(goalPeriod) + " Strictly Volatile Loop")
g.setalgo("HashLife")
g.setrule("B3/S23")

block = pattern("2o$2o!")
glider = pattern("bo$2o$obo!") #NW-facing
#W-facing
convoyUnitWest0 = pattern("72b5o$72bo4bo$72bo$73bo3bo$75bo3$61b4o$61bo3bo$42b2o17bo$41b2ob3o15bo2bo$42b5o$43b3o5$4b2o$2bo4bo3b2o56b6o$bo8b2ob3o53bo5bo$bo5bo3b5o53bo$b6o5b3o55bo4bo$72b2o6$3bo$bo3bo$o$o4bo$5o3$11b3o25b6o$10b5o24bo5bo$9b2ob3o5b5o14bo$10b2o8bo4bo14bo4bo$20bo21b2o$21bo3bo$23bo!", 0, -17)
convoyUnitWest1 = pattern("59b5o24b4o$59bo4bo22b6o$59bo26b2ob4o$60bo3bo22b2o$62bo4$72b5o$72bo4bo$72bo$73bo3bo$75bo3$61b4o$61bo3bo$61bo$62bo2bo7$4b2o23b2o$2bo4bo3b2o15b2ob2o36b6o$bo8b2ob3o13b4o36bo5bo$bo5bo3b5o14b2o37bo$b6o5b3o55bo4bo$72b2o6$3bo$bo3bo$o$o4bo$5o3$11b3o17b6o$10b5o16bo5bo$9b2ob3o5b5o6bo$10b2o8bo4bo6bo4bo14b4o$20bo13b2o16bo3bo$21bo3bo26bo$23bo29bo2bo!", 0, -25)
convoyUnitEast0 = pattern("72b5o$72bo4bo$72bo$73bo3bo$75bo3$61b4o$61bo3bo$61bo$62bo2bo7$4b2o$2bo4bo3b2o56b6o$bo8b2ob3o53bo5bo$bo5bo3b5o53bo$b6o5b3o55bo4bo$72b2o6$3bo$bo3bo$o$o4bo$5o$39b2o$37bo4bo$11b3o22bo$10b5o21bo5bo$9b2ob3o5b5o11b6o$10b2o8bo4bo$20bo29b5o$21bo3bo24bo4bo$23bo26bo$51bo3bo$53bo!", 0, -17)
convoyUnitEast1 = pattern("72b5o$72bo4bo$72bo$73bo3bo$75bo3$61b4o$61bo3bo$61bo$62bo2bo7$4b2o14b4o$2bo4bo3b2o7bo3bo44b6o$bo8b2ob3o4bo48bo5bo$bo5bo3b5o5bo2bo44bo$b6o5b3o55bo4bo$72b2o6$3bo$bo3bo$o$o4bo$5o3$11b3o23b6o$10b5o22bo5bo$9b2ob3o5b5o12bo$10b2o8bo4bo12bo4bo$20bo19b2o$21bo3bo4bo2bo$23bo5bo$29bo3bo$29b4o!", 0, -17)

lwssRecipe = [[[[0,0]],0],[[[-9,0]],0],[[[-2,0]],1],[[[11,0]],1],[[[12,0]],0],[[[16,0]],0],[[[8,49],[11,33],[2,0]],0]]
mwssRecipe = [[[[9,0]],0],[[[18,0]],0],[[[9,0]],0],[[[13,0]],0],[[[20,0]],0],[[[20,0]],1],[[[19,0]],-1],[[[15,0]],1],[[[17,0]],-1],[[[8,0]],2],[[[12,0]],0],[[[14,0]],0],[[[17,0]],2],[[[11,0],[18,15]],0]]
hwssRecipeHighClearance = [[[[0,0]],0],[[[8,0]],0],[[[1,0]],1],[[[16,0]],1],[[[-5,0]],-1],[[[-14,0]],1],[[[-17,0]],1],[[[-16,0]],0],[[[-13,0]],2],[[[-5,0]],-2],
                           [[[-26,0]],0],[[[-24,0]],2],[[[-10,0]],-2],[[[-4,0]],0],[[[-3,0]],0],[[[0,0]],0],[[[-3,0]],3],[[[-4,75],[-18,41],[7,41],[-6,0]],-3]]

#determines the distance between furthest lanes
def getRecipeWidth(recipeList):
    minPoint = recipeList[0][0][0][0]
    maxPoint = minPoint
    for i in range(1, len(recipeList)):
        for j in recipeList[i][0]:
            if minPoint > j[0]:
                minPoint = j[0]
            if maxPoint < j[0]:
                maxPoint = j[0]
    return maxPoint - minPoint

maxRecipeWidth = max(getRecipeWidth(lwssRecipe), getRecipeWidth(mwssRecipe), getRecipeWidth(hwssRecipeHighClearance))
convoyUnitPart2Offset = max(0, maxRecipeWidth - 48)

#adjusts xWSS recipe positions
convoyDataAdjustments = [[0, 0, 0], [118, 3, 0], [279, 3, 0]]
def adjustConvoyData(convoyData):
    newConvoyData = []
    for xWSSData in convoyData:
        newXWSSData = [xWSSData[0], xWSSData[1] + convoyDataAdjustments[xWSSData[0]][0], xWSSData[2] + convoyDataAdjustments[xWSSData[0]][1] - 100, (xWSSData[3] + convoyDataAdjustments[xWSSData[0]][2]) % 4]
        if xWSSData[3] + convoyDataAdjustments[xWSSData[0]][2] >= 4:
            #rollover
            newXWSSData[1] += 2
        newConvoyData.append(newXWSSData)
    return newConvoyData

convoyUnitDataWest0 = adjustConvoyData([[1, 0, 0, 0], [1, 29, -9, 3], [0, 11, -7, 0], [2, 70, -19, 2], [1, 60, -18, 3], [2, 3, -18, 0], [1, 71, -30, 2], [1, 62, -36, 1], [1, 52, -37, 0], [2, 33, -35, 0]])
convoyUnitDataWest1 = adjustConvoyData([[1, 13, 8, 0], [2, -15, 7, 1], [1, 0, 0, 0], [0, 11, -7, 0], [2, 70, -19, 2], [1, 60, -18, 3], [0, 42, -17, 3], [2, 3, -18, 0], [1, 71, -30, 2], [1, 62, -36, 1], [1, 52, -37, 0], [2, 41, -35, 0], [0, 20, -38, 0]])
convoyUnitDataEast0 = adjustConvoyData([[1, 0, 0, 0], [0, 11, -7, 0], [2, 70, -19, 2], [1, 60, -18, 3], [2, 3, -18, 0], [1, 71, -30, 2], [1, 62, -36, 1], [1, 52, -37, 0], [2, 35, -35, 2], [1, 22, -39, 0]])
convoyUnitDataEast1 = adjustConvoyData([[1, 0, 0, 0], [0, 11, -7, 0], [2, 70, -19, 2], [1, 60, -18, 3], [0, 52, -17, 0], [2, 3, -18, 0], [1, 71, -30, 2], [1, 62, -36, 1], [1, 52, -37, 0], [2, 35, -35, 0], [0, 42, -41, 2]])

#equality check
def equals(patternA, patternB):
    return g.evolve(patternA, 0) == g.evolve(patternB, 0)

#find glider locations that are too close to be generated (up to a maximum lane offset)
def gliderLocationsTooClose(testRange):
    gliderPositionBlacklist = []
    for nextGliderGen in range(4):
        gliderPositionBlacklist.append({})
        for x in range(-testRange, testRange+1):
            gliderPositionBlacklist[nextGliderGen][x] = set()
            for y in range(-testRange, testRange+1):
                g.show("Blacklisting gliders: Gen " + str(nextGliderGen) + ", x = " + str(x) + ", y = " + str(y))
                testForGliderClosenessPattern = convoyUnitWest0[2](-30 + convoyUnitPart2Offset, 16 - convoyUnitPart2Offset)
                testForGliderClosenessPattern += block[0](-31 + convoyUnitPart2Offset, 24 - convoyUnitPart2Offset)
                #this will generate a new glider at (0,0) at gen 160 + convoyUnitPart2Offset * 4
                gensToMakeGlider = 160 + convoyUnitPart2Offset * 4
                testForGliderClosenessPattern += glider[nextGliderGen](x + gensToMakeGlider // 4, y + gensToMakeGlider // 4)

                testForGliderClosenessGoal = convoyUnitWest0[2](-30 + convoyUnitPart2Offset - gensToMakeGlider, 16 - convoyUnitPart2Offset)
                testForGliderClosenessGoal += block[0](-31 + convoyUnitPart2Offset, 24 - convoyUnitPart2Offset)
                testForGliderClosenessGoal += glider[0](-(gensToMakeGlider // 4), -(gensToMakeGlider // 4))
                testForGliderClosenessGoal += glider[nextGliderGen](x - (gensToMakeGlider // 4), y - (gensToMakeGlider // 4))

                if not equals(testForGliderClosenessPattern[gensToMakeGlider * 2], testForGliderClosenessGoal):
                    #glider cannot be placed here, so add position to blacklist
                    gliderPositionBlacklist[nextGliderGen][x].add(y)
    return gliderPositionBlacklist

gliderRelativePositionBlacklist = []

#makes a maximally compacted recipe demonstration, assuming a given blacklist
def makeCompactRecipeWithBlacklist(recipeList, finalParity = -1):
    finalParityIndicator = recipeList[len(recipeList)-1][1] #the parity type (either a positive, a negative, or 0) of the final gliderset
    recipe = block[0](1,-3)
    parities = {}
    if finalParityIndicator != 0 and finalParity != -1:
        parities[abs(finalParityIndicator)] = finalParity if finalParityIndicator > 0 else 1 - finalParity
    recipeCurrentState = recipe
    recipeCurrentGen = 0
    recipeGliders = []
    for i in range(len(recipeList)):
        g.show("Generating salvo: Gliderset " + str(i))
        
        #do we currently know the parity to use
        parityKnown = False
        parity = 0
        if i == len(recipeList) - 1 and finalParity != -1:
            #parity specified by finalParity
            parityKnown = True
            parity = finalParity
        elif abs(recipeList[i][1]) in parities:
            #parity of this glider is already specified
            parityKnown = True
            parity = parities[abs(recipeList[i][1])] if recipeList[i][1] > 0 else 1 - parities[abs(recipeList[i][1])]
            
        #figure out what the interaction should look like
        recipeNextStateTemplate = pattern(recipeCurrentState)
        #minimum distance not touching bounding box
        boundingBox = getminbox(recipeNextStateTemplate)
        diagonalBoundingBoxOffset = max(boundingBox[0] + boundingBox[2] + 32, boundingBox[1] + boundingBox[3] + 32)
        currentParity = (parity + recipeCurrentGen) % 2
        for gliderData in recipeList[i][0]:
            recipeNextStateTemplate += glider[currentParity + gliderData[1]](diagonalBoundingBoxOffset + gliderData[0], diagonalBoundingBoxOffset)
        recipeNextStateTemplate = (recipeNextStateTemplate[512] + recipeNextStateTemplate[513])[0]
        
        gensAdvancedFromTemplatePosition = 0
        #test advancing the new glider's start position to see where it stops matching up
        while True:
            gensAdvancedFromTemplatePosition += 2 if parityKnown else 1
            
            #glider, advanced recipeCurrentGen gens, should be gensAdvancedFromTemplatePosition ahead of the template glider            
            thisGliderSetGen = ((currentParity + gensAdvancedFromTemplatePosition - recipeCurrentGen) % 4 + 4) % 4
            thisGliderSetAdvancement = (currentParity + gensAdvancedFromTemplatePosition - recipeCurrentGen) // 4
            thisGliderSetOffset = -thisGliderSetAdvancement + diagonalBoundingBoxOffset
            
            gliderBlacklisted = False
            for gliderData in recipeList[i][0]:
                thisGliderInGlidersetGen = ((currentParity + gensAdvancedFromTemplatePosition + gliderData[1] - recipeCurrentGen) % 4 + 4) % 4
                thisGliderInGlidersetAdvancement = (currentParity + gensAdvancedFromTemplatePosition + gliderData[1] - recipeCurrentGen) // 4
                thisGliderInGlidersetOffset = -thisGliderInGlidersetAdvancement + diagonalBoundingBoxOffset
                for oldGliderData in recipeGliders:
                    #get modified new glider data for when gliderData is moved to (0,0) and state 0
                    modifiedGliderGen = (thisGliderInGlidersetGen + 4 - oldGliderData[2]) % 4
                    offsetFromGens = 1 if thisGliderInGlidersetGen < oldGliderData[2] else 0
                    
                    modifiedGliderX = thisGliderInGlidersetOffset + gliderData[0] - oldGliderData[0] + offsetFromGens
                    modifiedGliderY = thisGliderInGlidersetOffset - oldGliderData[1] + offsetFromGens
                    if modifiedGliderX in gliderRelativePositionBlacklist[modifiedGliderGen]:
                        if modifiedGliderY in gliderRelativePositionBlacklist[modifiedGliderGen][modifiedGliderX]:
                            gliderBlacklisted = True
                            break
                if gliderBlacklisted:
                    break
            if gliderBlacklisted:
                #this doesn't match, so the previous one is valid
                gensAdvancedFromTemplatePosition -= 2 if parityKnown else 1
                break

            recipeNextStateStart = pattern(recipe)
            for gliderData in recipeList[i][0]:
                recipeNextStateStart += glider[thisGliderSetGen + gliderData[1]](thisGliderSetOffset + gliderData[0], thisGliderSetOffset)

            recipeNextStateStart = recipeNextStateStart[recipeCurrentGen + 512 - gensAdvancedFromTemplatePosition]
            #matches allow for phase shifted versions
            if not equals(recipeNextStateStart[0] + recipeNextStateStart[1], recipeNextStateTemplate):
                #this doesn't match, so the previous one is valid
                gensAdvancedFromTemplatePosition -= 2 if parityKnown else 1
                break

        gliderGen = ((currentParity + gensAdvancedFromTemplatePosition - recipeCurrentGen) % 4 + 4) % 4
        gliderAdvancement = (currentParity + gensAdvancedFromTemplatePosition - recipeCurrentGen) // 4
        gliderOffset = -gliderAdvancement + diagonalBoundingBoxOffset
        for gliderData in recipeList[i][0]:
            recipe += glider[gliderGen + gliderData[1]](gliderOffset + gliderData[0], gliderOffset)
            recipeGliders.append([gliderOffset + gliderData[0] - (gliderGen + gliderData[1]) // 4, gliderOffset - (gliderGen + gliderData[1]) // 4, (gliderGen + gliderData[1]) % 4])

        recipeCurrentState = pattern(recipe[0])
        recipeCurrentGen = 0
        
        while True:
            if equals(recipeCurrentState[0] + recipeCurrentState[1], recipeNextStateTemplate):
                #we have a match
                break
            recipeCurrentGen += 1
            recipeCurrentState = recipeCurrentState[1]

        if recipeList[i][1] != 0 and not abs(recipeList[i][1]) in parities:
            #add new parity specification
            parities[abs(recipeList[i][1])] = gliderGen % 2 if recipeList[i][1] > 0 else 1 - gliderGen % 2
    return recipeGliders

#gets all the slow salvo recipes for a xwss
def getRecipesWithActivationTimes(recipeList, minExtraActivationTime):
    finalParityIndicator = recipeList[len(recipeList)-1][1]
    requireSeparateRecipeForParity = False
    if recipeList[len(recipeList)-1][1] != 0:
        for i in range(len(recipeList) - 1):
            if abs(recipeList[i][1]) == abs(recipeList[len(recipeList)-1][1]):
                requireSeparateRecipeForParity = True
                break
    finalGliderSetSize = len(recipeList[len(recipeList)-1][0])
    output = []
    if requireSeparateRecipeForParity:
        #requires two separate recipes, one for each parity, so things are a bit more complicated
        recipe0 = makeCompactRecipeWithBlacklist(recipeList, 0)
        recipe1 = makeCompactRecipeWithBlacklist(recipeList, 1)
        if recipe0[len(recipe0) - 1][0] < recipe1[len(recipe1) - 1][0] or (recipe0[len(recipe0) - 1][0] == recipe1[len(recipe1) - 1][0] and recipe0[len(recipe0) - 1][2] > recipe1[len(recipe1) - 1][2]):
            #recipe0 glider is faster
            output.append(recipe0)
            if numPhaseTypes >= 2:
                output.append(recipe1)
        else:
            #recipe1 glider is faster
            output.append(recipe1)
            if numPhaseTypes >= 2:
                output.append(recipe0)
        for i in range(2, numPhaseTypes):
            output.append(copy.deepcopy(output[i - 2]))
            for j in range(finalGliderSetSize):
                output[i][len(output[i]) - 1 - j][2] -= 2
                if output[i][len(output[i]) - 1 - j][2] < 0:
                    output[i][len(output[i]) - 1 - j][2] += 4
                    output[i][len(output[i]) - 1 - j][0] += 1
                    output[i][len(output[i]) - 1 - j][1] += 1
    else:
        #simpler case where the same recipe works for both parities
        output.append(makeCompactRecipeWithBlacklist(recipeList))
        for i in range(1, numPhaseTypes):
            output.append(copy.deepcopy(output[i - 1]))
            for j in range(finalGliderSetSize):
                output[i][len(output[i]) - 1 - j][2] -= 1
                if output[i][len(output[i]) - 1 - j][2] < 0:
                    output[i][len(output[i]) - 1 - j][2] += 4
                    output[i][len(output[i]) - 1 - j][0] += 1
                    output[i][len(output[i]) - 1 - j][1] += 1
    #add extra activation time to each salvo if needed
    if minExtraActivationTime > 0:
        newOutput = []
        for i in range(len(output)):
            #draw from (i + minExtraActivationTime) % numPhaseTypes
            newOutput.append(output[(i + minExtraActivationTime) % numPhaseTypes])
            if i + minExtraActivationTime >= numPhaseTypes:
                #move final gliders back the required amount
                for j in range(finalGliderSetSize):
                    numStepsToMoveBack = numPhaseTypes * ((i + minExtraActivationTime) // numPhaseTypes)
                    newOutput[i][len(newOutput[i]) - 1 - j][2] -= numStepsToMoveBack
                    while newOutput[i][len(newOutput[i]) - 1 - j][2] < 0:
                        newOutput[i][len(newOutput[i]) - 1 - j][2] += 4
                        newOutput[i][len(newOutput[i]) - 1 - j][0] += 1
                        newOutput[i][len(newOutput[i]) - 1 - j][1] += 1
        output = newOutput
    #make other-color versions
    for i in range(numPhaseTypes, numPhaseTypes * 2):
        output.append(copy.deepcopy(output[i - numPhaseTypes]))
        for j in range(len(output[i])):
            output[i][j][0] += 1
    return output

#makes a demonstration convoy for a single salvo
def makeConvoySupportingSalvo(recipeList):
    smallConvoy = block[0](51 - 32, -32)
    for i in range(len(recipeList)):
        gliderData = recipeList[i]
        blockX = i * 64 + gliderData[0] - gliderData[1]
        blockY = i * 64 + 8
        smallConvoy += block[0](blockX, blockY)
        convoyX = blockX + 1 + (gliderData[0] - blockX) * 2 + 128 * len(recipeList)
        convoyY = i * 64
        convoyGen = gliderData[2]
        smallConvoy += convoyUnitWest0[convoyGen](convoyX, convoyY)
    return smallConvoy

salvos = []
allGliderList = []
salvoHasGliders = []
indicesInSalvos = []
salvoFirstGliders = []
convoyWest = pattern()
convoyEast = pattern()
inverseConvoyDataWest = []
inverseConvoyDataEast = []
frozenSalvos = []

#makes the data for a convoy capable of supporting a given set of salvos with 8 activation times and 2 colors for each salvo
def makeAllSalvosData(requiredRecipes):
    global salvos
    global allGliderList
    global salvoHasGliders
    global indicesInSalvos
    global salvoFirstGliders
    global convoyWest
    global convoyEast
    global frozenSalvos
    global inverseConvoyDataWest
    global inverseConvoyDataEast
    salvos = []
    for recipeList in requiredRecipes:
        salvos += getRecipesWithActivationTimes(recipeList[0], recipeList[1])
        
    #turn salvos into a suitable ordered set
    allGliderList = []
    salvoHasGliders = []
    indicesInSalvos = []
    salvoFirstGliders = []
    for i in range(len(salvos)):
        indicesInSalvos.append(0)
        salvoHasGliders.append(set())
    while True:
        minSalvo = -1
        minGliderData = []
        for i in range(len(salvos)):
            if indicesInSalvos[i] < len(salvos[i]):
                #salvo still has unregistered gliders
                testGliderData = salvos[i][indicesInSalvos[i]]
                if minSalvo == -1 or (minGliderData[0] + minGliderData[1]) * 4 - minGliderData[2] > (testGliderData[0] + testGliderData[1]) * 4 - testGliderData[2]:
                    minSalvo = i
                    minGliderData = testGliderData
        if minSalvo == -1:
            break
        indicesInSalvos[minSalvo] += 1
        #add the new glider if it's not identical to a prior glider
        gliderIndex = len(allGliderList)
        for i in range(len(allGliderList)):
            if allGliderList[i] == minGliderData:
                gliderIndex = i
                break
        if gliderIndex == len(allGliderList):
            allGliderList.append(minGliderData)
        salvoHasGliders[minSalvo].add(gliderIndex)
    for i in range(len(salvos)):
        for j in range(len(allGliderList)):
            if j in salvoHasGliders[i]:
                salvoFirstGliders.append(j)
                break
    #make convoy and frozen salvoes
    convoyWest = pattern()
    convoyEast = pattern()
    frozenSalvos = []
    for i in range(len(salvos)):
        frozenSalvos.append(pattern())
    for i in range(len(allGliderList)):
        gliderData = allGliderList[i]
        blockX = i * 64 + gliderData[0] - gliderData[1]
        blockY = i * 64 + 8
        for j in range(len(salvos)):
            if i in salvoHasGliders[j]:
                frozenSalvos[j] += block[0](blockX, blockY)

        convoyX = blockX - 1 + (gliderData[0] - blockX) * 2
        convoyY = i * 64
        convoyGen = gliderData[2]
        convoyWest += (convoyUnitWest0 if blockX % 2 == 0 else convoyUnitWest1)[convoyGen](convoyX, convoyY)
        convoyEast += (convoyUnitEast0 if blockX % 2 == 0 else convoyUnitEast1)[convoyGen](convoyX, convoyY)

        #adjust inverse convoy data for later construction
        thingsToAddToInverseConvoyDataWest = copy.deepcopy(convoyUnitDataWest0 if blockX % 2 == 0 else convoyUnitDataWest1)
        thingsToAddToInverseConvoyDataEast = copy.deepcopy(convoyUnitDataEast0 if blockX % 2 == 0 else convoyUnitDataEast1)
        for xWSSData in thingsToAddToInverseConvoyDataWest:
            xWSSData[1] -= convoyX
            xWSSData[2] -= convoyY
            xWSSData[3] += convoyGen
            if xWSSData[3] >= 4:
                xWSSData[3] -= 4
                xWSSData[1] += 2
        for xWSSData in thingsToAddToInverseConvoyDataEast:
            xWSSData[1] -= convoyX
            xWSSData[2] -= convoyY
            xWSSData[3] += convoyGen
            if xWSSData[3] >= 4:
                xWSSData[3] -= 4
                xWSSData[1] += 2
        inverseConvoyDataWest += thingsToAddToInverseConvoyDataWest
        inverseConvoyDataEast += thingsToAddToInverseConvoyDataEast

#makes a demonstration of the convoy and each possible salvo
def demonstrationConvoy():
    convoy = pattern()
    for i in range(len(allGliderList)):
        gliderData = allGliderList[i]
        blockX = i * 64 + gliderData[0] - gliderData[1]
        blockY = i * 64 + 8
        for j in range(len(salvos)):
            convoy += block[0](18 - 128 * len(allGliderList) * j + allGliderList[salvoFirstGliders[j]][0], -33 + allGliderList[salvoFirstGliders[j]][1])
            if i in salvoHasGliders[j]:
                convoy += block[0](blockX - 128 * len(allGliderList) * j, blockY)
        
        convoyX = blockX - 1 + (gliderData[0] - blockX) * 2 + 128 * len(allGliderList)
        convoyY = i * 64
        convoyGen = gliderData[2]
        convoy += convoyUnitWest0[convoyGen](convoyX, convoyY)

    return convoy

#makes data which, when hit by convoys at a given period, produces a certain inverse convoy
#convoyData is in the form:
#  xWSS type: 0 for LWSS, 1 for MWSS, 2 for HWSS
#  xWSS position (x, y) when in base phase
#  xWSS phase (0-3)
totalDataIncludingEmpty = 0
finalSalvoXPos = 0
def makeInverseConvoyData(convoyData, period):
    global totalDataIncludingEmpty
    global finalSalvoXPos
    generation = 0
    totalDataIncludingEmpty = 0
    finalSalvoXPos = 0

    for i in range(len(convoyData)):
        g.show("Making inverse convoy: Adding xWSS data " + str(i+1) + "/" + str(len(convoyData)) + " at "  + str(time() - startTime) + " seconds")
        #Suppose we put salvo(color, phase) at a given targetX, targetY
        #Note that targetX % 2 == targetY % 2
        #The impact point is at targetX - targetY
        #The reader ships will impact at gen (targetY - targetX) * 2 (a multiple of 4)
        #The salvo will impact at gen (targetY - targetX) * 2 - targetY * 4 = (-targetY - targetX) * 2 (a multiple of 4)
        #The ship will be created at (targetX + color, targetY, phase) and travel (period * i) - ((-targetY - targetX) * 2) gens
        #Alternatively, it will be created at (targetX + color, targetY, 0) and travel (period * i) - ((-targetY - targetX) * 2) + phase gens
        #At gen period * i, it will be at:
        # extraGens = (period * i) - ((-targetY - targetX) * 2) + phase
        # ((extraGens // 4) * 2 + targetX + color, targetY, extraGens % 4)
        # ((extraGens // 4) * 2 + targetX + color, targetY, (period * i + phase) % 4)
        # (((period * i + phase) // 4) * 2 + targetX * 2 + targetY + color, targetY, (period * i + phase) % 4)
        # phase = phaseMod4 + 4 * phaseType, where phaseType is either 0 or 1
        # (((period * i + phaseMod4) // 4) * 2 + phaseType * 2 + targetX * 2 + targetY + color, targetY, (period * i + phaseMod4) % 4)

        #Extra spacing to avoid HWSS-LWSS salvo incompatibilities
        #This exception is specific to the particular salvo we're creating
        if period <= 1081 and i > 0 and convoyData[i][0] == 2 and convoyData[i - 1][0] == 0:
            generation += period
            totalDataIncludingEmpty += 1

        #Increment until construction is actually possible
        while True:
            #I know all the logic behind this is explained above but these formulas are still cursed
            targetY = convoyData[i][2]
            color = (convoyData[i][1] - targetY) % 2
            targetXMod2 = targetY % 2
            phaseMod4 = (convoyData[i][3] - generation) % 4
            phaseType = ((convoyData[i][1] - ((generation + phaseMod4) // 4) * 2 - targetXMod2 * 2 - targetY - color) % 4) // 2
            phase = phaseMod4 + 4 * phaseType

            if (7 - phase) >= numPhaseTypes:
                generation += period
                totalDataIncludingEmpty += 1
                continue
            
            targetX = (convoyData[i][1] - ((generation + phase) // 4) * 2 - targetY - color) // 2

            salvoID = convoyData[i][0] * 2 * numPhaseTypes + color * numPhaseTypes + (7 - phase)
            block.put(targetX + color + 51, targetY)
            frozenSalvos[salvoID].put(targetX - targetY, 0)
            if i == len(convoyData) - 1:
                finalSalvoXPos = targetX - targetY

            break

        g.update()

        generation += period
        totalDataIncludingEmpty += 1
    return

#fast stepping from goto.py (thanks to PM 2Ring)
def intbase(n, b):
    # convert integer n >= 0 to a base b digit list (thanks to PM 2Ring)
    digits = []
    while n > 0:
        digits += [n % b]
        n //= b
    return digits or [0]
# actual fast stepping for this case by Tom Rokicki -- the old fastStep() is very often much slower than just sticking with one step size.
def fastStep(steps):
    b = g.getbase()
    t = steps
    sc = 0
    st = 1
    while t % b == 0:
       t //= b
       sc += 1
       st *= b
    g.setstep(sc);
    t = 0
    while t < steps:
       g.step()
       t += st

#fill in the convoys
def runConvoys(numConvoys, period, convoyIsWest):
    #1024: (-89):423:935, -105
    #1000: (-89):411:911, -105
    convoyXPos = (128 * len(allGliderList)) + (- 128 * len(allGliderList)) % (2 * period)
    #TODO: I should probably verify that this position actually always works
    #The actual conditions: east edge of convoy < finalSalvoXPos and west edge < finalBlockXPos
    convoyDeleteXPos = finalSalvoXPos + (-finalSalvoXPos) % (2 * period) - 4 * period
    for i in range(numConvoys):
        g.show("Adding convoy " + str(i+1) +"/" + str(numConvoys) + " at "  + str(time() - startTime) + " seconds")
        (convoyWest if convoyIsWest else convoyEast).put(convoyXPos, 0)

        fastStep(period)

        #clear out the excess spaceships
        g.putcells((convoyEast if convoyIsWest else convoyWest), -18 + period * 2, -121, -1, 0, 0, -1, "not")
        #also clear out used convoys
        g.putcells((convoyWest if convoyIsWest else convoyEast), convoyDeleteXPos, 0, 1, 0, 0, 1, "not")
        g.update()

    (convoyWest if convoyIsWest else convoyEast).put(convoyXPos, 0)

def makeOscillator(period):
    oldStep = g.getstep()

    makeInverseConvoyData(inverseConvoyDataWest, period)
    runConvoys(totalDataIncludingEmpty + 62, period, False)
    eastHalf = g.getcells(g.getrect())
    g.new("P" + str(goalPeriod) + " Strictly Volatile Loop")
    makeInverseConvoyData(inverseConvoyDataEast, period)
    runConvoys(totalDataIncludingEmpty + 62, period, True)

    #Connect the two halves
    convoyXPos = (128 * len(allGliderList)) + (- 128 * len(allGliderList)) % (2 * period)
    g.putcells(eastHalf, -18 + period * 2 + convoyXPos, -121, -1, 0, 0, -1, "or")
    del eastHalf
    
    #Arrange four copies so that ships annihilate, and step a bit to make it an oscillator
    boundingRect = g.getrect()
    singleLoop = g.getcells(boundingRect)
    g.new("P" + str(goalPeriod) + " Strictly Volatile Loop")
    xOffset = -boundingRect[0] - (boundingRect[2] // 2)
    yOffset = -boundingRect[1] - (boundingRect[2] // 2) - boundingRect[3]
    xOffset -= xOffset % 2
    yOffset -= yOffset % 2
    g.putcells(singleLoop, xOffset, yOffset, 1, 0, 0, 1, "or")
    g.putcells(singleLoop, -xOffset, -yOffset, -1, 0, 0, -1, "or")
    g.putcells(singleLoop, yOffset, xOffset, 0, 1, 1, 0, "or")
    g.putcells(singleLoop, -yOffset, -xOffset, 0, -1, -1, 0, "or")
    del singleLoop
    fastStep(convoyXPos * 3)
    
    g.setstep(oldStep)
    g.setgen("0")
    g.select([])
    g.fit()
    g.show("Finished at " + str(time() - startTime) + " seconds")

gliderRelativePositionBlacklist = gliderLocationsTooClose(30)
makeAllSalvosData([[lwssRecipe, 0], [mwssRecipe, 10], [hwssRecipeHighClearance, 0]])
makeOscillator(goalPeriod)
EDIT: Fixed a bug where the streams weren't fully filling out for lower periods, and another bug where the quadrants were sometimes placed too close to one another. Also now includes faster stepping from Tom Rokicki.
Last edited by glider_rider on December 5th, 2022, 2:20 am, edited 4 times in total.
Nico Brown

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

Re: Oscillator Discussion Thread

Post by dvgrn » December 3rd, 2022, 10:06 pm

glider_rider wrote:
December 3rd, 2022, 4:28 pm
The p1024 was a lot faster, I don't remember the exact time but with 4GB allotted it was more on the order of hours than days. The HashLife friendliness of p1024 helps a lot.
Here's another question. The *WSS salvo that produces gliders has three extra *WSSes (I think) that don't contribute to the block-reading mechanism:

Code: Select all

x = 211, y = 211, rule = LifeSuper
180.pA$178.pA3.pA$177.pA$177.pA4.pA22.2M$177.5pA22.2M.4M$205.6M$206.
4M2$193.M$191.M3.M$190.M$190.M4.M$190.5M4$180.M2.M$179.M$179.M3.M$
179.4M7$148.2pA40.2M$130.3M14.4pA37.M4.M$129.5M12.2pA.2pA36.M$119.6M
3.2M.3M13.2pA38.M5.M$119.M5.M3.2M56.6M$119.M$120.M4.M$122.2M2$112.2M$
112.2M4$118.5M$118.M4.M$118.M$119.M3.M28.2M$121.M28.M4.M$141.M7.M$
128.2M9.M3.M5.M5.M$127.2M.3M5.M10.6M16.pA2.pA$128.5M5.M4.M26.pA$129.
3M6.5M27.pA3.pA$170.4pA62$35.2M$35.2M5$40.3M$29.3M8.M2.M$29.M2.M7.M$
29.M10.M3.M$29.M3.M6.M$29.M3.M7.M.M$29.M$30.M.M2$47.M$29.M16.3M$28.3M
15.M.2M$27.2M.M16.3M$27.3M17.3M$27.3M17.2M$28.2M5$47.3M$46.M2.M$49.M$
45.M3.M$49.M$46.M.M3$28.pA$27.3pA$26.2pA.pA$26.3pA16.3M$27.2pA15.M2.M
$47.M$43.M3.M$43.M3.M$47.M$44.M.M15$48.3pA$47.pA2.pA$50.pA$50.pA$47.pA
.pA3$2.3pA$.pA2.pA$4.pA12.3M$pA3.pA11.M2.M$4.pA14.M$.pA.pA15.M$16.M.M
4$28.3M$27.M2.M$30.M$10.3M13.M3.M$9.M2.M13.M3.M$12.M17.M$8.M3.M14.M.M
$12.M$9.M.M9$4.M$3.3M$3.M.2M$4.3M$4.3M$4.3M$4.2M!
Back in the design stage for this oscillator, did you look into the idea of adding *WSSes like the ones in the original Caterloopillar instead -- ones that destroy a target and rebuild it, while also producing extra junk or gliders or whatever that destroy the block-reading *WSSes?

If something like that could be found, then just one of these speed-0 Caterloopillars could be made into an oscillator instead of a super-shotgun.

User avatar
glider_rider
Posts: 160
Joined: February 20th, 2013, 5:41 pm
Location: CA

Re: Oscillator Discussion Thread

Post by glider_rider » December 3rd, 2022, 11:12 pm

dvgrn wrote:
December 3rd, 2022, 10:06 pm
glider_rider wrote:
December 3rd, 2022, 4:28 pm
The p1024 was a lot faster, I don't remember the exact time but with 4GB allotted it was more on the order of hours than days. The HashLife friendliness of p1024 helps a lot.
Here's another question. The *WSS salvo that produces gliders has three extra *WSSes (I think) that don't contribute to the block-reading mechanism:

Code: Select all

x = 211, y = 211, rule = LifeSuper
180.pA$178.pA3.pA$177.pA$177.pA4.pA22.2M$177.5pA22.2M.4M$205.6M$206.
4M2$193.M$191.M3.M$190.M$190.M4.M$190.5M4$180.M2.M$179.M$179.M3.M$
179.4M7$148.2pA40.2M$130.3M14.4pA37.M4.M$129.5M12.2pA.2pA36.M$119.6M
3.2M.3M13.2pA38.M5.M$119.M5.M3.2M56.6M$119.M$120.M4.M$122.2M2$112.2M$
112.2M4$118.5M$118.M4.M$118.M$119.M3.M28.2M$121.M28.M4.M$141.M7.M$
128.2M9.M3.M5.M5.M$127.2M.3M5.M10.6M16.pA2.pA$128.5M5.M4.M26.pA$129.
3M6.5M27.pA3.pA$170.4pA62$35.2M$35.2M5$40.3M$29.3M8.M2.M$29.M2.M7.M$
29.M10.M3.M$29.M3.M6.M$29.M3.M7.M.M$29.M$30.M.M2$47.M$29.M16.3M$28.3M
15.M.2M$27.2M.M16.3M$27.3M17.3M$27.3M17.2M$28.2M5$47.3M$46.M2.M$49.M$
45.M3.M$49.M$46.M.M3$28.pA$27.3pA$26.2pA.pA$26.3pA16.3M$27.2pA15.M2.M
$47.M$43.M3.M$43.M3.M$47.M$44.M.M15$48.3pA$47.pA2.pA$50.pA$50.pA$47.pA
.pA3$2.3pA$.pA2.pA$4.pA12.3M$pA3.pA11.M2.M$4.pA14.M$.pA.pA15.M$16.M.M
4$28.3M$27.M2.M$30.M$10.3M13.M3.M$9.M2.M13.M3.M$12.M17.M$8.M3.M14.M.M
$12.M$9.M.M9$4.M$3.3M$3.M.2M$4.3M$4.3M$4.3M$4.2M!
Back in the design stage for this oscillator, did you look into the idea of adding *WSSes like the ones in the original Caterloopillar instead -- ones that destroy a target and rebuild it, while also producing extra junk or gliders or whatever that destroy the block-reading *WSSes?

If something like that could be found, then just one of these speed-0 Caterloopillars could be made into an oscillator instead of a super-shotgun.
While I didn't really consider that idea for terminating the convoys, I did consider ways to make just one loop into an oscillator, though. The main idea I had for this sort of design was to, after all the eastward xWSSes were created, have the convoys create SW-directed gliders positioned so as to shoot down the convoys. Basically arranged like this:

Code: Select all

x = 55, y = 36, rule = B3/S23
26b2o$26b2o5$21bo$20bo12b3o$20b3o10bo$34bo4$28b2o$28b2o2$11bo13bo$10bo
13bo8b3o7b3o$10b3o11b3o6bo9bo$34bo9bo4$21bo2bo6bo2bo6bo2bo6bo2bo$20bo
9bo9bo9bo$20bo3bo5bo3bo5bo3bo5bo3bo$bo18b4o6b4o6b4o6b4o$o$3o$37b2o8b2o
$37b2o8b2o2$bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo$o9bo9bo9bo9bo9bo$o3bo
5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo$4o6b4o6b4o6b4o6b4o6b4o!
I decided not to go with this approach because a. it would be more work, and b. it'd be much more absolutely massive.
Nico Brown

User avatar
C_R_116
Posts: 470
Joined: April 15th, 2021, 2:49 pm
Location: At my home doing other random stuff.

Re: Oscillator Discussion Thread

Post by C_R_116 » December 4th, 2022, 12:50 am

I tried to find an obo sparker. Accidentally discovered a statorless p4 oscillator with a weak domino.

Code: Select all

x = 14, y = 8, rule = B3/S23
$4bobo2bob3o$3bo2bobobobo$3bo$10bo$bobobobo2bo$3obo2bobo!
By: C.R. Hilton, currently working on another cool spaceship.

User avatar
yujh
Posts: 3066
Joined: February 27th, 2020, 11:23 pm
Location: I'm not sure where I am, so please tell me if you know
Contact:

Re: Oscillator Discussion Thread

Post by yujh » December 4th, 2022, 1:50 am

C_R_116 wrote:
December 4th, 2022, 12:50 am
I tried to find an obo sparker. Accidentally discovered a statorless p4 oscillator with a weak domino.

Code: Select all

x = 14, y = 8, rule = B3/S23
$4bobo2bob3o$3bo2bobobobo$3bo$10bo$bobobobo2bo$3obo2bobo!
Known as 24P4.1.

User avatar
83bismuth38
Posts: 556
Joined: March 2nd, 2017, 4:23 pm
Location: perpendicular to your eyes
Contact:

Re: Oscillator Discussion Thread

Post by 83bismuth38 » December 5th, 2022, 5:48 pm

9 cell thin p4 domino sparker. very weird mazing catalyst in the back, same one that caterer can pull off!

Code: Select all

x = 20, y = 9, rule = B3/S23
9bo$2b3o2bo2bo4bo$3b2obo2bo4bobo$3bo4b3o$2b2o2bo2bobob2o3bo$o2bo2b2obo
bobo5bo$o3bobo2bobo4bobo$2bo3bo2bobo3b2o$4b2o4bo!
edited because of mistake, it's 9 cells not 8
Last edited by 83bismuth38 on December 6th, 2022, 2:52 pm, edited 1 time in total.
looking to support hive five (n+18) and charity's oboo reaction (2n+18)

Code: Select all

x = 28, y = 13, rule = B3/S23
19bo$3bo15bo4b2o$2bobo14bo4bobo$2bobo20b2o$3bo11b3o2$25b3o$b2o22b3o$o
2bo$b2o12b2o$10b2o2bobo$bo8b2o2b2o$obo7b2o!

User avatar
Period1GliderGun
Posts: 713
Joined: March 9th, 2022, 1:50 am
Location: Everywhere you look
Contact:

Re: Oscillator Discussion Thread

Post by Period1GliderGun » December 5th, 2022, 6:56 pm

83bismuth38 wrote:
December 5th, 2022, 5:48 pm
8 cell thin p4 domino sparker. very weird mazing catalyst in the back, same one that caterer can pull off!

Code: Select all

x = 20, y = 9, rule = B3/S23
9bo$2b3o2bo2bo4bo$3b2obo2bo4bobo$3bo4b3o$2b2o2bo2bobob2o3bo$o2bo2b2obo
bobo5bo$o3bobo2bobo4bobo$2bo3bo2bobo3b2o$4b2o4bo!
Isn't that 9 cells thick? Or am I getting my classifications wrong again?
It's OK to abbreviate my username to "P1GG," but never, never, call me "pig."

Code: Select all

x = 36, y = 9, rule = B3/S23
23bobo$21bo3bo$13bo7bo$12b4o4bo4bo8b2o$11b2obobo4bo12b2o$2o8b3obo2bo3b
o3bo$2o9b2obobo6bobo$12b4o$13bo!
[[ STEP 30 ]]

User avatar
C28
Posts: 724
Joined: December 8th, 2020, 12:23 pm
Location: WORLD -1

Re: Oscillator Discussion Thread

Post by C28 » December 5th, 2022, 7:57 pm

83bismuth38 wrote:
December 5th, 2022, 5:48 pm
...same one that caterer can pull off...
wait, a caterer can act as a catalyst?
- Christopher D'Agostino

adopted father of the U-turner

Code: Select all

x = 11, y = 15, rule = B3/S23
9bo$8bobo$8bobo$9bo8$b3o$b3o$obo$2o!
the U-turner gallery
255P132
B3/S234z (Zlife)

User avatar
83bismuth38
Posts: 556
Joined: March 2nd, 2017, 4:23 pm
Location: perpendicular to your eyes
Contact:

Re: Oscillator Discussion Thread

Post by 83bismuth38 » December 6th, 2022, 10:40 pm

C28 wrote:
December 5th, 2022, 7:57 pm
83bismuth38 wrote:
December 5th, 2022, 5:48 pm
...same one that caterer can pull off...
wait, a caterer can act as a catalyst?
yes it can, weakly:

Code: Select all

x = 10, y = 40, rule = B3/S23
6b2obo$2bob4o$3o2bobo2$2b2o$3bo3$6b2o$2bob4o$3o2bobobo2$2b2o$3bo3$6b2o
bo$2bob4obo$3o2bobo2$2b2o$3bo3$6b2o$2bob4obo$3o2bobobo2$2b2o$3bo3$8bo
2$6b2o$2bob4o$3o2bobobo2$2b2o$3bo!


reduced p57 from 210 cells to 200 with semi-rigorous use of wls

Code: Select all

x = 33, y = 61, rule = B3/S23
13bo$13bo$13bo$12b2o2$11bobo3b2o$10bo5bobo$11bo2b3o$17bo$8b2o2bob2obo$
8bo2b2obobo$9b3obo$10bo2bob4o$9b2o2bobo2bo$6b2o3bo$6b3ob2o$6bo3b2o2b2o
bo$10b5ob2o2b2o$22bo$b2o16bo$2bo16bo3bo$2bobo14bo3b4o$3b2o16bo2$2o$o2b
o$bo7bo$2bo2bo3b2o$5bo4b2o$6bo4bo$5b2o19b2o$21bo4bo$21b2o4bo$22b2o3bo
2bo$23bo7bo$29bo2bo$31b2o2$11bo16b2o$6b4o3bo14bobo$9bo3bo16bo$13bo16b
2o$10bo$11b2o2b2ob5o$15bob2o2b2o3bo$21b2ob3o$21bo3b2o$14bo2bobo2b2o$
14b4obo2bo$19bob3o$16bobob2o2bo$15bob2obo2b2o$15bo$16b3o2bo$14bobo5bo$
14b2o3bobo2$19b2o$19bo$19bo$19bo!
the sparker in question:

Code: Select all

x = 14, y = 18, rule = B3/S23
5b3o$b2ob3obo$bob2o7bo$6bo2b2o2bo$6b2o4bo$o2bo2b4o$4obo$5bo3bo$2bobo5b
o$bob2ob2ob2o$bo3bo$2b2o$obobob3o$2o$5bo$5b2o$4b2o$4b3o!
edit: reduced to 196 cells via reduced sparker (60 cells)

Code: Select all

x = 18, y = 14, rule = B3/S23
5b2o$b2o2bo2b2o$bo4bobo2b2o$2bo2b2o2bobo$b2o5b2o2bo3b2o$2o4b2o2bo3b4o$
2ob3o3bo2bo2bobo$o3b2o3bo2bo$bo3bo6bo$3bobobobo$3bo4b2o2$2bobo$3bo!
editer: 53 cells, probably minimal for this width

Code: Select all

x = 16, y = 14, rule = B3/S23
9b2o$2b2o4bo2bo$2bo2b2o2bobo$3bobob2obob2o$bobo4bobobo2bo$4bo2b4o3b2o$
o2b3obo3bo$bob2obo3b2o$5bo$3bo$3bo$2bo2b3o$3b2ob3o$8bo!

alternative to 30p3 with higher clearance. only 34 cells too, and it kinda looks like a mustached man in this orientation:

Code: Select all

x = 14, y = 12, rule = B3/S23
3b2o$3b2o$10b2o$b4o5b2o$o3bo$obo7b4o$9bo3bo$bo2b2o3bobo$2b4o$4bo3bo2bo
$7b4o$7b2o!
reduces an lcm, noticed by inomed

Code: Select all

x = 34, y = 27, rule = B3/S23
bo12bo$b3o8b3o$4bo6bo$3b2o6b2o5$22b2o$5b3o14bo$8bo11bobo$5bo2bo11b2o$
6b2o19b2o$28bo$16b2o10bob2o$2b2o11bo2bo4b4obob2o$bobo11bo11bo$bo14b3o
5bo$2o20bobo2$24bobo$24bo4b2ob2o$30bob2o$11b2o6b2o4b2o3bo$12bo6bo7b2ob
o$9b3o8b3o6bo$9bo12bo!
not a reduction but it also works here

Code: Select all

x = 47, y = 70, rule = B3/S23
13b2o$13b2o4$13b3o$13bo2bo$12bo3bo$13bo2bo2bo$9b2o2bobo2bobo$8bo2bo6bo
bo$9b2o8bo$22bo$6b3o11b2ob2o3b2o$5bo3bo14bo3b2o$2o3bo14bo3bo$2o3b2ob2o
11b3o$7bo$10bo8b2o$9bobo6bo2bo$9bobo2bobo2b2o$10bo2bo2bo$13bo3bo$13bo
2bo11bo5b2o$14b3o9b3o6bo$25bo5bobobob2o$25b2o3bo4bob2o$30bo2b2o$15b2o
6bo5b3o$15b2o6bo5b2o$22bobo$23bo8b2o$23bo7b3o2b2ob2o$10b2o20bo4bob2o$
9bo3bo18bo2bobo$9bobo2bo18bo3bo$6b2obo4bo20b2o$6b2ob2o2b3o7bo$13b2o8bo
$22bobo$16b2o5bo6b2o$15b3o5bo6b2o$12b2o2bo$8b2obo4bo3b2o$8b2obobobo5bo
$11bo6b3o9b3o$11b2o5bo11bo2bo$29bo3bo$30bo2bo2bo$26b2o2bobo2bobo$25bo
2bo6bobo$26b2o8bo$39bo$23b3o11b2ob2o3b2o$22bo3bo14bo3b2o$17b2o3bo14bo
3bo$17b2o3b2ob2o11b3o$24bo$27bo8b2o$26bobo6bo2bo$26bobo2bobo2b2o$27bo
2bo2bo$30bo3bo$30bo2bo$31b3o4$32b2o$32b2o!
Last edited by 83bismuth38 on December 7th, 2022, 6:03 pm, edited 1 time in total.
looking to support hive five (n+18) and charity's oboo reaction (2n+18)

Code: Select all

x = 28, y = 13, rule = B3/S23
19bo$3bo15bo4b2o$2bobo14bo4bobo$2bobo20b2o$3bo11b3o2$25b3o$b2o22b3o$o
2bo$b2o12b2o$10b2o2bobo$bo8b2o2b2o$obo7b2o!

User avatar
iNoMed
Moderator
Posts: 607
Joined: August 29th, 2020, 3:05 pm
Location: Scotland

Re: Oscillator Discussion Thread

Post by iNoMed » December 7th, 2022, 4:42 am

here's a 64-cell P10 blob-like oscillator, found by Open Science Grid earlier today in the H4_+1 symmetry:

Code: Select all

x = 13, y = 25, rule = B3/S23
2b2o5b2o$2bo7bo3$2b2o5b2o$5bobo$3bo5bo$6bo$o2b2o3b2o2bo$o3bobobo3bo$o
4b3o4bo$6bo2$6bo$o4b3o4bo$o3bobobo3bo$o2b2o3b2o2bo$6bo$3bo5bo$5bobo$2b
2o5b2o3$2bo7bo$2b2o5b2o!
And here's a 58-cell momomer by me, at the expense of a bulkier bounding box (23x20 = 490 versus 15x25 = 375):

Code: Select all

x = 19, y = 22, rule = B3/S23
8b2o5b2o$8bo7bo3$8b2o5b2o$11bobo$9bo5bo$12bo$6bo2b2o3b2o2bo$6bo3bobobo
3bo$6bo4b3o4bo$12bo2$7b4o$10b2o$3bo8bo$b3o6bobo2$obo6b3o$o8bo$b2o$2b4o
!
Edit: and here's a miscellaneous 70-cell version supported by a custom P2, as requested by HDP in an attempt to try and prove a P2 stabilisation impossible:

Code: Select all

x = 13, y = 24, rule = B3/S23
2b2o5b2o$2bo7bo3$2b2o5b2o$5bobo$3bo5bo$6bo$o2b2o3b2o2bo$o3bobobo3bo$o
4b3o4bo$6bo2$bo3bo3bo$obobob2obo$b2obob3obo$3bo4bo$3b2o2bo$b2obobo$2bo
bo3bo$2bob4o$3bo4bo$4bobo$6bo!
Edit 2: Reduced to 53 cells using a much smaller p2:

Code: Select all

x = 14, y = 19, rule = B3/S23
3b2o5b2o$3bo7bo3$3b2o5b2o$6bobo$4bo5bo$7bo$bo2b2o3b2o2bo$bo3bobobo3bo$
bo4b3o4bo$7bo2$4bo3bo$2bobobobobo$o5bo5bo$o5bo5bo$obobo3bobobo$2bo7bo!

Code: Select all

x = 35, y = 5, rule = B3/S23
4b2o3b2o3bo3b2ob2o3b2ob2o$2o2bobo3bo2bobobobobobobobobobo$obobo2bo2bob
o2bobo2bo2bobo3bobo$2bobo3bobobobo2bo5bobo3bobob2o$b2ob2o3b2ob2o3b2o3b
2ob2o3b2ob2o!

User avatar
JP21
Posts: 1870
Joined: October 26th, 2019, 5:39 am
Location: PH

Re: Oscillator Discussion Thread

Post by JP21 » December 7th, 2022, 8:58 am

P24 honey farm hassler, using a catalyst that I took from elsewhere

Code: Select all

x = 21, y = 33, rule = B3/S23
12bo$6b2o3bobo$7bo3bo2bo$7bob2obobo$8bobobobob2o$12bobo2bo$11b2o2bo$
11bobob2o$12b2obo2bo$17b2o2$2o$bo$bobo$2b2o5b2o$9b2o2$10b2o$10b2o5b2o$
17bobo$19bo$19b2o2$2b2o$2bo2bob2o$4b2obobo$5bo2b2o$3bo2bobo$3b2obobobo
bo$6bobob2obo$6bo2bo3bo$7bobo3b2o$8bo!

User avatar
JP21
Posts: 1870
Joined: October 26th, 2019, 5:39 am
Location: PH

Re: Oscillator Discussion Thread

Post by JP21 » December 8th, 2022, 4:05 am

This is a reduction to the p4 bouncer:

Code: Select all

x = 29, y = 21, rule = B3/S23
13bo$14bo$2b2o8b3o5b2o$bobo16bobo$bobob2o2b2o12bo$2bobobo2b2o2b2o3bo2b
2obo2b2o$4bo8bobobo4bobo3bo$3bo2bo7bo3bobobo2b3o$3bo5bo9bo2bo$3bo7bo7b
2obo2bo$3bo4b2o12bob2o$4bobo2b3ob5o2bobo2b2o$2bobobo4b3o3bo3bo3bob2o$b
ob2obobobo3b3o4bobo$bo5b3obobo11b2o$2o8bob2ob2o5b3o$7b2o2bo4bo3bo3bo$
8bobo2b3o4bo2b2obo$8bo2b2o8bobobobo$9b2o2bo9bo2bo$12b2o8b2o!
(cross-posted from the post I made yesterday)

User avatar
Period1GliderGun
Posts: 713
Joined: March 9th, 2022, 1:50 am
Location: Everywhere you look
Contact:

Re: Oscillator Discussion Thread

Post by Period1GliderGun » December 8th, 2022, 5:16 pm

P6:

Code: Select all

x = 16, y = 16, rule = B3/S23
4bo6bo$3bobo4bobo$3bob2o2b2obo$b2o2bo4bo2b2o$o14bo$b3o8b3o$2bo10bo$7b2o$7b2o$
2bo10bo$b3o8b3o$o14bo$b2o2bo4bo2b2o$3bob2o2b2obo$3bobo4bobo$4bo6bo!
I don't have access to jslife, so apologies if this is known.

EDIT: Nevermind, it's in the census for B3S23/D8_4.
It's OK to abbreviate my username to "P1GG," but never, never, call me "pig."

Code: Select all

x = 36, y = 9, rule = B3/S23
23bobo$21bo3bo$13bo7bo$12b4o4bo4bo8b2o$11b2obobo4bo12b2o$2o8b3obo2bo3b
o3bo$2o9b2obobo6bobo$12b4o$13bo!
[[ STEP 30 ]]

Book
Posts: 385
Joined: August 28th, 2021, 2:38 pm
Location: California
Contact:

Re: Oscillator Discussion Thread

Post by Book » December 8th, 2022, 5:56 pm

Period1GliderGun wrote:
December 8th, 2022, 5:16 pm
I don't have access to jslife, so apologies if this is known.
Not sure why you cannot access jslife, but perhaps this will help: https://golhobby.com/patman/patman.htm ... 2012-12-30
Phil Bookman

User avatar
C_R_116
Posts: 470
Joined: April 15th, 2021, 2:49 pm
Location: At my home doing other random stuff.

Re: Oscillator Discussion Thread

Post by C_R_116 » December 10th, 2022, 12:31 am

Does anyone know about this P8 Glider Shuttle?

Code: Select all

x = 22, y = 25, rule = B3/S23
15b2o2$14bo3bo$13bo4bo$12bobobo$11bobobo$9bo4bo$2o7bo3bo$2obo$4bo6b2o$
bo$2bob2o4bo$4b2o2bobo4b3o$9b2o3bo$14bo3bo$14bo2bobo$16bobo2bo$8bo8bo
3bo$7bobo11bo$6bo3bo7b3o$5bo3bo$4bo3bo$3bo3bo$4bobo$5bo!
I tried looking for it on JSLife, but I've come to no success.

EDIT: P7 Bullet Heptomino Hassler (Also searched but found no result.)

Code: Select all

x = 22, y = 19, rule = B3/S23
11bo$11bo$10bobo$10bobo$10bobo3$7bob4obo$6bo8bo$6bo8bo$2bo4bob4obo4bo$
bobo14bobo$3bo14bo$2b2o14b2o$o2bobo10bobo2bo$2obobobo6bobobob2o$3bo2b
2o6b2o2bo$2obo14bob2o$obo16bobo!
By: C.R. Hilton, currently working on another cool spaceship.

Bullet51
Posts: 663
Joined: July 21st, 2014, 4:35 am

Re: Oscillator Discussion Thread

Post by Bullet51 » December 11th, 2022, 5:28 am

C_R_116 wrote:
December 10th, 2022, 12:31 am

EDIT: P7 Bullet Heptomino Hassler (Also searched but found no result.)

Code: Select all

x = 22, y = 19, rule = B3/S23
11bo$11bo$10bobo$10bobo$10bobo3$7bob4obo$6bo8bo$6bo8bo$2bo4bob4obo4bo$
bobo14bobo$3bo14bo$2b2o14b2o$o2bobo10bobo2bo$2obobobo6bobobob2o$3bo2b
2o6b2o2bo$2obo14bob2o$obo16bobo!
Known.
Still drifting.

mvr
Posts: 53
Joined: November 8th, 2009, 4:58 am

Re: Oscillator Discussion Thread

Post by mvr » December 13th, 2022, 1:31 am

p61 Pi hassler

Code: Select all

x = 49, y = 42, rule = B3/S23
17b2o$18bo$17bo$17b4o$20bo$15b3o$4b2o8bo2bo$4bobo2b2o3b2o$bo4bo3bo$b5o
b3o$5bobo$b3obobo$o2bob2o$2o2$19b2o$4b2o12bobo22bo$4b2o11b2o22b3o$18bo
bo19bo$19b2o19b2o3$7b2o19b2o$8bo19bobo$5b3o22b2o11b2o$5bo22bobo12b2o$
28b2o2$47b2o$42b2obo2bo$41bobob3o$41bobo$39b3ob5o$38bo3bo4bo$33b2o3b2o
2bobo$31bo2bo8b2o$31b3o$28bo$28b4o$31bo$30bo$30b2o!

User avatar
Period1GliderGun
Posts: 713
Joined: March 9th, 2022, 1:50 am
Location: Everywhere you look
Contact:

Re: Oscillator Discussion Thread

Post by Period1GliderGun » December 13th, 2022, 1:05 pm

mvr wrote:
December 13th, 2022, 1:31 am
p61 Pi hassler

Code: Select all

p61 pi hassler
Nontrivial p488:

Code: Select all

x = 49, y = 42, rule = B3/S23
17b2o$18bo$17bo$17b4o$20bo$15b3o$4b2o8bo2bo$4bobo2b2o3b2o21b2o$bo4bo3b
o26b2o$b5ob3o$5bobo30bo$b3obobo29bobo$o2bob2o29bo2bo$2o33bo2bo2$19b2o
14bo2bo$4b2o12bobo16b2o4bo$4b2o11b2o22b3o$18bobo19bo$19b2o19b2o3$7b2o
19b2o$8bo19bobo$5b3o22b2o11b2o$5bo22bobo12b2o$28b2o2$47b2o$42b2obo2bo
$41bobob3o$41bobo$39b3ob5o$38bo3bo4bo$33b2o3b2o2bobo$31bo2bo8b2o$31b3o
$28bo$28b4o$31bo$30bo$30b2o!
It's OK to abbreviate my username to "P1GG," but never, never, call me "pig."

Code: Select all

x = 36, y = 9, rule = B3/S23
23bobo$21bo3bo$13bo7bo$12b4o4bo4bo8b2o$11b2obobo4bo12b2o$2o8b3obo2bo3b
o3bo$2o9b2obobo6bobo$12b4o$13bo!
[[ STEP 30 ]]

User avatar
C28
Posts: 724
Joined: December 8th, 2020, 12:23 pm
Location: WORLD -1

Re: Oscillator Discussion Thread

Post by C28 » December 14th, 2022, 3:42 pm

variation of 387P132 using only p4 sparkers

Code: Select all

x = 76, y = 76, rule = B3/S23
25b2o$26bo$24bo11b2o$24b2o2b2o6bobo$27bo2bo2b2obobo$24b2obo2bo2bobobo
$24bobo2bo5bo$27b2ob5obo$25b2o2bobo4bo$24bo2b2o2bo4b2o$25b2o2bo2b3obo
$27b2o4b2obo$25b2o2b3o2bob2o$26bobo$26bo2bo4b4o$24b2obobob4o2bo9bo$24b
o2bobo4bobo8b3o$26bobob2o12bo$25b2o3b4obo3b2o4bo$24bo2bo5b2o4b2o5bo$24b
2obo2bobo2bo6b3obo$27bo6b2o4bobob2o$27bo3b2o2bo4bob2o$28bobo4b2o$25bo
bo7b2o5bo7bo4b2o2b2o5bo2b2ob2o$24b3o2b4o8b3o5b2o4bobo2bo2bobobo2bobo2b
o$24b2ob6ob3o13bo6b2o2b3obobobo4b2o$48bo7bo2b2o3bobobob2o$15b2o33bob4o
bo4bobo3bo3bo$16bo2b2o22bo6bob4o3b3obob2obo3bo$16bobo2bo20bobo4bo2bo2b
4o4bo6b2o$17bob2obo21bo5bo6bo2b3o2b3ob2o$19bo2b4o12b2o2bo6bo3b3o5b2o5b
obo$20bob5o11b3o8bo3b2ob2o4b2o2bobob2o$19bo3b3o13b2o13bobo2b2o2b2obob
o2bo$18b3o28b3o2bo2b3obo7b2o$18b3o21b3o5b2obo5bobob6o2b3o$3b2o37b3o15b
2obo2bo3bo2bo$2bo2bo3bo2bob2o25bobo12bo14b2o$2b3o2b6obo6bo2bo16b2o13b
o$5b2o7bob2ob3o2bob2o26bobo$4bo2bo2bob3ob2o3bobobo24bo2b2obo$4b2ob3o2b
o4b2o2bo3b2o21b3o2b2o$7bo2bo3b2o5bo3b2o23bo$7bobobo10b2o3bo26b2o2bo$4b
2o6bobo3b2o7bo26bo2bobo$3bob2ob3obob3obo8bo27b2o2bo$3bobobobobobo3bo2b
5ob2o17b2o12b2o$4b2obobobo3b2o2b6obo14bob6o$2o4bobobob3o2b2o4bo8b3o5b
o4bob2o$o2bobo2bobobo2bo2bobo3bo14bo3bo5b3o$2b2ob2o2bo5b2o2b2o3bobo4b
o3bo4bo2bo3bo2bo$40bo5bo3bo$31bo2bo9bobo$30bo2b2o4b5o2bo$29bobobo2bo5b
o3bo3b2o$29bob3o3bo3bo3bo2bo2bo$30bobobobo3bobo2b3ob2o$31bo8bobo2bobo
bo$28b3o8b2o5bobo2bo$28bo9bo5bobobob2o$38b4o2b3o2bo$44bo2bobo$38b2ob2o
2b2o2b2o$39bobob2o2b2o$39bo2b3obo2b2o$38b2ob2o3bobo2bo$39bo4bobo2b2o$
39bob3ob4o$40bo3bo4bobo$38bobobo2bo2bob2o$37bobob2o2bo2bo$37bobo6b2o2b
2o$38b2o11bo$49bo$49b2o!
- Christopher D'Agostino

adopted father of the U-turner

Code: Select all

x = 11, y = 15, rule = B3/S23
9bo$8bobo$8bobo$9bo8$b3o$b3o$obo$2o!
the U-turner gallery
255P132
B3/S234z (Zlife)

User avatar
C28
Posts: 724
Joined: December 8th, 2020, 12:23 pm
Location: WORLD -1

Re: Oscillator Discussion Thread

Post by C28 » December 14th, 2022, 3:51 pm

YES! A 132 cell reduction of 387P132!!!

Code: Select all

x = 46, y = 46, rule = B3/S23
32bo$30b3o$29bo$24b2o4bo$7bo2b2o12b2o5bo$7b4o6bo9b3obo$12b2obobobo5bo
bob2o$9b2ob3o4bo5bob2o11b2o$9bo9bo20bo$10b3o3b2o9bo9b2obo$12bo13b3o7b
obob2o$16bo19bobo2bo$13b3o19b2o3bo$2o32bo2b2o$bo2b2o22bo4b4obo$bobo2b
o20bobo4b3o$2bob2obo21bo5b2o2b2o$4bo2b4o12b2o2bo$5bob5o11b3o11bo2bo$4b
o3b3o13b2o12bo$3b3o32bo$3b3o21b3o$27b3o$26bobo12bo$26b2o13bo$7bo31bob
o$7bo27bo2b2obo$5bo2bo24b3o2b2o$10bo24bo$5b2o3bo28b2o2bo$11b2o26bo2bo
bo$7bo3b3o26b2o2bo$11bo18b2o12b2o$5b3ob2o$4bo2bobo7b3o12bo$4b2obobo19b
3obo$5bob2o7bo3bo7bo4b3o$5bo20bo5bo3bo$4b2o10bo2bo6bo5b5o$15bo2b2o6bo
bobo2bo$14bobobo2bo6bo4bob4o$14bob3o3bo11b2o2bo$15bobobobo$16bo$13b3o
$13bo!
- Christopher D'Agostino

adopted father of the U-turner

Code: Select all

x = 11, y = 15, rule = B3/S23
9bo$8bobo$8bobo$9bo8$b3o$b3o$obo$2o!
the U-turner gallery
255P132
B3/S234z (Zlife)

hotdogPi
Posts: 1587
Joined: August 12th, 2020, 8:22 pm

Re: Oscillator Discussion Thread

Post by hotdogPi » December 16th, 2022, 12:09 pm

I found a new version of an existing p64 that may or not be an improvement. The new form is on the left, and the old form is on the right.

Code: Select all

x = 93, y = 31, rule = B3/S23
59bo$27b2o29bobo$27bobo27bo3bo22bo$28b3o27bo3bo20bobo$8b2o19b2o28bo3bo
9b2o7bo3bo$8b2o16b2o32bo3bo8b2o6bo3bo$26b3o32bobo16bo3bo$6b4o52bo16bo
3bo$5bo3bo70bobo$4bob2o19b2o52bo$bo2bobo20b2o$obobobo7b3o51b3o18b3o$ob
ob2o7bo3bo36b3o10bo3bo20bo$bobo9b2ob2o39bo9b2ob2o16bo3bo$3bo49bo3bo29b
obo2bo$3b2o25b2o20bobo2bo27bo2bobo$31bo18bo2bobo29bo3bo$31bobo16bo3bo
30bo$29b2obobo15bo35b3o$28bobobobo16b3o$6b2o20bobo2bo$6b2o19b2obo30bo$
25bo3bo30bobo$25b4o30bo3bo16bo$6b3o49bo3bo16bobo$7b2o16b2o30bo3bo6b2o
8bo3bo$4b2o19b2o29bo3bo7b2o9bo3bo$4b3o50bobo20bo3bo$5bobo50bo22bo3bo$
6b2o74bobo$83bo!
It's a 32+32 shuttle, but there are also ways to make it a 31-generation push. This dot shown below is the simplest but with low clearance, and there are a whole bunch of complex sparks that work for both 31 and 32. Is there a way to make a 31+32 p63? gencols? JP21 by hand?

Code: Select all

x = 35, y = 23, rule = B3/S23
8b2o4b3o$8b2o4b3o$15bo$6b4o7bobo$5bo3bo6bo2b2o$4bob2o7bo3bo2b3o$bo2bob
o17bobo$obobobo15b3o$obob2o13bo$bobo12b3ob2o$3bo$3b2o14b2o9b2o$18b2o
11bo$18bo12bobo$29b2obobo$28bobobobo$28bobo2bo$27b2obo$25bo3bo$25b4o2$
25b2o$25b2o!
User:HotdogPi/My discoveries

Periods discovered: 5-16,⑱,⑳G,㉑G,㉒㉔㉕,㉗-㉛,㉜SG,㉞㉟㊱㊳㊵㊷㊹㊺㊽㊿,54G,55G,56,57G,60,62-66,68,70,73,74S,75,76S,80,84,88,90,96
100,02S,06,08,10,12,14G,16,17G,20,26G,28,38,47,48,54,56,72,74,80,92,96S
217,486,576

S: SKOP
G: gun

User avatar
DroneBetter
Posts: 94
Joined: December 1st, 2021, 5:16 am
Location: The UK (a delightful place)
Contact:

Re: Oscillator Discussion Thread

Post by DroneBetter » December 18th, 2022, 2:24 pm

dani wrote:
December 3rd, 2022, 4:18 am
I don't think this p8 from November 8th, 2022 ever made its way over here. It was found by Charity Engine apgsearching B38/S23:

Code: Select all

x = 18, y = 19, rule = B3/S23
8b2o$7bo2bo$8b2o$7bo2bo$4bob2o2b2obo$3bo2b2o2b2o2bo$b3o2bo4bo2b3o$o5b
2o2b2o5bo$b7o2b7o2$b7o2b7o$o5b2o2b2o5bo$b3o2bo4bo2b3o$3bo2b2o2b2o2bo$
4bob2o2b2obo$7bo2bo$8b2o$7bo2bo$8b2o!
Similarly, xp8_xjdcdjzoe7jxj7eozg9fpxpf9gz17esxse71zxcb3bc (another p8 found by Charity Engine in b38s23 (date unknown, it says one occurrence in H4_+2 but both the H4_+2 and D4_+2 attribute pages are empty), and also once in b3s23 (on 2022-12-10)), volatility 176/180

Code: Select all

x = 11, y = 24, rule = B3/S23
3b2ob2o$3bo3bo$4b3o$4b3o$3bo3bo$2b2o3b2o$b3o3b3o$b2o5b2o$2o7b2o$o2bo3bo2bo$b
3o3b3o$2bo5bo$2bo5bo$b3o3b3o$o2bo3bo2bo$2o7b2o$b2o5b2o$b3o3b3o$2b2o3b2o$3bo3b
o$4b3o$4b3o$3bo3bo$3b2ob2o!
That concludes my post (I hope you liked it)

Sokwe
Moderator
Posts: 2645
Joined: July 9th, 2009, 2:44 pm

Re: Oscillator Discussion Thread

Post by Sokwe » December 18th, 2022, 6:49 pm

dani wrote:
December 3rd, 2022, 4:18 am
I don't think this p8 from November 8th, 2022 ever made its way over here. It was found by Charity Engine apgsearching B38/S23:

Code: Select all

x = 18, y = 19, rule = B3/S23
8b2o$7bo2bo$8b2o$7bo2bo$4bob2o2b2obo$3bo2b2o2b2o2bo$b3o2bo4bo2b3o$o5b
2o2b2o5bo$b7o2b7o2$b7o2b7o$o5b2o2b2o5bo$b3o2bo4bo2b3o$3bo2b2o2b2o2bo$
4bob2o2b2obo$7bo2bo$8b2o$7bo2bo$8b2o!
This is a stator variant of an oscillator found by Charity Engine on July 8, 2022. Neither of these forms is minimal. Here is the minimal stator form:

Code: Select all

x = 18, y = 19, rule = B3/S23
8b2o$8b2o$7bo2bo2$4b2o6b2o$3bobo6bobo$o2bobob4obobo2bo$3o12b3o$3b3o6b
3o$2bo12bo$3b3o6b3o$3o12b3o$o2bobob4obobo2bo$3bobo6bobo$4b2o6b2o2$7bo
2bo$8b2o$8b2o!
DroneBetter wrote:
December 18th, 2022, 2:24 pm
xp8_xjdcdjzoe7jxj7eozg9fpxpf9gz17esxse71zxcb3bc (another p8 found by Charity Engine in b38s23 (date unknown, it says one occurrence in H4_+2 but both the H4_+2 and D4_+2 attribute pages are empty), and also once in b3s23 (on 2022-12-10))
This one was found in 2022 no later than November 17. iNoMed also posted a spark-assisted oscillator using this (simply an alternate sparker for an existing spark-assisted p8, I believe), as well as a "monomerization" using a different p8 oscillator:

Code: Select all

x = 53, y = 62, rule = B3/S23
7b3ob3o31b3ob3o2$9bobo35bobo$10bo37bo$10bo37bo$7bo2bo2bo31bo2bo2bo$8b
5o33b5o2$6bo7bo29bo7bo$6b2o5b2o29b2o5b2o$7bo5bo31bo5bo3$45bo5bo$6bobo
3bobo29b2o5b2o$6bo2bobo2bo29bo7bo$6bobo3bobo$8bo3bo33b5o$45bo2bo2bo$4b
o4bobo4bo31bo$2b3o2b3ob3o2b3o29bo$bo3b4o3b4o3bo27bobo$2b2o13b2o$3bobob
7obobo27b3ob3o$bobo4b5o4bobo$b2obo11bob2o$4bobo7bobo29b2ob2o$4bob2o5b
2obo27bo2bobo2bo$3b2obo7bob2o26b3o3b3o$8b5o32bo5bo$b4o2b7o2b4o$obo15bo
bo$o3bob2o2bo2b2obo3bo24bo5bo$b6o2bobo2b6o24b3o3b3o$6bob2ob2obo29bo2bo
bo2bo$3b2obobo3bobob2o28b2ob2o$3bob2o2bobo2b2obo$8b2ob2o$45b3ob3o2$47b
obo$48bo$48bo$45bo2bo2bo$46b5o2$44bo7bo$44b2o5b2o$45bo5bo3$45bo5bo$44b
2o5b2o$44bo7bo2$46b5o$45bo2bo2bo$48bo$48bo$47bobo2$45b3ob3o!
Gustone noted (also on Nov. 17, 2022) that it could be made into a wick, although without a completion:

Code: Select all

x = 95, y = 24, rule = B3/S23
3b2ob2o7b2ob2o7b2ob2o7b2ob2o7b2ob2o7b2ob2o7b2ob2o7b2ob2o$3bo3bo7bo3bo
7bo3bo7bo3bo7bo3bo7bo3bo7bo3bo7bo3bo$4b3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o$
4b3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o$3bo3bo7bo3bo7bo3bo7bo3bo7bo3bo7bo3bo
7bo3bo7bo3bo$2b2o3b2o5b2o3b2o5b2o3b2o5b2o3b2o5b2o3b2o5b2o3b2o5b2o3b2o
5b2o3b2o$b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b
3o$b2o5b2o3b2o5b2o3b2o5b2o3b2o5b2o3b2o5b2o3b2o5b2o3b2o5b2o3b2o5b2o$2o
7b2ob2o7b2ob2o7b2ob2o7b2ob2o7b2ob2o7b2ob2o7b2ob2o7b2o$o2bo3bo2bobo2bo
3bo2bobo2bo3bo2bobo2bo3bo2bobo2bo3bo2bobo2bo3bo2bobo2bo3bo2bobo2bo3bo
2bo$b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o$2b
o5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo$2bo5bo5bo5bo5bo5bo5bo5b
o5bo5bo5bo5bo5bo5bo5bo5bo$7b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o
3b3o3b3o3b3o$6bo2bo3bo2bobo2bo3bo2bobo2bo3bo2bobo2bo3bo2bobo2bo3bo2bob
o2bo3bo2bobo2bo3bo2bo$6b2o7b2ob2o7b2ob2o7b2ob2o7b2ob2o7b2ob2o7b2ob2o7b
2o$7b2o5b2o3b2o5b2o3b2o5b2o3b2o5b2o3b2o5b2o3b2o5b2o3b2o5b2o$7b3o3b3o3b
3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o$8b2o3b2o5b2o3b2o5b2o3b
2o5b2o3b2o5b2o3b2o5b2o3b2o5b2o3b2o$9bo3bo7bo3bo7bo3bo7bo3bo7bo3bo7bo3b
o7bo3bo$10b3o9b3o9b3o9b3o9b3o9b3o9b3o$10b3o9b3o9b3o9b3o9b3o9b3o9b3o$9b
o3bo7bo3bo7bo3bo7bo3bo7bo3bo7bo3bo7bo3bo$9b2ob2o7b2ob2o7b2ob2o7b2ob2o
7b2ob2o7b2ob2o7b2ob2o!
-Matthias Merzenich

User avatar
DroneBetter
Posts: 94
Joined: December 1st, 2021, 5:16 am
Location: The UK (a delightful place)
Contact:

Re: Oscillator Discussion Thread

Post by DroneBetter » December 20th, 2022, 11:26 am

JP21 wrote:
November 4th, 2021, 3:21 pm
Here's my collection of both domino and dot p4 sparkers
It seems to me as though for the second one from the right in the bottom row (that is a variant of the Fountain with higher clearance), the top six rows of the mechanism are stabilised more compactly in the sparker used in the current period-360 glider gun on Catagolue (17*15 instead of 17*20)

Code: Select all

x = 35, y = 20, rule = B3/S23
7bo18bo2$4bo5bo12bo5bo$b2o4bo4b2o6b2o4bo4b2o$ob2ob2ob2ob2obo4bob2ob2ob
2ob2obo$o13bo4bo13bo$3bo7bo10bo7bo$bo2bo5bo2bo5bo2bo7bo2bo$bo2bo5bo2bo
8bobo3bobo$bo11bo5bob3obobob3obo$b4o2bo2b4o4bo15bo$bo11bo4b3o2bobobobo
2b3o$21bobobobobobo$bo11bo4b2obo2b2ob2o2bob2o$bob9obo4bob2o9b2obo$2bo
9bo$5b2ob2o$6bobo$6bobo$7bo!
That concludes my post (I hope you liked it)

Post Reply