Code: Select all
x = 4, y = 3, rule = B2/S
b2o2$o2bo!
Code: Select all
x = 4, y = 3, rule = B2/S
b2o2$o2bo!
This is one of the three basic kinds of photon in rules of this family, the other two being these:Entity Valkyrie wrote:Code: Select all
x = 4, y = 3, rule = B2/S b2o2$o2bo!
Code: Select all
x = 13, y = 3, rule = B2/S
b2o7b2o$o2bo5bo$12bo!
Thanks. Are you planning to run the 3c/10 w9g search? Are you still running the c/9 w8g search?AforAmpere wrote:3c/10 w9u is negative, unfortunately.
Code: Select all
x = 41, y = 49, rule = B3/S23
19b2o$19b4o$19bob2o2$20bo$19b2o$19b3o$21bo$33b2o$33b2o7$36bo$35b2o$34b
o3bo$35b2o2bo$40bo$37bobo$38bo$38bo$38b2o$38b2o3$13bo10bo$12b5o5bob2o
11bo$11bo10bo3bo9bo$12b2o8b3obo9b2o$13b2o9b2o12bo$2o13bo21b3o$2o35b3o
7$8b2o$8b2o11b2o$19b2o2bo$24bo3bo$18bo5bo3bo$19bo2b2o3bobo$20b3o5bo$
28bo!
Code: Select all
x = 20, y = 27, rule = B3/S23
b2o$b2o6$14b3o$15bo2bo$19bo$16bobo6$2bobo$2o2b2o$2o3b2o$2o2b2o$b2ob2o$
2b2o3$3b3o$3bobo$3b3o!
Nice! How did you find it? And how did other people not already find it?A for awesome wrote:2-engine Cordership, minimum population 100:Code: Select all
code
Here's the script:Macbi wrote:Nice! How did you find it? And how did other people not already find it?A for awesome wrote:2-engine Cordership, minimum population 100:Code: Select all
code
Code: Select all
import golly as g
from random import randint
def nest(cl):
rtn = []
if len(cl) % 2:
for i in xrange(len(cl)/3):
rtn.append((cl[i*3],cl[i*3+1],cl[i*3+2]))
else:
for i in xrange(len(cl)/2):
rtn.append((cl[i*2],cl[i*2+1]))
return rtn
def flatten(cl):
rtn = []
for i in cl:
rtn += list(i)
if len(cl[0]) == 3 and not len(rtn) % 2:
rtn.append(0)
return rtn
#I wish Golly had an easy built-in way of doing this.
def clear():
g.setgen("0")
g.select(g.getrect())
if not g.getselrect(): return
g.clear(0)
g.select([])
se = [0,0,1,0,2,0,1,1,4,1,5,2,2,3,4,3]
solutions = []
n = 0
g.new("Switch engine testing grounds")
#I'm too lazy to go through and fix all of the indentation here.
try:
#for i in xrange(96):
# for x in xrange(50):
# for y in xrange(-x, 1):
while True:
#for _ in xrange(10):
if True:
i = randint(0, 96)
x = randint(0, 40)
y = randint(-x, 1)
clear()
g.putcells(g.evolve(se, i))
g.putcells(se, x, y)
c = nest(g.getcells(g.getrect()))
g.select([20,-40,7,7])
g.randfill(50)
g.select([0,-20,7,7])
g.randfill(50)
g.select([])
pat = g.getcells(g.getrect())
#Repeatedly test for switch engine continued survival
for cyc in xrange(1, 31):
g.run(96)
c2 = nest(g.getcells(g.getrect()))
#g.note(str(c) + "\n\n" + str(c2))
for j in c:
if (j[0]+8*cyc, j[1]+8*cyc) not in c2: #Something's wrong
#g.note(str((j[0]+8*cyc, j[1]+8*cyc)) + "\n\n" + str(c2))
break
else:
#Everything's okay, let's advance 96 gens and try again
continue
#We've broken from the inner loop if we're here, which means we're done beating a dead horse
break
else: #A likely candidate
#Advance a while longer and repeat the check for continued SE survival
g.run(9600)
c2 = nest(g.getcells(g.getrect()))
#g.note(str(c) + "\n\n" + str(c2))
#g.note(g.getgen())
for j in c:
if (j[0]+1040, j[1]+1040) not in c2:
#g.note(str((j[0]+8*cyc, j[1]+8*cyc)) + "\n\n" + str(c2))
break
else: #SE's are still active, so this is *almost* certainly a puffer
#Check population growth and keep anything with less debris than a block-laying switch engine
pop = int(g.getpop())
g.run(2880)
#g.note(str(pop) + "\n\n" + g.getpop())
if int(g.getpop()) < pop + 320:
solutions.append(pat)
n += 1
#Inform the user that something is, in fact, still happening
if not n%100:
g.fit()
g.update()
g.show(str(n) + " placements tested, " + str(len(solutions)) + " solutions found (press 'c' to copy results to clipboard or 'q' to quit).")
event = g.getevent()
if event.startswith("key"):
evt, ch, mods = event.split()
if ch == "c":
clear()
for i in xrange(len(solutions)):
g.putcells(solutions[i], 0, i*200)
g.select(g.getrect())
g.copy()
if ch == "q":
raise KeyboardInterrupt() #Technically true
#Ensure that solutions always get printed and (in prior versions of the script) facilitate breaking out of multiple loops
except KeyboardInterrupt:
pass
#Print solutions, obviously
g.new("Solutions")
for i in xrange(len(solutions)):
g.putcells(solutions[i], 0, i*200)
An amazing discovery! If you listen carefully, you'll be able to hear the sound of forty-six years' worth of dedicated Lifenthusiasts all feeling very silly that they didn't run that search already, just in case.A for awesome wrote:2-engine Cordership, minimum population 100:Code: Select all
x = 41, y = 49, rule = B3/S23 19b2o$19b4o$19bob2o2$20bo$19b2o$19b3o$21bo$33b2o$33b2o7$36bo$35b2o$34b o3bo$35b2o2bo$40bo$37bobo$38bo$38bo$38b2o$38b2o3$13bo10bo$12b5o5bob2o 11bo$11bo10bo3bo9bo$12b2o8b3obo9b2o$13b2o9b2o12bo$2o13bo21b3o$2o35b3o 7$8b2o$8b2o11b2o$19b2o2bo$24bo3bo$18bo5bo3bo$19bo2b2o3bobo$20b3o5bo$ 28bo!
Code: Select all
x = 61, y = 48, rule = B3/S23
16bo$15bobo$14b2ob2o$14b2ob2o$13b3o$13b3o3bo$13b3o4bo$14b2o5bo$14b3o$
15b2o$16b2o3$16bo$15b3o$14bo3bo$18b2o$17b2o$3o$4bo$4b2o$4bo2bo$5bobo$
5bo$4b2o$3bobo$5b2o$2b2o$4bo17$58b3o$58bo$59bo!
Here's the first synthesis I finished -- six gliders for the two switch engines, and seven for the cleanup. It can be improved, um, quite a bit:dvgrn wrote:EDIT: Here's a (probably) slightly cheaper predecessor. The smoke seems fairly tenacious, so it might take an automated search to come up with the least expensive synthesis.
Code: Select all
#C Seeds of Destruction
x = 156, y = 159, rule = LifeHistory
19.A.A$20.2A$20.A28.A$48.A$48.3A2$A$.2A$2A$42.A$42.A.A$42.2A
16$52.2A$52.A.A$52.A18$45.3A$45.A$46.A27$104.A$103.2A$103.A.
A4$115.3A$115.A$116.A5$108.3A$108.A$109.A27$96.2A$96.A.A$96.
A51.3A$148.A$149.A8$131.2A$131.A.A$131.A24$153.2A$153.A.A$
153.A!
Code: Select all
import golly as g
from random import randint
def nest(cl):
rtn = []
if len(cl) % 2:
for i in xrange(len(cl)/3):
rtn.append((cl[i*3],cl[i*3+1],cl[i*3+2]))
else:
for i in xrange(len(cl)/2):
rtn.append((cl[i*2],cl[i*2+1]))
return rtn
def flatten(cl):
rtn = []
for i in cl:
rtn += list(i)
if len(cl[0]) == 3 and not len(rtn) % 2:
rtn.append(0)
return rtn
#I wish Golly had an easy built-in way of doing this.
def clear():
g.setgen("0")
g.select(g.getrect())
if not g.getselrect(): return
g.clear(0)
g.select([])
se = [0,0,1,0,2,0,1,1,4,1,5,2,2,3,4,3]
solutions = []
n = 0
g.new("Switch engine testing grounds")
#I'm too lazy to go through and fix all of the indentation here.
try:
#for i in xrange(96):
# for x in xrange(50):
# for y in xrange(-x, 1):
while True:
#for _ in xrange(10):
if True:
#Generation
i = randint(0, 48)
#Orientation (otherwise some solutions would be skipped)
o = randint(0, 2)
#Close but not too close
x = randint(10, 30)
y = randint(-x, min(x-20,1))
clear()
g.putcells(g.evolve(se, i))
if o:
#Flip diagonally
g.select(g.getrect())
g.flip(0)
g.rotate(1)
g.select([])
g.putcells(se, x, y)
'''g.fit()
g.update()
g.note("")'''
c = nest(g.getcells(g.getrect()))
#g.select([20,-40,7,7])
#g.randfill(50)
g.select([0,-20,7,7])
g.randfill(50)
g.select([])
pat = g.getcells(g.getrect())
#Repeatedly test for switch engine continued survival
for cyc in xrange(1, 31):
g.run(96)
c2 = nest(g.getcells(g.getrect()))
#g.note(str(c) + "\n\n" + str(c2))
for j in c:
if (j[0]+8*cyc, j[1]+8*cyc) not in c2: #Something's wrong
#g.note(str((j[0]+8*cyc, j[1]+8*cyc)) + "\n\n" + str(c2))
break
else:
#Everything's okay, let's advance 96 gens and try again
continue
#We've broken from the inner loop if we're here, which means we're done beating a dead horse
break
else: #A likely candidate
#Advance a while longer and repeat the check for continued SE survival
g.run(9600)
c2 = nest(g.getcells(g.getrect()))
#g.note(str(c) + "\n\n" + str(c2))
#g.note(g.getgen())
for j in c:
if (j[0]+1040, j[1]+1040) not in c2:
#g.note(str((j[0]+8*cyc, j[1]+8*cyc)) + "\n\n" + str(c2))
break
else: #SE's are still active, so this is *almost* certainly a puffer
#Check population growth and keep anything with less debris than a block-laying switch engine
pop = int(g.getpop())
g.run(2880)
#g.note(str(pop) + "\n\n" + g.getpop())
if int(g.getpop()) < pop + 320:
solutions.append(pat)
n += 1
#Inform the user that something is, in fact, still happening
if not n%100:
g.fit()
g.update()
g.show(str(n) + " placements tested, " + str(len(solutions)) + " solutions found (press 'c' to copy results to clipboard or 'q' to quit).")
event = g.getevent()
if event.startswith("key"):
evt, ch, mods = event.split()
if ch == "c":
clear()
for i in xrange(len(solutions)):
g.putcells(solutions[i], 0, i*200)
g.select(g.getrect())
g.copy()
if ch == "q":
raise KeyboardInterrupt() #Technically true
#Ensure that solutions always get printed and (in prior versions of the script) facilitate breaking out of multiple loops
except KeyboardInterrupt:
pass
#Print solutions, obviously
g.new("Solutions")
for i in xrange(len(solutions)):
g.putcells(solutions[i], 0, i*200)
dvgrn wrote:Here's the first synthesis I finished -- six gliders for the two switch engines, and seven for the cleanup. It can be improved, um, quite a bit:dvgrn wrote:EDIT: Here's a (probably) slightly cheaper predecessor. The smoke seems fairly tenacious, so it might take an automated search to come up with the least expensive synthesis.
Code: Select all
#C Seeds of Destruction x = 156, y = 159, rule = LifeHistory 19.A.A$20.2A$20.A28.A$48.A$48.3A2$A$.2A$2A$42.A$42.A.A$42.2A 16$52.2A$52.A.A$52.A18$45.3A$45.A$46.A27$104.A$103.2A$103.A. A4$115.3A$115.A$116.A5$108.3A$108.A$109.A27$96.2A$96.A.A$96. A51.3A$148.A$149.A8$131.2A$131.A.A$131.A24$153.2A$153.A.A$ 153.A!
Code: Select all
x = 175, y = 167, rule = B3/S23
37bo$38b2o134bo$37b2o133b2o$173b2o16$71bobo$72b2o$72bo$165bo$163b2o$
164b2o14$65bo$66b2o$65b2o2$144bobo$144b2o$145bo75$166b3o$166bo$167bo4$
147b2o$147bobo$147bo37$bo$b2o$obo!
Code: Select all
b4o25bo$o29bo$b3o3b3o2bob2o2bob2o2bo3bobo$4bobo3bob2o2bob2o2bobo3bobo$
4bobo3bobo5bo5bo3bobo$o3bobo3bobo5bo6b4o$b3o3b3o2bo5bo9bobo$24b4o!
Oh, good -- that's much better. A 9-glider two-engine Cordership synthesis -- that's two new records. And now the table of spaceship recipes under Glider synthesis is incomplete again...AbhpzTa wrote:6G 2 switch engines + 3G clean up = 9G:dvgrn wrote:EDIT: Here's a (probably) slightly cheaper predecessor. The smoke seems fairly tenacious, so it might take an automated search to come up with the least expensive synthesis.Code: Select all
x = 175, y = 167, rule = B3/S23 37bo$38b2o134bo$37b2o133b2o$173b2o16$71bobo$72b2o$72bo$165bo$163b2o$ 164b2o14$65bo$66b2o$65b2o2$144bobo$144b2o$145bo75$166b3o$166bo$167bo4$ 147b2o$147bobo$147bo37$bo$b2o$obo!
For a construction from three directions, here's a more organized and efficient cleanup with five gliders, so 11 gliders for the whole recipe. I haven't run a full gencols (or other) search -- it's quite possible that each pair of gliders on the right can be replaced by a single glider, making a faster 9G recipe:dvgrn wrote:... six gliders for the two switch engines, and seven for the cleanup. It can be improved, um, quite a bit...
Code: Select all
x = 118, y = 104, rule = B3/S23
20bo$21b2o$20b2o$48bo$48bobo$48b2o2$obo$b2o$bo40bo$41bo$41b3o16$51b3o$
51bo$52bo17$45b2o$45bobo$45bo10$96bo$95b2o$95bobo11$99b3o$99bo$100bo$
112bo$111b2o$111bobo11$115b3o$115bo$116bo12$89b2o$88b2o$90bo!
Awesome! Pattern of the year entry.A for awesome wrote:2-engine Cordership, minimum population 100:...Code: Select all
rle
Are the years UTC, or do we use the timezone of the discoverer?Naszvadi wrote:Awesome! Pattern of the year entry.A for awesome wrote:2-engine Cordership, minimum population 100:...Code: Select all
rle
In my case, it's 2017 either way, so it doesn't matter.Macbi wrote:Are the years UTC, or do we use the timezone of the discoverer?
Code: Select all
x = 71, y = 76, rule = LifeHistory
15.A$13.2A.2A$13.2A.2A$13.2A$15.2A.A$16.A2.A$16.A2.A$17.2A
12.2A$31.2A4$15.3A2$15.A.A$16.A22.2A$17.A21.2A$17.2A$14.A.2A
.A$.3A10.4A.2A$A3.A10.5A$A3.A12.2A13.3A$A3.A25.6A$30.3A2.2A$
.2A.2A22.A6.2A$2.A2.A21.2A4.3A$3.A.A21.2A4.A$4.2A26.2A$.A3.A
25.A$A.A.A.A23.2A$.A29.2A$30.A$29.2A$29.2A$26.A$26.A$24.3A$
24.2A$24.A2.A.A$26.3A$6.2A18.A$6.2A$19.5A$21.3A$18.A2.3A$18.
2A2.A$20.3A$21.A6$25.2A$25.A.A$25.A18$69.A$68.2A$68.A.A!
#C [[ AUTOFIT HISTORYFIT ]]
Code: Select all
x = 99, y = 94, rule = B3/S23
34b2o$13bo20b2o$13b3o$16bo$15b2o4$42b2o$42b2o5$o$3o$3bo$2b2o20$5b2o$5b
2o12$65bo$64b3o$63b2ob2o$64b3o14bo$65bo14b3o$65bobo11bo3bo$65b4o9b2o2b
3o$68bo10bo3bo$79bo2bo$64b2ob2o11bobo6b2o$63bo5bo19b2o$64bo3bo$65bo2$
80bob2o$79b5o$79b4o$51bo42b2o$51b4o6bo18b3o14bo$51bo3bo5bo18b3o9bo4bo$
81bo4b2o4bo5bo$53b3o29b3o4bo3b2o$84b4o6bob2o$82b2o2b3obo$82b2obo2b2o$
81b2o6bo$82bo2bo$83b3o$77b2o$77b2o$76bo2bo$76bob2o$73b3o$74b2o$56b2o9b
2o2bo$56b2o5b2obo4b2o$67bobob2o$69b2o5$64b2o$64b2o!
#C [[ STEP 9 ]]
Code: Select all
x = 151, y = 156, rule = B3/S23
22b2o$21bobo$22bo6$30b2o$29bobo$30bo3$bo$obo$2o$38b2o$37bobo$38bo3$9bo
$8bobo$8b2o$46b2o$45bobo$46bo3$17bo$16bobo$16b2o$54b2o$53bobo$54bo3$
25bo$24bobo$24b2o$62b2o$61bobo$62bo3$33bo$32bobo$32b2o$70b2o$69bobo$
70bo3$41bo$40bobo$40b2o$78b2o$77bobo$78bo3$49bo$48bobo35b2o$48b2o36b2o
6$57bo$56bobo35b2o$56b2o36b2o2$53bo$52bobo$52bobo$50b3ob2o$49bo$50b3ob
2o$52bob2o12$49b2o$49b2o7$57b2o$57b2o12$117bo$116b3o$115b2ob2o$116b3o
14bo$117bo14b3o$117bobo11bo3bo$117b4o9b2o2b3o$120bo10bo3bo$131bo2bo$
116b2ob2o11bobo6b2o$115bo5bo19b2o$116bo3bo$117bo2$132bob2o$131b5o$131b
4o$103bo42b2o$103b4o6bo18b3o14bo$103bo3bo5bo18b3o9bo4bo$133bo4b2o4bo5b
o$105b3o29b3o4bo3b2o$136b4o6bob2o$134b2o2b3obo$134b2obo2b2o$133b2o6bo$
134bo2bo$135b3o$129b2o$129b2o$128bo2bo$128bob2o$125b3o$126b2o$108b2o9b
2o2bo$108b2o5b2obo4b2o$119bobob2o$121b2o5$116b2o$116b2o!
#C [[ STEP 9 STOP 1366 ]]
Code: Select all
#C Extrementhusiast's Model D heisenburp, updated for 2-engine Corderships
x = 207, y = 181, rule = LifeHistory
107.2A$107.2A3$105.2A$105.2A$92.2A64.A$93.A64.3AB$93.A.A65.A$94.2A64.
2A$90.2A$90.2A7$103.2A$103.2A29.2A$96.2A36.2A$95.A2.A$96.2A74.2A$123.
A48.2A$122.A.A$122.2A$131.2A$131.A19.2A$132.A17.A.A$131.2A17.A$96.2A
51.2A$96.2A14$164.A.2A$164.2A.A2$162.5A$140.2A20.A4.A2.2A$141.A23.A2.
A2.A$141.A.A21.2A.A.A$142.2A18.A5.A.2A$161.A.A4.A$161.A2.A2.2A$162.2A
$131.2A$132.A$132.A.A$133.2A2$151.2A$151.2A12$142.A$141.A.A$141.A.A$
142.A9$48.A$48.3A$51.A$50.2A$46.2A19.2A$46.2A19.A17.2A$65.A.A17.A$65.
2A19.A$45.A39.2A$44.A.A$45.A$42.3A$42.A2$82.2A$82.2A$97.2A$44.2A50.A
2.A$44.2A51.2A2$28.2A$29.A$29.A.A$.2A27.2A$.2A2$22.2A65.A$22.A64.3A$
20.A.A63.A$20.2A34.2A28.2A$56.2A3.2A$61.2A3$.2A59.2A$.2A53.2A4.A$56.
2A5.3A10.2A$65.A9.A.A5.2A$31.2A42.A7.2A$31.2A11.2A28.2A$44.A$45.3A40.
A$2.2A43.A36.2A.A.A$.A.A79.A.A.A.A$.A9.2A.A65.A2.A.A.A.A.2A$2A9.2A.3A
63.4A.2A2.A2.A$17.A66.A4.2A$11.2A.3A65.A.A$10.A2.2A67.2A$10.2A3$180.A
.A$179.A2.A$180.A.A$196.2A$196.A.A$182.A13.3A$181.A.2A11.A2.A$181.A.
2A12.A$167.3A10.A3.A12.A7.2A$168.A12.4A20.2A$168.A2.A9.3A15.A$168.A2.
A24.A$169.A.A24.A2.A$184.2A9.3A$184.2A9.3A$195.A2.A$196.A.A$168.A27.
3A$167.A.A$168.A$185.A$185.A$166.4A$166.2A3.A13.A$167.A4.A11.A.A$169.
A.2A11.A$170.A15.2A$187.A$184.3A$185.2A$182.A$182.2A$182.2A$172.2A6.
2A$172.2A4.2A$178.2A.A$180.2A5$180.2A$180.2A!
#C [[ STEP 9 AUTOSTART STOP 2300 X -11 Y -26 ]]
Code: Select all
x = 38, y = 30, rule = B3/S23
3bob2obo$2bobo$2bob5o$2bob2obo24b3o$4b4o25bo2bo$5b4o28bo$4b3o27bobo8$
4bo$6bo$3bo$2b2ob2o$4bo2$3b2o$2bo$2bo2bo$2obo$2bo2b3o$2o$6b2o$3b2ob2o$
4bobo$5bo!
Sorry, it sometimes does that (especially when a puffer dies sometime between cycles 130 and 150). Cases like that are rare enough that it's not as necessary to filter them out, although filtering them out isn't a bad idea.Saka wrote:The script gave a false positive (?)Code: Select all
x = 38, y = 30, rule = B3/S23 3bob2obo$2bobo$2bob5o$2bob2obo24b3o$4b4o25bo2bo$5b4o28bo$4b3o27bobo8$ 4bo$6bo$3bo$2b2ob2o$4bo2$3b2o$2bo$2bo2bo$2obo$2bo2b3o$2o$6b2o$3b2ob2o$ 4bobo$5bo!
It's a bit more complicated than that, unfortunately -- basically half of the script is involved in the ruling out of non-solutions, and when that part is done, it treats everything else as a solution. The part that might be most easily (and useful-ly) changeable would be the population growth cutoff. The line should readSaka wrote:Also, could someone post the part of the script that detects if it is a solution?
Code: Select all
if int(g.getpop()) < pop + 320: