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()
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.
Here's an actual sample glider synthesis generated by the script -- a predecessor to a 3c/14 diagonal spaceship, but not the actual spaceship.