Speed Demonoid

For discussion of specific patterns or specific families of patterns, both newly-discovered and well-known.
User avatar
Pavgran
Posts: 220
Joined: June 12th, 2019, 12:14 pm

Re: Speed Demonoid

Post by Pavgran » September 26th, 2020, 3:31 pm

This variant of the Speed Demonoid can easily achieve hashlife-friendliness.

Below are a few examples of various speeds, all as hashlife-friendly as possible (each requires a few cycles to warm-up, and then it flies very smoothly)
sdv2c12.mc
c/12 Speed Demonoid (hashlife-friendly)
(356.29 KiB) Downloaded 176 times
The period is 50331648=12*2^22, the offset is 4194304=2^22
sdv2-2c9.mc
2c/9 Speed Demonoid (hashlife-friendly)
(429.43 KiB) Downloaded 137 times
The period is 37748736=9*2^22, the offset is 8388608=2^23
sdv2c5.mc
c/5 Speed Demonoid (hashlife-friendly)
(429.2 KiB) Downloaded 173 times
The period is 20971520=5*2^22, the offset is 4194304=2^22

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

Re: Speed Demonoid

Post by dvgrn » September 28th, 2020, 10:28 pm

Here's a script that builds any speed of Speed Demonoid that you might want, either HashLife-friendly or not-so-HashLife-friendly:
sd-glider-recipe-builder-v2.zip
builder script for Speed Demonoid recipes, v2 -- updated decimal handling
(251.04 KiB) Downloaded 129 times
Technically what it always builds is a 31,822-glider recipe for the requested Speed Demonoid, instead of the spaceship itself. Run the recipe 750,000 ticks to reach the standard starting point, where the single-channel recipe is just about to enter the Scorbie Splitter -- and then run another half-period or so to make sure you've reached a phase of the actual spaceship. The step and period will be given in the title when the glider synthesis is created.

Here are a few sample Speed Demonoids with unit-fraction diagonal speeds that haven't ever been seen before, I think:
c8sd=3285622c26284976.mc
c/8 Speed Demonoid
(394.21 KiB) Downloaded 127 times
c9sd=3285624c29570616.mc
c/9 Speed Demonoid
(381.64 KiB) Downloaded 120 times
c10sd=3285624c32856240.mc
c/10 Speed Demonoid
(343.79 KiB) Downloaded 113 times
c11sd=3285624c36141864.mc
c/11 Speed Demonoid
(343.92 KiB) Downloaded 121 times
c11sd_hf=4194304c46137344.mc
c/11 HashLife-friendly Speed Demonoid
(345.17 KiB) Downloaded 121 times
c137sd=3285624c450130488.mc
c/137 Speed Demonoid
(342.17 KiB) Downloaded 132 times
The HashLife-friendly version of the c/11 Demonoid does seem to run faster in Golly after just a few cycles. However, given enough memory, by the time Golly has run about ten cycles of the smaller non-HashLife-friendly c/11, that pattern also runs almost perfectly smoothly at a high step size, say 8^5 or 2^16.

EDIT: The script can't actually build Demonoids much faster than 2498c/10000, because it starts to run into trouble with the numbers getting too large for the interface between Golly and the Python script:
OverflowError: Python int too large to convert to C long
Even a .2498c Demonoid recipe is so huge and sparse that it's very hard to see in RuleLoader's default colors. HashLife's off-white color shows up a bit better. It would only take very small changes to the script to adjust the glider recipe template so that it doesn't have a single glider way far off to the north, and then we could build Demonoids a little closer to the limit. The same problem would show up again pretty quick, though.

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

Re: Speed Demonoid

Post by dvgrn » September 29th, 2020, 8:57 pm

dvgrn wrote:
September 28th, 2020, 10:28 pm
The script can't actually build Demonoids much faster than 2498c/10000, because it starts to run into trouble with the numbers getting too large for the interface between Golly and the Python script:
OverflowError: Python int too large to convert to C long
Pavgran has produced a version of the script with somewhat less hackish ad-hoc internal math, so there's maybe some hope that a casual reader could figure out what the script was calculating now. And I've reworked the base glider recipe slightly so that it finishes its construction work a lot quicker, and also made it easier to check that the speed is correct.

To test a constructed Speed Demonoid, first run the glider recipe for 750,000 ticks, as before. The slow-salvo recipe will be lined up with the first Scorbie Splitter, and the key block in the Scorbie Splitter will be at exactly (0,0) in Golly's coordinate system.

So then just use goto.lua to run the Demonoid for one full period -- the number after the second "/" in the layer's title, the {p} value in "= {n}c/{p}" -- and check where that key block has gotten to at that point. Its upper left corner cell should be at (-n,-n).
sd-glider-recipe-builder-v3.5.py.zip
(251.29 KiB) Downloaded 109 times
With any luck there will be one more version of the script coming along tomorrow. I think version 3.5 always builds Demonoids of the correct speed, but sometimes it uses a step size and period that are two or four times larger than necessary.

User avatar
Scorbie
Posts: 1692
Joined: December 7th, 2013, 1:05 am

Re: Speed Demonoid

Post by Scorbie » September 30th, 2020, 4:31 am

dvgrn wrote:
September 29th, 2020, 8:57 pm
dvgrn wrote:
September 28th, 2020, 10:28 pm
The script can't actually build Demonoids much faster than 2498c/10000, because it starts to run into trouble with the numbers getting too large for the interface between Golly and the Python script:
OverflowError: Python int too large to convert to C long
Pavgran has produced a version of the script with somewhat less hackish ad-hoc internal math, so there's maybe some hope that a casual reader could figure out what the script was calculating now. And I've reworked the base glider recipe slightly so that it finishes its construction work a lot quicker, and also made it easier to check that the speed is correct.
You can use the Python3 branch of golly that uses arbitrary-length integers (int in py3, long in py2), which, speaking of python3, I have to put my hands on.

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

Re: Speed Demonoid

Post by dvgrn » September 30th, 2020, 6:31 am

Scorbie wrote:
September 30th, 2020, 4:31 am
You can use the Python3 branch of golly that uses arbitrary-length integers (int in py3, long in py2), which, speaking of python3, I have to put my hands on.
I'm somewhat dubious that that will help anything. The error message talks about the problem being the size of a C long, not the size of a Python int.

So the limitation is really not being able to paste outside of the +/- 10^9 boundary, which is related to Golly's internal representation of cell lists, nothing to do with Python... If Golly 4.0 has been re-engineered to remove that +/- 10^9 limitation, then I'll be very very surprised I hadn't heard about it.

EDIT: It's tomorrow now! This might be the final version of the script for now. There's some unnecessary duplication between the two splitter recipes, but that doesn't really make the script much longer.

Again, the gliders in the slow salvo recipes are unnecessarily far apart, but they match the way the Speed Demonoid itself does its constructions, so I don't see any reason to pack them closer together, or to reduce the total number of gliders in the recipe by doing non-unidirectional constructions.
sd-glider-recipe-builder-v4.zip
# v.4, 30 Sep 2020: optimized formulas by Pavgran, usability improvements by dvgrn
(251.4 KiB) Downloaded 126 times
EDIT: very minor update to work with Python 3.x in Golly 4.0+:
sd-glider-recipe-builder-v4-Python3.zip
same script, runs in Python 3.x under Golly 4.0+
(303.87 KiB) Downloaded 114 times

User avatar
Scorbie
Posts: 1692
Joined: December 7th, 2013, 1:05 am

Re: Speed Demonoid

Post by Scorbie » September 30th, 2020, 9:27 am

@dvgrn Oof, you are right; I should have been paying more attention.. :s

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

Re: Speed Demonoid

Post by dvgrn » November 1st, 2020, 6:40 pm

dvgrn wrote:
September 30th, 2020, 6:31 am
same script, runs in Python 3.x under Golly 4.0
Here's a minor upgrade to the script, to make it more likely that people will try it out. RLE is a fairly terrible way to store single-channel recipes, but that's how it was done in the script -- which was why it was 993K and had to be posted as an attachment.

A little fiddling around with bz2 compression and base64 encoding brings the total size of the script down to a very auspicious 42 kilobytes:

Code: Select all

# sd-glider-recipe-builder-v5-compressed.py
#
# v.1, 28 Sep 2020:  initial release
# v.2, 29 Sep 2020:  improved handling of speeds entered in decimal format
# v.3, 29 Sep 2020:  improved formulas by Pavgran, simplified recipe by dvgrn
# v.4, 30 Sep 2020:  optimized formulas by Pavgran, usability improvements by dvgrn
# v.5,  1 Nov 2020:  compressed single-channel data so script fits in a forum post

import golly as g
import math
from fractions import Fraction
import bz2
import base64

reversedict = {0: 0, 1: 90, 2: 91, 3: 92, 4: 93, 5: 94, 6: 95, 7: 96, 8: 97, 9: 98, 10: 99, 11: 100, 12: 101,
13: 102, 14: 103, 15: 104, 16: 105, 17: 106, 18: 107, 19: 108, 20: 109, 21: 110, 22: 111, 23: 112, 24: 113,
25: 114, 26: 115, 27: 116, 28: 117, 29: 118, 30: 119, 31: 120, 32: 121, 33: 122, 34: 123, 35: 124, 36: 125,
37: 126, 38: 127, 39: 128, 40: 129, 41: 130, 42: 131, 43: 132, 44: 133, 45: 134, 46: 135, 47: 136, 48: 137,
49: 138, 50: 139, 51: 140, 52: 141, 53: 142, 54: 143, 55: 144, 56: 145, 57: 146, 58: 147, 59: 148, 60: 149,
61: 150, 62: 151, 63: 152, 64: 153, 65: 154, 66: 155, 67: 156, 68: 157, 69: 158, 70: 159, 71: 160, 72: 161,
73: 162, 74: 163, 75: 164, 76: 165, 77: 166, 78: 167, 79: 168, 80: 169, 81: 170, 82: 171, 83: 172, 84: 173,
85: 174, 86: 175, 87: 176, 88: 177, 89: 178, 90: 179, 91: 180, 92: 181, 93: 182, 94: 183, 95: 184, 96: 185,
97: 186, 98: 187, 99: 188, 100: 189, 101: 190, 102: 191, 103: 192, 104: 193, 105: 194, 106: 195, 107: 196,
108: 197, 109: 198, 110: 199, 111: 200, 112: 201, 113: 202, 114: 203, 115: 204, 116: 205, 117: 206, 118: 207,
119: 209, 120: 210, 121: 211, 122: 212, 123: 213, 124: 214, 125: 215, 126: 216, 127: 217, 128: 218, 129: 219,
130: 220, 131: 221, 132: 222, 133: 223, 134: 224, 135: 225, 136: 226, 137: 227, 138: 228, 139: 229, 140: 230,
141: 231, 142: 232, 143: 233, 144: 234, 145: 235, 146: 236, 147: 237, 148: 238, 149: 239, 150: 240, 151: 241,
152: 243, 153: 244, 154: 245, 155: 246, 156: 247, 157: 249, 158: 251, 159: 254, 160: 255, 161: 258, 162: 259,
163: 260, 164: 261, 165: 263, 166: 264, 167: 265, 168: 266, 169: 267, 170: 268, 171: 269, 172: 270, 173: 271,
174: 275, 175: 276, 176: 277, 177: 278, 178: 279, 179: 280, 180: 281, 181: 282, 182: 283, 183: 285, 184: 286,
185: 291, 186: 293, 187: 294, 188: 295, 189: 296, 190: 297, 191: 298, 192: 299, 193: 300, 194: 301, 195: 304,
196: 307, 197: 308, 198: 309, 199: 312, 200: 313, 201: 315, 202: 317, 203: 320, 204: 321, 205: 322, 206: 323,
207: 324, 208: 327, 209: 328, 210: 332, 211: 335, 212: 336, 213: 337, 214: 342, 215: 343, 216: 345, 217: 347,
218: 352, 219: 356, 220: 366, 221: 369, 222: 393, 223: 398, 224: 400, 225: 402, 226: 403, 227: 408, 228: 412,
229: 427, 230: 439, 231: 446}

gliders=["3o$o$bo!","b2o$2o$2bo!","b2o$bobo$bo!","2bo$b2o$bobo!"]
gliderlist=[g.parse(gl) for gl in gliders]
elbow=g.parse("2o$2o!")

g.setrule("Life")

# build a single-channel recipe given a list of integers denoting time separation between gliders
# -- this assumes that the recipe starts with a 0, as this is the standard single-channel format
def makerecipe(recipe):
  clist = gliderlist[0]
  totaltime=0
  for i in recipe[1:]:
    totaltime+=i
    g.putcells(g.transform(gliderlist[totaltime%4],totaltime//4,totaltime//4))
    g.show(str(totaltime))

# run for 750000 ticks plus one full period to produce the actual Speed Demonoid spaceship

resp = g.getstring("Enter a sub-c/4 speed, appending 'h' if you want a HashLife-friendly Demonoid:","2c/9h")
if resp == "":
  g.exit("Script canceled due to lack of input.")
response = resp.replace("c","")
if response.endswith("h") or response.endswith("H"):
  response = response[:-1]
  hfriendly = 1
else:
  hfriendly = 0
if response.find("/")==-1:
  # either this is some kind of decimal representation, or they're putting us on
  if response.startswith("."):
    num = response[1:]
  elif response.startswith("0."):
    num = response[2:]
  else:
    g.exit("Invalid format for speed specification: '" + response + "'.")
  n = int(num)
  d = 10**len(num)
  response = str(int(n)) + "/" + str(int(d))
  
num, denom = response.split("/")
if num == "":
  num = "1"  # handle syntax like "c/9"
if not num.isdigit():
  g.exit("Invalid numerator '" + num + "'.")
if not denom.isdigit():
  g.exit("Invalid denominator '" + denom + "'.")

target = Fraction(int(num), int(denom))
if target > Fraction(1, 4):
  g.exit("That fraction is NOT smaller than c/4.  What you ask has been proven to be impossible.")
elif target == Fraction(1,4):
  g.new("Glider")
  g.putcells(g.parse("3o$o$bo!"))
  g.fit()
  g.exit("You just asked for a diagonal spaceship traveling at exactly c/4.  Demonoids don't go that fast.  Here, have a glider.")
    
# g.note(str([numerator, denominator]))
# g.exit()

# pieces of Speed Demonoid:
# - Snark_slow_salvo
# - splitter_part
# - glider_for_Snark
# - glider_for_splitter
# - splitter_slow_salvo
# - glider_for_single_splitter
# - single_channel_salvo
# - trigger1
# - trigger2
# All of these are defined at their default locations for a minimal 3285622c/16493928 Speed Demonoid

Snark_slow_salvo = g.parse("""3o$o$bo164826$164833bo$164832b2o$164832bobo1349$166185b2o$166184b2o$
166186bo1606$167801bo$167800b2o$167800bobo1059$168852bo$168851b2o$
168851bobo1498$170360bo$170359b2o$170359bobo1747$172105bo$172104b2o$
172104bobo1350$173460b2o$173459b2o$173461bo1450$174919b2o$174919bobo$
174919bo995$175932b3o$175932bo$175933bo1021$176954b2o$176954bobo$
176954bo975$177951bo$177950b2o$177950bobo830$178774b3o$178774bo$
178775bo694$179469b2o$179469bobo$179469bo864$180347b3o$180347bo$
180348bo739$181072b3o$181072bo$181073bo814$181878b3o$181878bo$181879bo
1133$183010b2o$183009b2o$183011bo983$183996b2o$183995b2o$183997bo1072$
185077bo$185076b2o$185076bobo780$185854b2o$185854bobo$185854bo855$
186714b2o$186714bobo$186714bo1038$187762bo$187761b2o$187761bobo1371$
189125b2o$189124b2o$189126bo1021$190166bo$190165b2o$190165bobo696$
190872b3o$190872bo$190873bo617$191489b2o$191489bobo$191489bo843$
192325b2o$192325bobo$192325bo999$193330b3o$193330bo$193331bo552$
193895b2o$193894b2o$193896bo561$194437b2o$194436b2o$194438bo1138$
195559bo$195558b2o$195558bobo1391$196945bo$196944b2o$196944bobo1253$
198246bo$198245b2o$198245bobo967$199174b2o$199174bobo$199174bo849$
200029bo$200028b2o$200028bobo1270$201291bo$201290b2o$201290bobo1400$
202702bo$202701b2o$202701bobo1159$203860bo$203859b2o$203859bobo1031$
204893bo$204892b2o$204892bobo1125$206035bo$206034b2o$206034bobo1084$
207123b2o$207122b2o$207124bo982$208087bo$208086b2o$208086bobo1149$
209253b2o$209252b2o$209254bo833$210101b2o$210100b2o$210102bo892$
211013b2o$211013bobo$211013bo687$211694b3o$211694bo$211695bo901$
212605b2o$212605bobo$212605bo864$213479b2o$213479bobo$213479bo565$
214036b2o$214035b2o$214037bo887$214931b2o$214931bobo$214931bo361$
215280b3o$215280bo$215281bo763$216057b2o$216056b2o$216058bo672$216725b
3o$216725bo$216726bo447$217202b2o$217201b2o$217203bo726$217921b2o$
217920b2o$217922bo539$218465b2o$218464b2o$218466bo448$218915b2o$
218914b2o$218916bo442$219369b3o$219369bo$219370bo865$220203b2o$220202b
2o$220204bo603$220813b2o$220812b2o$220814bo295$221104b2o$221103b2o$
221105bo661$221769bo$221768b2o$221768bobo600$222367b2o$222367bobo$
222367bo1036$223404b2o$223403b2o$223405bo654$224064bo$224063b2o$
224063bobo632$224692b2o$224691b2o$224693bo805$225496b2o$225495b2o$
225497bo812$226321b2o$226321bobo$226321bo757$227078b3o$227078bo$
227079bo463$227560b2o$227559b2o$227561bo586$228153bo$228152b2o$228152b
obo560$228720b2o$228719b2o$228721bo210$228926b3o$228926bo$228927bo591$
229509b2o$229508b2o$229510bo618$230136b2o$230136bobo$230136bo523$
230611b3o$230611bo$230612bo1003$231613b2o$231613bobo$231613bo1262$
232873b3o$232873bo$232874bo892$233768b2o$233767b2o$233769bo1348$
235105bo$235104b2o$235104bobo1217$236333bo$236332b2o$236332bobo1143$
237473b3o$237473bo$237474bo1414$238912b2o$238912bobo$238912bo876$
239788b2o$239788bobo$239788bo985$240772b2o$240771b2o$240773bo1081$
241857b2o$241856b2o$241858bo1079$242942b2o$242941b2o$242943bo775$
243724b3o$243724bo$243725bo924$244642bo$244641b2o$244641bobo932$
245580bo$245579b2o$245579bobo929$246505b2o$246504b2o$246506bo882$
247388b3o$247388bo$247389bo1100$248497b3o$248497bo$248498bo758$249251b
2o$249251bobo$249251bo1055$250300b2o$250300bobo$250300bo954$251270bo$
251269b2o$251269bobo858$252133b2o$252132b2o$252134bo954$253092b3o$
253092bo$253093bo894$253998bo$253997b2o$253997bobo934$254932b3o$
254932bo$254933bo671$255606b2o$255606bobo$255606bo530$256135b2o$
256135bobo$256135bo872$256996b3o$256996bo$256997bo825$257821b2o$
257820b2o$257822bo1067$258906b3o$258906bo$258907bo920$259826b3o$
259826bo$259827bo695$260518b2o$260518bobo$260518bo907$261430b3o$
261430bo$261431bo974$262398b3o$262398bo$262399bo702$263103b3o$263103bo
$263104bo1035$264138b3o$264138bo$264139bo889$265030b2o$265029b2o$
265031bo778$265821b3o$265821bo$265822bo725$266540b2o$266539b2o$266541b
o1039$267594b2o$267593b2o$267595bo841$268436bo$268435b2o$268435bobo
482$268925b2o$268924b2o$268926bo631$269553b2o$269553bobo$269553bo1109$
270684b2o$270684bobo$270684bo464$271148b2o$271147b2o$271149bo565$
271715b2o$271714b2o$271716bo476$272201bo$272200b2o$272200bobo843$
273043bo$273042b2o$273042bobo387$273434b2o$273434bobo$273434bo514$
273952b3o$273952bo$273953bo625$274581b2o$274581bobo$274581bo561$
275137bo$275136b2o$275136bobo528$275666b2o$275666bobo$275666bo295$
275957b3o$275957bo$275958bo442$276417b2o$276417bobo$276417bo787$
277209b2o$277208b2o$277210bo555$277760b3o$277760bo$277761bo587$278341b
2o$278340b2o$278342bo464$278805b2o$278804b2o$278806bo326$279153bo$
279152b2o$279152bobo558$279709b2o$279708b2o$279710bo447$280161b3o$
280161bo$280162bo474$280632b2o$280631b2o$280633bo324$280957b2o$280956b
2o$280958bo630$281589bo$281588b2o$281588bobo539$282128b2o$282127b2o$
282129bo561$282684bo$282683b2o$282683bobo295$282975b2o$282974b2o$
282976bo388$283371bo$283370b2o$283370bobo696$284065b2o$284064b2o$
284066bo471$284542b2o$284541b2o$284543bo496$285034b3o$285034bo$285035b
o593$285643bo$285642b2o$285642bobo269$285918bo$285917b2o$285917bobo
517$286433b2o$286433bobo$286433bo468$286891b2o$286890b2o$286892bo560$
287461b2o$287460b2o$287462bo353$287792b2o$287791b2o$287793bo740$
288542bo$288541b2o$288541bobo535$289080bo$289079b2o$289079bobo853$
289919b2o$289919bobo$289919bo920$290860b2o$290859b2o$290861bo691$
291544b2o$291543b2o$291545bo644$292184bo$292183b2o$292183bobo522$
292707bo$292706b2o$292706bobo911$293619b2o$293619bobo$293619bo762$
294393b2o$294393bobo$294393bo1054$295448b3o$295448bo$295449bo423$
295866b3o$295866bo$295867bo871$296770b2o$296769b2o$296771bo644$297407b
3o$297407bo$297408bo291$297706b2o$297705b2o$297707bo353$298054b3o$
298054bo$298055bo753$298816b2o$298816bobo$298816bo488$299243b2o$
299242b2o$299244bo1158$300410b2o$300409b2o$300411bo1101$301496b2o$
301495b2o$301497bo1380$302878bo$302877b2o$302877bobo1667$304553bo$
304552b2o$304552bobo1190$305754b2o$305754bobo$305754bo1159$306912bo$
306911b2o$306911bobo1202$308115b2o$308114b2o$308116bo1218$309325b3o$
309325bo$309326bo1319$310648b3o$310648bo$310649bo1319$311966b3o$
311966bo$311967bo1500$313471bo$313470b2o$313470bobo1320$314793b3o$
314793bo$314794bo1226$316024b2o$316024bobo$316024bo1382$317404b3o$
317404bo$317405bo1580$318988b2o$318987b2o$318989bo1159$320151b2o$
320151bobo$320151bo1656$321811b2o$321811bobo$321811bo1625$323434b3o$
323434bo$323435bo1296$324735bo$324734b2o$324734bobo1330$326068b2o$
326068bobo$326068bo1334$327406b2o$327406bobo$327406bo1346$328751b2o$
328751bobo$328751bo1450$330204b2o$330203b2o$330205bo1150$331357b3o$
331357bo$331358bo1126$332488b2o$332488bobo$332488bo1075$333562b2o$
333562bobo$333562bo1283$334848b2o$334847b2o$334849bo1126$335978b2o$
335978bobo$335978bo1119$337101b2o$337101bobo$337101bo1232$338331b3o$
338331bo$338332bo1141$339477bo$339476b2o$339476bobo1119$340600bo$
340599b2o$340599bobo1360$341960b2o$341959b2o$341961bo986$342954b2o$
342953b2o$342955bo969$343926b2o$343925b2o$343927bo1108$345025b2o$
345024b2o$345026bo1133$346156b3o$346156bo$346157bo1417$347571bo$
347570b2o$347570bobo!""",418855,-418880)
glider_for_Snark = g.parse("bo$o$3o!",418852,-418907)
glider_for_splitter = g.parse("o$obo$2o!",-1223933,-2061737)

splitter_part = g.parse("""3o$o$bo526$531b2o$530b2o$532bo736$1266b2o$1265b2o$1267bo577$1839b3o$
1839bo$1840bo527$2369b2o$2368b2o$2370bo670$3051bo$3050b2o$3050bobo685$
3733b2o$3732b2o$3734bo484$4216bo$4215b2o$4215bobo1083$5304bo$5303b2o$
5303bobo567$5878bo$5877b2o$5877bobo623$6498bo$6497b2o$6497bobo404$
6902b3o$6902bo$6903bo949$7865b2o$7864b2o$7866bo456$8335bo$8334b2o$
8334bobo865$9194b2o$9193b2o$9195bo542$9738bo$9737b2o$9737bobo601$
10339b2o$10338b2o$10340bo497$10837b3o$10837bo$10838bo529$11379b2o$
11379bobo$11379bo631$12007b2o$12007bobo$12007bo683$12687b2o$12687bobo$
12687bo285$12988b3o$12988bo$12989bo760$13743b2o$13742b2o$13744bo559$
14311bo$14310b2o$14310bobo320$14635b2o$14634b2o$14636bo450$15073b3o$
15073bo$15074bo613$15700b2o$15700bobo$15700bo311$16022b3o$16022bo$
16023bo322$16349bo$16348b2o$16348bobo605$16946b2o$16945b2o$16947bo737$
17669b2o$17669bobo$17669bo408$18076b2o$18076bobo$18076bo572$18654bo$
18653b2o$18653bobo291$18946b3o$18946bo$18947bo445$19394b2o$19394bobo$
19394bo677$20072bo$20071b2o$20071bobo819$20891b3o$20891bo$20892bo304$
21217bo$21216b2o$21216bobo743$21944b2o$21943b2o$21945bo557$22498b2o$
22497b2o$22499bo393$22917b3o$22917bo$22918bo686$23599b2o$23598b2o$
23600bo267$23878b2o$23877b2o$23879bo653$24509b3o$24509bo$24510bo484$
24992b3o$24992bo$24993bo484$25478b3o$25478bo$25479bo618$26097bo$26096b
2o$26096bobo465$26566b2o$26566bobo$26566bo529$27111bo$27110b2o$27110bo
bo587$27685b2o$27685bobo$27685bo451$28148bo$28147b2o$28147bobo476$
28631bo$28630b2o$28630bobo239$28845bo$28844b2o$28844bobo988$29838bo$
29837b2o$29837bobo395$30237b3o$30237bo$30238bo1025$31275b2o$31275bobo$
31275bo370$31649b2o$31648b2o$31650bo496$32142b2o$32141b2o$32143bo619$
32760b2o$32759b2o$32761bo291$33051b2o$33050b2o$33052bo657$33709bo$
33708b2o$33708bobo922$34634b2o$34633b2o$34635bo432$35071b3o$35071bo$
35072bo753$35823b3o$35823bo$35824bo586$36416b3o$36416bo$36417bo344$
36756bo$36755b2o$36755bobo921$37684b2o$37684bobo$37684bo265$37957bo$
37956b2o$37956bobo554$38494b3o$38494bo$38495bo901$39395b2o$39395bobo$
39395bo1057$40452b2o$40451b2o$40453bo597$41045b2o$41045bobo$41045bo
867$41910b2o$41910bobo$41910bo877$42803b2o$42803bobo$42803bo570$43376b
3o$43376bo$43377bo707$44091bo$44090b2o$44090bobo570$44665b3o$44665bo$
44666bo725$45398bo$45397b2o$45397bobo470$45834b3o$45834bo$45835bo717$
46558b3o$46558bo$46559bo814$47367b2o$47366b2o$47368bo1034$48387b2o$
48387bobo$48387bo1214$49608bo$49607b2o$49607bobo838$50457bo$50456b2o$
50456bobo1474$51921b3o$51921bo$51922bo929$52878bo$52877b2o$52877bobo
788$53666b2o$53666bobo$53666bo890$54551bo$54550b2o$54550bobo506$55053b
3o$55053bo$55054bo1008$56072b2o$56071b2o$56073bo822$56898bo$56897b2o$
56897bobo918$57817b3o$57817bo$57818bo1034$58853b2o$58853bobo$58853bo
1200$60054b2o$60054bobo$60054bo764$60816b3o$60816bo$60817bo789$61620b
2o$61619b2o$61621bo594$62225b2o$62224b2o$62226bo659$62879b2o$62878b2o$
62880bo758$63651bo$63650b2o$63650bobo648$64291b2o$64291bobo$64291bo
1101$65375bo$65374b2o$65374bobo1114$66479bo$66478b2o$66478bobo1177$
67658b2o$67658bobo$67658bo787$68452bo$68451b2o$68451bobo986$69424b2o$
69424bobo$69424bo1563$70987b2o$70987bobo$70987bo1484$72480b2o$72479b2o
$72481bo1248$73748bo$73747b2o$73747bobo1014$74769bo$74768b2o$74768bobo
939$75709bo$75708b2o$75708bobo841$76540bo$76539b2o$76539bobo973$77510b
2o$77509b2o$77511bo1126$78628bo$78627b2o$78627bobo1135$79774b2o$79773b
2o$79775bo1314$81140bo$81139b2o$81139bobo365$81506bo$81505b2o$81505bob
o897$82405bo$82404b2o$82404bobo465$82874b2o$82873b2o$82875bo593$83458b
o$83457b2o$83457bobo740$84218b2o$84217b2o$84219bo512$84726b2o$84725b2o
$84727bo421$85142bo$85141b2o$85141bobo692$85831b2o$85830b2o$85832bo
904$86765b2o$86764b2o$86766bo330$87099bo$87098b2o$87098bobo596$87680b
2o$87680bobo$87680bo450$88141b2o$88141bobo$88141bo731$88868b2o$88867b
2o$88869bo463$89347bo$89346b2o$89346bobo261$89613b2o$89613bobo$89613bo
363$89967b2o$89967bobo$89967bo614$90582b3o$90582bo$90583bo472$91056b3o
$91056bo$91057bo568$91613b2o$91612b2o$91614bo659$92286b2o$92286bobo$
92286bo602$92882b2o$92882bobo$92882bo313$93206b2o$93206bobo$93206bo
661$93849b2o$93849bobo$93849bo412$94273b2o$94272b2o$94274bo714$94987b
2o$94986b2o$94988bo530$95523bo$95522b2o$95522bobo483$96017b2o$96017bob
o$96017bo444$96460b2o$96460bobo$96460bo646$97096bo$97095b2o$97095bobo
567$97664b3o$97664bo$97665bo390$98074b3o$98074bo$98075bo746$98820b2o$
98819b2o$98821bo399$99189b2o$99188b2o$99190bo944$100142b2o$100141b2o$
100143bo577$100724b2o$100723b2o$100725bo761$101480bo$101479b2o$101479b
obo763$102247b2o$102246b2o$102248bo1002$103262bo$103261b2o$103261bobo
623$103891bo$103890b2o$103890bobo531$104426b2o$104426bobo$104426bo386$
104802b2o$104801b2o$104803bo892$105706b2o$105705b2o$105707bo568$
106266bo$106265b2o$106265bobo503$106770bo$106769b2o$106769bobo946$
107720b2o$107720bobo$107720bo449$108163bo$108162b2o$108162bobo1094$
109268bo$109267b2o$109267bobo341$109613b2o$109612b2o$109614bo1032$
110651b3o$110651bo$110652bo504$111137b2o$111137bobo$111137bo863$
112014bo$112013b2o$112013bobo538$112527b2o$112526b2o$112528bo1092$
113619bo$113618b2o$113618bobo1000$114632b3o$114632bo$114633bo971$
115595bo$115594b2o$115594bobo777$116385bo$116384b2o$116384bobo1086$
117483b2o$117482b2o$117484bo823$118308b2o$118307b2o$118309bo791$
119099bo$119098b2o$119098bobo879$119980bo$119979b2o$119979bobo787$
120764b3o$120764bo$120765bo1290$122072bo$122071b2o$122071bobo503$
122568b2o$122568bobo$122568bo672$123241b3o$123241bo$123242bo476$
123720b3o$123720bo$123721bo840$124552bo$124551b2o$124551bobo1062$
125622b3o$125622bo$125623bo1048$126681b3o$126681bo$126682bo616$127308b
2o$127308bobo$127308bo839$128148b2o$128148bobo$128148bo658$128810b3o$
128810bo$128811bo225$129032b3o$129032bo$129033bo906$129938b2o$129937b
2o$129939bo351$130298b2o$130298bobo$130298bo713$131008bo$131007b2o$
131007bobo594$131598bo$131597b2o$131597bobo891$132499b2o$132498b2o$
132500bo382$132880b2o$132879b2o$132881bo685$133566b2o$133566bobo$
133566bo316$133887b3o$133887bo$133888bo640$134515b2o$134514b2o$134516b
o761$135286bo$135285b2o$135285bobo629$135902b3o$135902bo$135903bo803$
136727b3o$136727bo$136728bo936$137661b3o$137661bo$137662bo475$138146b
2o$138146bobo$138146bo645$138790b2o$138790bobo$138790bo684$139481b3o$
139481bo$139482bo583$140031b2o$140030b2o$140032bo887$140913b2o$140912b
2o$140914bo1286$142199b2o$142198b2o$142200bo961$143173b2o$143172b2o$
143174bo780$143951b2o$143950b2o$143952bo876$144813bo$144812b2o$144812b
obo1415$146231b2o$146231bobo$146231bo1273$147507b2o$147507bobo$147507b
o1152$148683b2o$148682b2o$148684bo1014$149689bo$149688b2o$149688bobo
881$150600b2o$150599b2o$150601bo945$151551bo$151550b2o$151550bobo362$
151915b3o$151915bo$151916bo1058$152980b3o$152980bo$152981bo574$153548b
2o$153547b2o$153549bo685$154225bo$154224b2o$154224bobo596$154820b3o$
154820bo$154821bo1133$155970bo$155969b2o$155969bobo405$156385bo$
156384b2o$156384bobo872$157249b2o$157248b2o$157250bo534$157781b2o$
157781bobo$157781bo891$158669b3o$158669bo$158670bo725$159387b3o$
159387bo$159388bo1046$160451bo$160450b2o$160450bobo792$161239b3o$
161239bo$161240bo531$161776bo$161775b2o$161775bobo1036$162815b2o$
162815bobo$162815bo893$163706bo$163705b2o$163705bobo!""",-1223934,-2061728)

splitter_slow_salvo = g.parse("""2o$obo$o228$229bo$228b2o$228bobo733$967bo$966b2o$966bobo572$1545b2o$
1545bobo$1545bo527$2075bo$2074b2o$2074bobo680$2747b2o$2746b2o$2748bo
680$3434bo$3433b2o$3433bobo481$3920b2o$3919b2o$3921bo1086$5005b2o$
5004b2o$5006bo572$5574b2o$5573b2o$5575bo618$6199b2o$6198b2o$6200bo403$
6604b2o$6604bobo$6604bo960$7556bo$7555b2o$7555bobo468$8014b2o$8013b2o$
8015bo857$8881bo$8880b2o$8880bobo542$9425b2o$9424b2o$9426bo599$10028bo
$10027b2o$10027bobo497$10526b2o$10526bobo$10526bo540$11057b3o$11057bo$
11058bo626$11690b3o$11690bo$11691bo678$12375b3o$12375bo$12376bo299$
12662b2o$12662bobo$12662bo752$13425bo$13424b2o$13424bobo566$13986b2o$
13985b2o$13987bo322$14308bo$14307b2o$14307bobo437$14759b2o$14759bobo$
14759bo625$15374b3o$15374bo$15375bo320$15687b2o$15687bobo$15687bo324$
16012b2o$16011b2o$16013bo595$16619bo$16618b2o$16618bobo722$17357b3o$
17357bo$17358bo405$17767b3o$17767bo$17768bo575$18342b2o$18341b2o$
18343bo291$18634b2o$18634bobo$18634bo446$19081b3o$19081bo$19082bo675$
19761b2o$19760b2o$19762bo818$20581b2o$20581bobo$20581bo323$20888b2o$
20887b2o$20889bo725$21633bo$21632b2o$21632bobo552$22192bo$22191b2o$
22191bobo418$22586b2o$22586bobo$22586bo679$23275bo$23274b2o$23274bobo
277$23544bo$23543b2o$23543bobo630$24198b2o$24198bobo$24198bo481$24684b
2o$24684bobo$24684bo484$25170b2o$25170bobo$25170bo616$25791b2o$25790b
2o$25792bo468$26257b3o$26257bo$26258bo542$26789b2o$26788b2o$26790bo
573$27377b3o$27377bo$27378bo460$27831b2o$27830b2o$27832bo481$28309b2o$
28308b2o$28310bo212$28550b2o$28549b2o$28551bo991$29540b2o$29539b2o$
29541bo398$29936b2o$29936bobo$29936bo1036$30963b3o$30963bo$30964bo371$
31336bo$31335b2o$31335bobo491$31834bo$31833b2o$31833bobo616$32455bo$
32454b2o$32454bobo289$32748bo$32747b2o$32747bobo656$33407b2o$33406b2o$
33408bo923$34331bo$34330b2o$34330bobo436$34764b2o$34764bobo$34764bo
750$35519b2o$35519bobo$35519bo591$36107b2o$36107bobo$36107bo337$36454b
2o$36453b2o$36455bo927$37376b3o$37376bo$37377bo270$37644b2o$37643b2o$
37645bo536$38199b2o$38199bobo$38199bo899$39102b3o$39102bo$39103bo1054$
40162bo$40161b2o$40161bobo592$40760b3o$40760bo$40761bo863$41629b3o$
41629bo$41630bo891$42508b3o$42508bo$42509bo571$43080b2o$43080bobo$
43080bo712$43790b2o$43789b2o$43791bo573$44361b2o$44361bobo$44361bo730$
45089b2o$45088b2o$45090bo435$45560b2o$45560bobo$45560bo722$46279b2o$
46279bobo$46279bo806$47096bo$47095b2o$47095bobo1019$48131b3o$48131bo$
48132bo1218$49348b2o$49347b2o$49349bo847$50188b2o$50187b2o$50189bo
1463$51663b2o$51663bobo$51663bo954$52595b2o$52594b2o$52596bo787$53384b
3o$53384bo$53385bo882$54277b2o$54276b2o$54278bo501$54784b2o$54784bobo$
54784bo1016$55795bo$55794b2o$55794bobo824$56619b2o$56618b2o$56620bo
918$57538b2o$57538bobo$57538bo1034$58574b3o$58574bo$58575bo1199$59776b
3o$59776bo$59777bo760$60542b2o$60542bobo$60542bo801$61334bo$61333b2o$
61333bobo603$61930bo$61929b2o$61929bobo652$62591bo$62590b2o$62590bobo
770$63351b2o$63350b2o$63352bo639$64000b3o$64000bo$64001bo1081$65104b2o
$65103b2o$65105bo1102$66220b2o$66219b2o$66221bo1178$67398b3o$67398bo$
67399bo791$68188b2o$68187b2o$68189bo971$69175b3o$69175bo$69176bo1561$
70740b3o$70740bo$70741bo1490$72227bo$72226b2o$72226bobo1266$73477b2o$
73476b2o$73478bo1019$74493b2o$74492b2o$74494bo938$75434b2o$75433b2o$
75435bo829$76277b2o$76276b2o$76278bo968$77252bo$77251b2o$77251bobo
1116$78380b2o$78379b2o$78381bo1144$79517bo$79516b2o$79516bobo1364$
80833b2o$80832b2o$80834bo364$81200b2o$81199b2o$81201bo897$82099b2o$
82098b2o$82100bo467$82566bo$82565b2o$82565bobo582$83161b2o$83160b2o$
83162bo758$83903bo$83902b2o$83902bobo506$84417bo$84416b2o$84416bobo
414$84840b2o$84839b2o$84841bo687$85534bo$85533b2o$85533bobo932$86440bo
$86439b2o$86439bobo332$86772b2o$86771b2o$86773bo580$87369b3o$87369bo$
87370bo459$87821b3o$87821bo$87822bo724$88555bo$88554b2o$88554bobo477$
89020b2o$89019b2o$89021bo265$89282b3o$89282bo$89283bo352$89647b3o$
89647bo$89648bo613$90263b2o$90263bobo$90263bo472$90737b2o$90737bobo$
90737bo554$91308bo$91307b2o$91307bobo672$91968b3o$91968bo$91969bo594$
92572b3o$92572bo$92573bo322$92887b3o$92887bo$92888bo641$93550b3o$
93550bo$93551bo421$93965bo$93964b2o$93964bobo712$94681bo$94680b2o$
94680bobo534$95213b2o$95212b2o$95214bo493$95697b3o$95697bo$95698bo441$
96143b3o$96143bo$96144bo633$96792b2o$96791b2o$96793bo567$97360b2o$
97360bobo$97360bo408$97752b2o$97752bobo$97752bo743$98501bo$98500b2o$
98500bobo367$98902bo$98901b2o$98901bobo951$99848bo$99847b2o$99847bobo
580$100427bo$100426b2o$100426bobo754$101190b2o$101189b2o$101191bo765$
101955bo$101954b2o$101954bobo1013$102959b2o$102958b2o$102960bo627$
103584b2o$103583b2o$103585bo534$104116b3o$104116bo$104117bo373$104505b
o$104504b2o$104504bobo902$105399bo$105398b2o$105398bobo558$105969b2o$
105968b2o$105970bo502$106474b2o$106473b2o$106475bo949$107421b3o$
107421bo$107422bo440$107873b2o$107872b2o$107874bo1103$108969b2o$
108968b2o$108970bo343$109312bo$109311b2o$109311bobo1037$110345b2o$
110345bobo$110345bo484$110851b3o$110851bo$110852bo874$111717b2o$
111716b2o$111718bo511$112257bo$112256b2o$112256bobo1090$113351b2o$
113350b2o$113352bo1012$114352b2o$114352bobo$114352bo960$115326b2o$
115325b2o$115327bo788$116105b2o$116104b2o$116106bo1096$117193bo$
117192b2o$117192bobo823$118018bo$118017b2o$118017bobo789$118811b2o$
118810b2o$118812bo879$119692b2o$119691b2o$119693bo783$120480b2o$
120480bobo$120480bo1305$121773b2o$121772b2o$121774bo495$122277b3o$
122277bo$122278bo671$122951b2o$122951bobo$122951bo477$123429b2o$
123429bobo$123429bo829$124272b2o$124271b2o$124273bo1069$125335b2o$
125335bobo$125335bo1057$126385b2o$126385bobo$126385bo625$127003b3o$
127003bo$127004bo838$127844b3o$127844bo$127845bo660$128504b2o$128504bo
bo$128504bo220$128731b2o$128731bobo$128731bo903$129640bo$129639b2o$
129639bobo359$129992b3o$129992bo$129993bo707$130708b2o$130707b2o$
130709bo588$131304b2o$131303b2o$131305bo899$132197bo$132196b2o$132196b
obo379$132581bo$132580b2o$132580bobo685$133267b3o$133267bo$133268bo
319$133585b2o$133585bobo$133585bo625$134228bo$134227b2o$134227bobo769$
134991b2o$134990b2o$134992bo615$135621b2o$135621bobo$135621bo823$
136426b2o$136426bobo$136426bo932$137364b2o$137364bobo$137364bo483$
137841b3o$137841bo$137842bo642$138488b3o$138488bo$138489bo689$139174b
2o$139174bobo$139174bo547$139760bo$139759b2o$139759bobo880$140649bo$
140648b2o$140648bobo1284$141937bo$141936b2o$141936bobo972$142900bo$
142899b2o$142899bobo776$143682bo$143681b2o$143681bobo860$144560b2o$
144559b2o$144561bo1417$145976b3o$145976bo$145977bo1274$147251b3o$
147251bo$147252bo1173$148406bo$148405b2o$148405bobo1004$149422b2o$
149421b2o$149423bo909$150305bo$150304b2o$150304bobo949$151252b2o$
151251b2o$151253bo363$151615b2o$151615bobo$151615bo1063$152675b2o$
152675bobo$152675bo565$153252bo$153251b2o$153251bobo675$153939b2o$
153938b2o$153940bo594$154536b2o$154536bobo$154536bo1147$155672b2o$
155671b2o$155673bo413$156079b2o$156078b2o$156080bo862$156953bo$156952b
2o$156952bobo531$157488b3o$157488bo$157489bo886$158381b2o$158381bobo$
158381bo716$159108b2o$159108bobo$159108bo1061$160157b2o$160156b2o$
160158bo787$160950b2o$160950bobo$160950bo534$161484b2o$161483b2o$
161485bo1038$162521b3o$162521bo$162522bo888$163417b2o$163416b2o$
163418bo!""",-15,-5)
glider_for_single_splitter = g.parse("3o$2bo$bo!",-44,-4)

compressed_single_channel = b'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'
decoded = base64.b64decode(compressed_single_channel)
bytedata = bz2.decompress(decoded)
single_channel_offsets = []
for b in bytedata:
  single_channel_offsets += [reversedict[b]]

makerecipe([0,2]+single_channel_offsets[1:])

single_channel_salvo = g.transform(g.getcells(g.getrect()),187503,187500)  # original offset was 187504,187500
trigger1 = g.parse("2o$obo$o!",1051323,1051362)
trigger2 = g.parse("3o$o$bo!",1461937,1461961)

# current minimum possible non-overclocked Speed Demonoid
d0 = 3285622
t0 = 16493928

# m will be the number of full diagonals added to the separation distance between the two halves
# n will be number of additional ticks of delay added to TRIGGER1,
#   so 2*n will be the number of ticks of delay added to TRIGGER2.
# Because of the relative speeds of the crabstretcher and fuse-burning reaction,
#   each additional tick of delay translates into one additional full diagonal NW that the crabstretcher travels.

p, q = target.numerator, target.denominator

# We need to solve (d0+2n)/(t0+8n+8m)=p/q

if target < Fraction(d0, t0): # n is about 0
    m, rem = divmod(d0*q-t0*p, 8*p)
    if rem:
        m += 1
else: # m is about 0
    m = 0

mod = q-4*p
if mod%2 == 0: mod //= 2   # gcd(q-4p, 8p) can be 1, 2 or 4. 
if mod%2 == 0: mod //= 2

m += (d0//2-t0//8-m)%mod   # divisibility adjustment

# The best we can do is to make period equal (q-4p)*2^k
if hfriendly == 1:
    adjust = (m-d0//2+t0//8)//mod
    adjust = 2**(adjust.bit_length())-adjust
    m += adjust*mod

n = (t0*p-d0*q+8*m*p)//(2*(q-4*p))

numerator = d0+2*n
denominator = t0+8*n+8*m

g.new("Demonoid with speed " + resp + " = " + str(numerator) + "c/" + str(denominator))
g.setrule("Life")

g.putcells(Snark_slow_salvo,m,-m)
g.putcells(glider_for_Snark,m,-m)
g.putcells(splitter_part,m-n,-m-n)
g.putcells(glider_for_splitter,m-n,-m-n)
g.putcells(splitter_slow_salvo)
g.putcells(glider_for_single_splitter)
g.putcells(single_channel_salvo)
trigger1phase = n % 4
if trigger1phase != 0:
  trigger1offset = (n-trigger1phase)//4 + 1
  g.putcells(g.evolve(trigger1,4-trigger1phase),trigger1offset,trigger1offset)
else:
  g.putcells(trigger1, n/4, n/4)
trigger2delay = n * 2
trigger2phase = trigger2delay % 4
if trigger2phase !=0:
  trigger2offset = (trigger2delay - trigger2phase)//4 + 1
  g.putcells(g.evolve(trigger2,4-trigger2phase),trigger2offset,trigger2offset)
else:
  g.putcells(trigger2,trigger2delay/4,trigger2delay/4)
g.fit()
Could someone try it out, please, and let me know if it doesn't work?

I think this version should work equally well in Python 2.x and Python 3.x, but I had to uninstall Python 2.x to force myself to get through the 2to3 upgrade process with every Python script I wanted to use... so I haven't actually tried it under Python 2.x.

EDIT: Here's an actual sample glider synthesis generated by the script -- a predecessor to a 3c/14 diagonal spaceship, but not the actual spaceship.
sd3c14-glider-synthesis.mc
(442.19 KiB) Downloaded 135 times

User avatar
cgoler2
Posts: 224
Joined: March 10th, 2021, 2:32 pm
Location: Living in a half-bakery

Re: Speed Demonoid

Post by cgoler2 » May 13th, 2021, 9:07 am

What about the Lua script that does the same thing?

User avatar
bubblegum
Posts: 959
Joined: August 25th, 2019, 11:59 pm
Location: click here to do nothing

Re: Speed Demonoid

Post by bubblegum » May 13th, 2021, 12:19 pm

cgoler2 wrote:
May 13th, 2021, 9:07 am
What about the Lua script that does the same thing?
Doesn't exist - this is an advanced enough script that the simplicity of using Python outweighs the consequence of not using Lua.
Each day is a hidden opportunity, a frozen waterfall that's waiting to be realised, and one that I'll probably be ignoring
sonata wrote:
July 2nd, 2020, 8:33 pm
conwaylife signatures are amazing[citation needed]
anything

Post Reply