├── pattern.gif
├── README.md
├── cc.sh
├── LICENSE
├── examples
├── tetheredrake.rle
├── hacksaw.rle
├── gunstar.rle
├── logt2growth.rle
├── infinitegliderhotel.rle
├── 3enginecordershipgun.rle
├── p94s.rle
├── primer.rle
├── infinitelwsshotel.rle
├── c5greyship.rle
├── breeder1.rle
└── tlogtgrowth.rle
├── bench
├── run.js
└── primer.js
├── macrocell.js
├── test.js
├── life.css
├── index.html
├── draw.js
├── formats.js
└── life.js
/pattern.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/copy/life/HEAD/pattern.gif
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | life
2 | ====
3 |
4 | The definite Conway's Game of Life implementation in your browser. Features an infinite field & Hashlife.
5 |
6 | All modern browsers are supported. I don't test IE, but it might work starting at version 9 or 10.
7 |
8 | The whole thing is written in Javascript, using the canvas tag.
9 |
10 |
11 | Links
12 | -
13 |
14 | - Online version: https://copy.sh/life/
15 | - List of examples: https://copy.sh/life/examples/
16 | - Source of examples (direct link): http://www.conwaylife.com/patterns/all.zip
17 |
--------------------------------------------------------------------------------
/cc.sh:
--------------------------------------------------------------------------------
1 | # Closure Compiler
2 | #
3 | # To compile, get the script from http://closure-compiler.googlecode.com/files/compiler-latest.zip
4 | # And put it into ~/.local or change the path below
5 |
6 | FILENAME="life-min.js"
7 |
8 | ls -l $FILENAME
9 |
10 | java -jar ~/www/v86/closure-compiler/compiler.jar \
11 | --compilation_level ADVANCED_OPTIMIZATIONS\
12 | --language_in ECMASCRIPT6_STRICT\
13 | --js_output_file $FILENAME\
14 | --warning_level VERBOSE\
15 | --js draw.js life.js formats.js macrocell.js main.js
16 |
17 | ls -l $FILENAME
18 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright 2012-2018 Fabian Hemmer
2 |
3 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
4 |
5 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
6 |
7 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8 |
9 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
10 |
--------------------------------------------------------------------------------
/examples/tetheredrake.rle:
--------------------------------------------------------------------------------
1 | #N Tethered rake
2 | #C A switch engine-based tethered rake
3 | #C http://www.conwaylife.com/wiki/index.php?title=Slide_gun#Tethered_r
4 | #C ake
5 | x = 134, y = 92, rule = b3/s23
6 | 87bo46b2$85b3obo44b$84bob2o46b$84b2obo46b$82bob3o47b2$84bo49b$55bobo
7 | 22bo53b$54bo24bobo52b$55bo2bo20b2o53b$57b3o23b2o49b$83bobo48b$78b2o5bo
8 | 48b$78b2o5b2o47b6$64b2o68b$65b2o67b$64bo69b$75b4o23bo31b$74bo7b2o6bo
9 | 11b3o29b$48bo25bo3b2o2b2o4b3o14bo23b2o3b$48b3o24bo2b2o7bo16b2o23bo4b$
10 | 51bo35b2o38bobo4b$32bo17b2o18b2o51b2o2b2o5b$20bo11b3o34b2o52b2o9b$18b
11 | 3o14bo35bo62b$2bo14bo16b2o58b3o13b2o22b$2b3o12b2o42b2o33bo13bobo21b$5b
12 | o30b3o22b2o33bo13bo5bo17b$4b2o23b2o5bo55bob2o19bo2b2o14b$22b3o3bo2b2o
13 | 4bo24bo6b2o20b2o21bo5bo13b$24bo2bo5bo27bobo4bobo46b2ob2o12b$5b2o15bob
14 | 2o2b3o2bo18b3o5bo2bo4bo44bo3b4o13b$5b2o15bob2obo3b3o17bo2bo4bo2bo4b2o
15 | 45bo4bo14b$24bob2o26bo24bo35b3o16b$29bo20bo4bo3bo2bo14b6o8b2o24bo11b2o
16 | 3b$13bo7b2o3bo2bo19bo5b3o3b2o14b2o2b2o8bo19b2o16bobo2b$12b3o33bo6b2o
17 | 36bo16bobo18bo2b$11b2o2bo32b4ob3o25bo10b2o16bo20b2ob$11bob4o32b2o3bo
18 | 22b2o2bo6b2o19b2o4b2o17b$11bo4bo4b2o36b2o16b2o3bo5bo24bo2bo9bo7b$11bo
19 | 2b2o5bo19b2o16bobo19bo7b3o21b2o10b3o6b$13b2o8bo16bobo18bo17bobo9bo29b
20 | 2o3b2o6b$22b2o16bo20b2o17bo40bo12b$9bo8b2o19b2o4b2o9bo63bo3bo9b$9bobo
21 | 6bo24bo2bo9bo63bo3b2o8b$9b2o8b3o21b2o7bo19b2o47bo4b2o6b$21bo31bo17bobo
22 | 60b$52bobo16bo50bo5bo5b$70b2o62b$122bo4bo4b2o$2b2o118bo2bo6bob$bobo47b
23 | 2o70b3o3b2obob$bo129bo2b$2o125bo6b$62b2o65bo4b$62bo65bo5b$56bo3bobo49b
24 | o21b$53bo6b2o27b2o21b3o19b$53bo2bo22b2o6bo2bo24bo18b$52b3o23bobo6b2o4b
25 | 2o19b2o18b$8b3o41b3o16b2o9bo10bo16b2o22b$7bo2bo31bo9bo2bo16bo6bobo9bob
26 | o16bo23b$12bo6b2o21b3o8bobo16bobo5bo10b2o19bo21b$6bo5bo4bo2bo24bo7b3o
27 | 17b2o36b2o21b$7bo4bo4b2o4b2o19b2o72bo15b$b2o6bo13bo16b2o76b2o14b$2bo
28 | 18bobo16bo77b2o14b$2bobo16b2o19bo91b$3b2o36b2o51bo39b$92b3o13b2o13b3o
29 | 8b$92b3o13b2o7b2o2bo3b4o5b$91bo3bo20b2o2bo4b4o5b$92b4o21b2obo3bo9b$19b
30 | 2o21bo49b2obo22b5o11b$18b4obo15bobob2o34b2o38bo8b2o4b$16b2o3bob2o14bo
31 | 3b2o12b2o16b2o2b2o47bo5b$16b2ob2o2bo33b2o15bobo38b2o12b3o2b$17b6o20bo
32 | 30bo23b2o16bo14bo2b$21bo19bobo29b2o23bo14b3o18b$9b2o37b2o8b2o39b3o11bo
33 | 20b$5b2o2b2o47bo42bo32b$4bobo38b2o12b3o72b$4bo23b2o16bo14bo72b$3b2o23b
34 | o14b3o88b$29b3o11bo90b$31bo!
--------------------------------------------------------------------------------
/examples/hacksaw.rle:
--------------------------------------------------------------------------------
1 | #N Hacksaw
2 | #O Dean Hickerson
3 | #C An orthogonal sawtooth with expansion factor equal to 9 that was fo
4 | #C und on August 7, 1992.
5 | #C www.conwaylife.com/wiki/index.php?title=Hacksaw
6 | x = 199, y = 102, rule = b3/s23
7 | 17b2o180b$18bo180b$91bo107b$91bobo105b$94b2o6b2o95b$52b2o24bo15b2o3bo
8 | 4bo94b$53bo23b2o15b2o3b2o4bo93b$34b2o17bobo5b2o13b2o13bobo11bo9bo83b$
9 | 33bobo18b2o5b3o11b3o13bo13bo8b2o83b$23b2o7b3o12bo15b2obo9b2o26bo94b$
10 | 23bo7b3o13b4o12bo2bo10b2o23b2o95b$16b3o13b3o4bobo6b4o11b2obo11bo120b$
11 | 15bo3bo13bobo3b2o7bo2bo9b3o135b$14bo5bo13b2o4bo7b4o9b2o136b$15bo3bo27b
12 | 4o4b2o17b2o123b$16b3o28bo7bobo16bo124b$16b3o38bo141b$57b2o140b$40b2o9b
13 | 2o64b2o80b$39bo2bo7bo2bo63bo81b$39b3o9b3o61bobo81b$14b3o25b9o64b2o82b$
14 | 13b2ob2o23bo2b5o2bo147b$13b2ob2o23b2o2b3o2b2o134bo12b$13b5o169bo11b$
15 | 12b2o3b2o163bo4bo11b$46bo136b5o11b$47bo151b$43bo3bo12bo138b$44b4o13bo
16 | 137b$56bo4bo123b2o12b$57b5o120b3ob2o11b$177b3o3b4o12b$184b2o13b$15bo
17 | 183b$15b2o182b$67b2o115bo14b$66bobo116bo13b$9bobo40bo12b3o8b2o101bo5bo
18 | 13b$7bo3bo40b4o8b3o10bo102b6o13b$2o5bo10b2o3b2o28b4o8b3o24bo106b$o5bo
19 | 10bobo3bo2bo15bo10bo2bo9bobo18b3ob2o3bo102b$7bo11bo7bo7bo6b2o9b4o10b2o
20 | 18b4o4b2o102b$7bo3bo15bo6b2o16b4o35b2o106b$9bobo15bo24bo146b$23bo2bo
21 | 38b2o16b2o114b$23b2o40bo16bobo114b$81b3o115b$81b2o79bo36b$84b2o77bo35b
22 | $83b3o71bo5bo35b$158b6o35b2$84bo114b$83b2o114b2$57bo126b2o13b$56b2o
23 | 122b4ob2o12b$45b2o8b2o11bo26bo84b6o13b$45bo8b3o9bobo26b2o84b4o12bob$
24 | 55b2o8bobo12bo54b5o58bo$56b2o2b2o2bo2bo11b2o14bo38bo4bo54bo3bo$57bo2bo
25 | 4bobo26bobo42bo55b4o$66bobo25bo2bo40bo20b4o27b3o6b$68bo26bo2bo59bo3bo
26 | 25b2ob2o6b$162bo21b3o3b3o6b$95bo65bo33b4o$95b2o97bo3bo$172b2o24bo$171b
27 | 4o22bob$171b2ob2o23b$66b2o105b2o6b6o12b$65b3o27bo73bo10bo5bo12b$55b2o
28 | 5bob2o12bo15b2o71bobo16bo12b$55bo6bo2bo12b2o29b2o58bo15bo13b$62bob2o
29 | 13b2o27bo64b2o24b$65b3o11b3o11bo13bo9b2o52b2ob2o23b$66b2o11b2o10bobo
30 | 13bo10bo17b2o33b4o24b$78b2o9b2o16bo27bo2bo33b2o25b$78bo10b2o17bo29bo
31 | 60b$89b2o18b2o27bo22b6o32b$91bobo41b2obo21bo5bo32b$93bo42bo29bo32b$
32 | 149b2obo2bo9bo33b$148b2o6bo42b$137bo12bobo3bo42b$136b2o15b4o42b4$168bo
33 | 30b$137bo29b2o30b$137b2o12bo14b2o8b2o21b$125bo23bobo13b3o9bo21b$125bob
34 | o20bobo15b2o31b$114b2o12b2o9b2o6bo2bo16b2o30b$114bo13b2o9bo8bobo17bo
35 | 30b$128b2o6b2o6b2o3bobo47b$125bobo7b3o7bo5bo47b$125bo10b2o61b$139bo59b
36 | $139b2o!
--------------------------------------------------------------------------------
/examples/gunstar.rle:
--------------------------------------------------------------------------------
1 | #N Gunstar
2 | #O David Buckingham
3 | #C A four-barreled true period 144 glider gun found in 1990.
4 | #C www.conwaylife.com/wiki/index.php?title=Gunstar
5 | x = 149, y = 149, rule = b3/s23
6 | 40b2o107b$40b2o107b$40b2o107b$40bo108b$39bobo107b$39bob2o106b2$46b2o
7 | 101b$40b2o4b2o101b$40b2o107b2$60bo26b2o60b$50b2o8b3o24bo61b$50bobo10bo
8 | 21bobo61b$50bo11b2o15bo5b2o4b2o56b$78b2o11b2o56b$51b2o25bobo68b$47bo3b
9 | o2bo37bo56b$46bo2bob3o37bobo55b$46b3obo39bo2bo55b$40b2o5bob3o37bo2bo
10 | 56b$40b2o11bo95b$40b2o22b2o23bo2bo56b$41bo22b2o25b2o56b$40bobo106b$39b
11 | 2obo12b3o91b$55bo93b$56bo92b$40b2o107b$40b2o57b3o47b2$73b2o20b3obo2bo
12 | 46b$74bo7b2o9bob3o51b$71b3o8b2o8bo6b3o47b$71bo20b2o55b2$95b2o52b$87b2o
13 | 9b2o49b$87b2o7bobo50b$43b2o52bo25bo19b2o4b$43b2o74b2o2b2ob3o10b2o4b4o$
14 | 102b2o15b2o4b4o10b2o2b2ob3o$84b2o15b3o19b2o18bo5b$43b3o34b2o2b2o2b2o
15 | 10bobo2bo2b2o39b$44b2o34bobo2bo2b2o10b2o2b2o2b2o39b$41b2o38b3o20b2o43b
16 | $31bo9b3o38b2o45b2o9b2o7b$29bo3bo8bobo83b2obo8b2o7b$29bo3bo9b2o84bo19b
17 | $29bobobo3bo90bobo18b$37b2o89b2o4b3o12b$31b2o6bo88bob3o3bo12b$31b2o3bo
18 | bo91bobo2bo13b$31b2o3bo90bo2bo18b$131bo17b$18b2o12bobo26bo60b2o25b$14b
19 | 2obo2bob2o9b2o26bobo57bobo25b$14b2o2bo4bo37b2o60bo25b$19bo129b$20bobo
20 | 20b2o104b$11bo25b2o4b2o91b2o11b$11b3o23b2o52b3o42bo12b$14bo76bo42bobo
21 | 12b$13b2o27b3o47bo41b2o13b$42b2o81b2o22b$32b2o11b2o78b2o22b$32b2o10b3o
22 | 102b$43bobo103b$16bo26b2o104b$14b2o133b$15b2o132b$114b2o33b$115bo33b$
23 | 115bobo31b$31b2o83b2o31b$31bobo115b$33bo115b$33b2o114b$132b2o15b$133b
24 | 2o14b$104b2o26bo16b$103bobo43b$102b3o10b2o32b$22b2o78b2o11b2o32b$22b2o
25 | 81b2o42b$13b2o41bo47b3o27b2o13b$12bobo42bo76bo14b$12bo42b3o52b2o23b3o
26 | 11b$11b2o91b2o4b2o25bo11b$104b2o20bobo20b$129bo19b$25bo60b2o37bo4bo2b
27 | 2o14b$25bobo57bobo26b2o9b2obo2bob2o14b$25b2o60bo26bobo12b2o18b$17bo
28 | 131b$18bo2bo90bo3b2o31b$13bo2bobo91bobo3b2o31b$12bo3b3obo88bo6b2o31b$
29 | 12b3o4b2o89b2o37b$18bobo90bo3bobobo29b$19bo84b2o9bo3bo29b$7b2o8bob2o
30 | 83bobo8bo3bo29b$7b2o9b2o45b2o38b3o9bo31b$43b2o20b3o38b2o41b$39b2o2b2o
31 | 2b2o10b2o2bo2bobo34b2o44b$39b2o2bo2bobo10b2o2b2o2b2o34b3o43b$5bo18b2o
32 | 19b3o15b2o84b$3ob2o2b2o10b4o4b2o15b2o102b$4o4b2o10b3ob2o2b2o74b2o43b$
33 | 4b2o19bo25bo52b2o43b$50bobo7b2o87b$49b2o9b2o87b$52b2o95b2$55b2o20bo71b
34 | $47b3o6bo8b2o8b3o71b$51b3obo9b2o7bo74b$46bo2bob3o20b2o73b2$47b3o57b2o
35 | 40b$107b2o40b$92bo56b$93bo55b$91b3o12bob2o39b$106bobo40b$56b2o25b2o22b
36 | o41b$56bo2bo23b2o22b2o40b$95bo11b2o40b$56bo2bo37b3obo5b2o40b$55bo2bo
37 | 39bob3o46b$55bobo37b3obo2bo46b$56bo37bo2bo3bo47b$68bobo25b2o51b$56b2o
38 | 11b2o78b$56b2o4b2o5bo15b2o11bo50b$61bobo21bo10bobo50b$61bo24b3o8b2o50b
39 | $60b2o26bo60b2$107b2o40b$101b2o4b2o40b$101b2o46b2$106b2obo39b$107bobo
40 | 39b$108bo40b$107b2o40b$107b2o40b$107b2o!
--------------------------------------------------------------------------------
/bench/run.js:
--------------------------------------------------------------------------------
1 | load("../life.js");
2 | load("../formats.js");
3 |
4 | load("gemini.js"); // defines gemini_rle
5 | load("primer.js"); // defines primer_rle
6 |
7 |
8 | function assert(x, msg)
9 | {
10 | if(!x)
11 | print("Assert failed: " + msg);
12 | }
13 |
14 | function measure(name, f)
15 | {
16 | var timer = Date.now();
17 | f();
18 | console.log(name + ": " + (Date.now() - timer));
19 | }
20 |
21 | var console = {
22 | log : function(x)
23 | {
24 | print(x);
25 | }
26 | };
27 |
28 |
29 |
30 | function load_and_run(pattern_str, name, tests)
31 | {
32 | var timer,
33 | life = new LifeUniverse(),
34 | pattern,
35 | bounds;
36 |
37 |
38 | print("Testing: " + name);
39 |
40 | timer = Date.now();
41 | pattern = formats.parse_pattern(pattern_str);
42 | print(" parse_pattern " + (Date.now() - timer));
43 |
44 | bounds = life.get_bounds(pattern.field_x, pattern.field_y);
45 |
46 | assert(!pattern.error, pattern.error);
47 |
48 |
49 | life.clear_pattern();
50 |
51 | life.make_center(pattern.field_x, pattern.field_y, bounds);
52 |
53 | timer = Date.now();
54 | life.setup_field(pattern.field_x, pattern.field_y, bounds);
55 | print(" setup_field " + (Date.now() - timer));
56 |
57 | for(var i = 0; i < tests.length; i++)
58 | {
59 | timer = Date.now();
60 |
61 | var rep = tests[i].repetitions || 1;
62 |
63 | for(var j = 0; j < rep; j++)
64 | tests[i].f(life);
65 |
66 | print(" " + tests[i].name + ": " + (Date.now() - timer));
67 | }
68 |
69 | print("");
70 | }
71 |
72 |
73 | load_and_run(
74 | gemini_rle,
75 | "gemini",
76 | [
77 | {
78 | name: "next generation",
79 | f: function(life) {
80 | life.next_generation(true);
81 | },
82 | repetitions: 5
83 | },
84 |
85 | {
86 | name: "16 generations",
87 | f: function(life) {
88 | life.set_step(4); // 16 generations at once
89 |
90 | for(var i = 0; i < 1; i++)
91 | life.next_generation(true);
92 | },
93 | },
94 |
95 | //{
96 | // name: "4096 generations",
97 | // f: function(life) {
98 | // life.set_step(12);
99 |
100 | // life.next_generation(true);
101 | // },
102 | //},
103 | ]
104 | );
105 |
106 |
107 | load_and_run(
108 | primer_rle,
109 | "primer",
110 | [
111 | {
112 | name: "next generation",
113 | f: function(life) {
114 | life.next_generation(true);
115 | },
116 | repetitions: 5000
117 | },
118 |
119 | {
120 | name: "256 generations",
121 | f: function(life) {
122 | life.set_step(8); // 256 generations at once
123 |
124 | for(var i = 0; i < 500; i++)
125 | life.next_generation(true);
126 | },
127 | },
128 |
129 | {
130 | name: "q generation",
131 | f: function(life) {
132 |
133 | life.next_generation(false);
134 | },
135 | },
136 | ]
137 | );
138 |
--------------------------------------------------------------------------------
/macrocell.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | function load_macrocell(universe, text)
4 | {
5 | const lines = text.split("\n");
6 |
7 | if(!lines[0].startsWith("[M2]"))
8 | {
9 | return;
10 | }
11 |
12 | let tree_start = 0;
13 |
14 | for(let i = 1; i < lines.length; i++)
15 | {
16 | if(lines[i][0] !== "#")
17 | {
18 | tree_start = i;
19 | break;
20 | }
21 | }
22 |
23 | if(!tree_start)
24 | {
25 | return;
26 | }
27 |
28 | const nodes = [];
29 | nodes[0] = undefined; // special: Empty pattern
30 |
31 | for(let i = tree_start; i < lines.length; i++)
32 | {
33 | const line = lines[i];
34 | const first = line[0];
35 |
36 | if(first === "$" || first === "." || first === "*")
37 | {
38 | const xs = [];
39 | const ys = [];
40 | let x = 0;
41 | let y = 0;
42 |
43 | for(let j = 0; j < line.length; j++)
44 | {
45 | const piece = line[j];
46 |
47 | if(piece === "$")
48 | {
49 | x = 0;
50 | y++;
51 | console.assert(y <= 8, "x");
52 | }
53 | else if(piece === ".")
54 | {
55 | x++;
56 | console.assert(x <= 8, "y");
57 | }
58 | else if(piece === "*")
59 | {
60 | xs.push(x);
61 | ys.push(y);
62 | x++;
63 | }
64 | else if(piece === "\r")
65 | {
66 | }
67 | else
68 | {
69 | console.assert(false, "Unexpected piece: '" + piece + "'");
70 | }
71 | }
72 |
73 | // leaf
74 | const node = universe.setup_field_recurse(
75 | 0,
76 | xs.length - 1,
77 | xs,
78 | ys,
79 | 3
80 | );
81 |
82 | nodes.push(node);
83 | }
84 | else if(line === "")
85 | {
86 | }
87 | else
88 | {
89 | // node
90 | const parts = line.split(" ");
91 | console.assert(parts.length === 5, "length");
92 | let [level, nw, ne, sw, se] = parts;
93 | level = +level;
94 | nw = +nw;
95 | ne = +ne;
96 | sw = +sw;
97 | se = +se;
98 |
99 | console.assert(level >= 4);
100 | console.assert(nw >= 0);
101 | console.assert(ne >= 0);
102 | console.assert(sw >= 0);
103 | console.assert(se >= 0);
104 |
105 | const nw_node = nw === 0 ? universe.empty_tree(level - 1) : nodes[nw];
106 | const ne_node = ne === 0 ? universe.empty_tree(level - 1) : nodes[ne];
107 | const sw_node = sw === 0 ? universe.empty_tree(level - 1) : nodes[sw];
108 | const se_node = se === 0 ? universe.empty_tree(level - 1) : nodes[se];
109 |
110 | console.assert(nw_node.level === level - 1);
111 | console.assert(nw_node);
112 | console.assert(ne_node);
113 | console.assert(sw_node);
114 | console.assert(se_node);
115 |
116 | const node = universe.create_tree(nw_node, ne_node, sw_node, se_node);
117 | nodes.push(node);
118 | }
119 | }
120 |
121 | universe.root = nodes[nodes.length - 1];
122 |
123 | return formats.parse_comments(text.substr(text.indexOf("\n") + 1), "#");
124 | }
125 |
126 | //if(false)
127 | //{
128 | // const vm = require("vm");
129 | // const fs = require("fs");
130 | //
131 | // vm.runInThisContext(fs.readFileSync("./formats.js"), { filename: "formats.js" });
132 | // vm.runInThisContext(fs.readFileSync("./life.js"), { filename: "life.js" });
133 | //
134 | // const text = fs.readFileSync("TetrisOTCAMP.mc", "utf8");
135 | //
136 | // load_macrocell(text);
137 | //}
138 |
--------------------------------------------------------------------------------
/test.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 | "use strict";
3 |
4 | const fs = require("fs");
5 | const vm = require("vm");
6 | const path = require("path");
7 |
8 | const EXAMPLES_DIR = "examples";
9 |
10 | vm.runInThisContext(fs.readFileSync("./formats.js"), { filename: "formats.js" });
11 | vm.runInThisContext(fs.readFileSync("./macrocell.js"), { filename: "macrocell.js" });
12 | vm.runInThisContext(fs.readFileSync("./life.js"), { filename: "life.js" });
13 |
14 | const SLOW_PATTERNS = [
15 | "24cellquadraticgrowth.rle",
16 | "25cellquadraticgrowth.rle",
17 | "26cellquadraticgrowth.rle",
18 | "Heisenburp.rle",
19 | "P1-pseudo-Heisenburp.rle",
20 | "catacryst.rle",
21 | "caterpillar.rle",
22 | "demonoid_synth.rle",
23 | "gemini.rle",
24 | "metacatacryst.rle",
25 | "otcametapixel.rle",
26 | "otcametapixeloff.rle",
27 | "p1megacell.rle",
28 | "p59glidergun8kx8k.rle",
29 | "p59glidergunoriginal.rle",
30 | "p6108-c4-rake.rle",
31 | "period59gun.rle",
32 | "p448dartgun.rle",
33 | "pulsarpixeldisplay8x2.rle",
34 | "switchenginepingpong.rle",
35 | "universalturingmachine.rle",
36 | "utm.rle",
37 | "jaws.rle",
38 | "constructor-memory-loop.rle",
39 | "7-in-a-row-Cordership-V-gun.rle",
40 | "H-to-C.rle",
41 | "c4-sideways-rake.rle",
42 | "constructor-memory-tape.rle",
43 | "high-bandwidth-telegraph.rle",
44 | "slow-salvo-MWSS-oscillator.rle",
45 | "switch-engine-ping-pong.rle",
46 | "single-channel-spiral-growth.rle",
47 | "traffic-lights-extruder.rle",
48 | ];
49 |
50 | const POPULATIONS_AFTER_PARSE = {
51 | // reported by Dave Greene: Uses non-'o' characters for alive cells
52 | "foureatershasslingfourbookends_synth.rle": 2074,
53 | };
54 |
55 | let files = fs.readdirSync(EXAMPLES_DIR);
56 | files = files.filter(f => f.endsWith(".rle") || f.endsWith(".mc"));
57 |
58 | for(let file of files)
59 | {
60 | const is_mc = file.endsWith(".mc");
61 |
62 | const life = new LifeUniverse();
63 | const rle = fs.readFileSync(path.join(EXAMPLES_DIR, file)).toString("utf8");
64 |
65 | if(is_mc)
66 | {
67 | load_macrocell(life, rle);
68 | continue;
69 | }
70 |
71 | const pattern = formats.parse_pattern(rle);
72 |
73 | if(pattern.error)
74 | {
75 | console.error("While parsing %s: %s", file, pattern.error);
76 | continue;
77 | }
78 |
79 | const bounds = life.get_bounds(pattern.field_x, pattern.field_y);
80 | life.make_center(pattern.field_x, pattern.field_y, bounds);
81 | life.setup_field(pattern.field_x, pattern.field_y, bounds);
82 |
83 | if(pattern.rule_s && pattern.rule_b)
84 | {
85 | life.set_rules(pattern.rule_s, pattern.rule_b);
86 | }
87 |
88 | const expected_population = POPULATIONS_AFTER_PARSE[file];
89 | if(expected_population)
90 | {
91 | if(expected_population !== life.root.population)
92 | {
93 | console.error(`File ${file}: Expected population of ${expected_population}, got ${life.root.population}`);
94 | continue;
95 | }
96 | }
97 |
98 | if(SLOW_PATTERNS.includes(file))
99 | {
100 | continue;
101 | }
102 |
103 | const generated_rle = formats.generate_rle(life, undefined,
104 | ["test comment", "another test comment"]);
105 | const new_pattern = formats.parse_pattern(generated_rle);
106 | console.assert(!new_pattern.error);
107 |
108 | if(pattern.rule_s && pattern.rule_b)
109 | {
110 | console.assert(new_pattern.rule_s === pattern.rule_s);
111 | console.assert(new_pattern.rule_b === pattern.rule_b);
112 | }
113 |
114 | const new_life = new LifeUniverse();
115 | const new_bounds = new_life.get_bounds(new_pattern.field_x, new_pattern.field_y);
116 | new_life.clear_pattern();
117 | new_life.make_center(new_pattern.field_x, new_pattern.field_y, new_bounds);
118 | new_life.setup_field(new_pattern.field_x, new_pattern.field_y, new_bounds);
119 |
120 | console.assert(new_bounds.left === bounds.left);
121 | console.assert(new_bounds.top === bounds.top);
122 | console.assert(new_bounds.right === bounds.right);
123 | console.assert(new_bounds.bottom === bounds.bottom);
124 |
125 | // may fail if the original rle file doesn't correctly specify the bounds
126 | // of the pattern
127 | //console.assert(pattern.width === new_pattern.width);
128 | //console.assert(pattern.height === new_pattern.height);
129 |
130 | for(let y = bounds.top; y <= bounds.bottom; y++)
131 | {
132 | for(let x = bounds.left; x <= bounds.right; x++)
133 | {
134 | console.assert(life.get_bit(x, y) === new_life.get_bit(x, y));
135 | }
136 | }
137 | }
138 |
--------------------------------------------------------------------------------
/life.css:
--------------------------------------------------------------------------------
1 | body {
2 | background-color: #000;
3 | margin: 0px;
4 | color: #ccc;
5 | font-family: sans-serif;
6 | height: 100%;
7 | overflow: hidden;
8 | }
9 | html {
10 | height: 100%;
11 | margin: 0px;
12 | }
13 | #toolbar {
14 | position: fixed;
15 | top: 0px;
16 | right: 0px;
17 | z-index: 10;
18 | color: #000;
19 | width: 100%;
20 | height: 0;
21 | overflow: visible;
22 | }
23 | #toolbar > div {
24 | float: right;
25 | }
26 | #statusbar > div {
27 | float: right;
28 | border-left: 1px solid #ccc;
29 | text-align: center;
30 | }
31 | #controls {
32 | padding: 5px;
33 | }
34 | #controls td div {
35 | background-color: #ccc;
36 | width: 18px;
37 | height: 18px;
38 | margin: 2px 1px;
39 | font-weight: bold;
40 | text-align: center;
41 |
42 | cursor: pointer;
43 | box-shadow: 2px 2px 3px #ccc;
44 | -webkit-user-select: none;
45 | -moz-user-select: none;
46 | font-size: 80%;
47 | line-height: 150%;
48 | }
49 | #statusbar {
50 | position: fixed;
51 | bottom: 25px;
52 | height: 0;
53 | right: 0px;
54 | font-size: 13px;
55 | z-index: 11;
56 | width: 99%;
57 | text-shadow: 0px 0px 1px #ccc;
58 | -webkit-user-select: none;
59 | -moz-user-select: none;
60 | }
61 | #label_step:before {
62 | content: "Step: ";
63 | }
64 | #label_fps:before {
65 | content: "FPS: ";
66 | }
67 | #label_gen:before {
68 | content: "Gen: ";
69 | }
70 | #label_pop:before {
71 | content: "Pop: ";
72 | }
73 | #label_gen, #label_pop, #label_mou, #label_zoom, #label_step, #label_fps {
74 | padding: 0px 1vw;
75 | }
76 | .button, .menu {
77 | margin-top: 5px;
78 | }
79 | .button, .menu > div {
80 | background-color: #ccc;
81 | cursor: pointer;
82 | padding: 0px 0.5vw;
83 | margin-right: 1vw;
84 | margin-bottom: 7px;
85 | box-shadow: 2px 2px 3px #ccc;
86 | -webkit-user-select: none;
87 | -moz-user-select: none;
88 | }
89 | /*
90 | .menu {
91 | overflow: hidden;
92 | height: 20px;
93 | }
94 | .menu:hover {
95 | height: auto;
96 | padding-bottom: 50px;
97 | }
98 | */
99 | #overlay {
100 | background-color: #000;
101 | position: absolute;
102 | top: 50px;
103 | padding: 20px 5px 50px;
104 | font-size: 13px;
105 | color: #ddd;
106 | z-index: 10;
107 | line-height: 1.4;
108 | border-style: solid;
109 | border-color: #444;
110 | border-width: 2px 0px;
111 | width: 100%;
112 | }
113 | @media (min-width: 850px) {
114 | #overlay {
115 | border-width: 2px;
116 | border-radius: 15px;
117 | left: 50%;
118 | margin-left: -400px;
119 | width: 700px;
120 | padding: 50px;
121 | }
122 | }
123 | @media (max-width: 800px) {
124 | #label_mou {
125 | display: none;
126 | }
127 | .button {
128 | padding: 0px 4px;
129 | }
130 | .not_on_small_screen {
131 | display: none;
132 | }
133 | }
134 | #pattern_name {
135 | cursor: pointer;
136 | }
137 | .button2 {
138 | border: 1px solid #fff;
139 | cursor: pointer;
140 | padding: 5px 20px;
141 | margin: 0px 20px;
142 | }
143 | .button2:hover {
144 | background-color: #123;
145 | }
146 | #import_text {
147 | background-color: #000;
148 | border: 1px solid #fff;
149 | display: block;
150 | width: 100%;
151 | height: 200px;
152 | color: #fff;
153 | }
154 | #loading {
155 | font-family: monospace;
156 | text-align: center;
157 | font-size: 36px;
158 | }
159 | input[type=number], input[type=text] {
160 | border: 1px solid #fff;
161 | color: #fff;
162 | background-color: #000;
163 | padding: 2px;
164 | width: 110px;
165 | text-align: center;
166 | }
167 | a, .link {
168 | color: #ff0;
169 | padding: 0px 1px;
170 | cursor: pointer;
171 | text-decoration: none;
172 | }
173 | a:hover, .link:hover {
174 | text-decoration: underline;
175 | }
176 | #pattern_description {
177 | white-space: pre-wrap;
178 | }
179 | #alert_text {
180 | max-height: 300px;
181 | overflow: auto;
182 | }
183 | canvas {
184 | position: absolute;
185 | }
186 | #pattern_chooser > div {
187 | height: 500px;
188 | }
189 | #pattern_chooser > div > div {
190 | padding: 3px;
191 | float: left;
192 | width: 215px;
193 | cursor: pointer;
194 | }
195 | #pattern_chooser > div > div:hover {
196 | color: #000;
197 | background-color: #ff0;
198 | }
199 | #pattern_chooser span.size {
200 | color: #999;
201 | font-size: 80%;
202 | margin-left: 7px;
203 | }
204 | #pattern_list {
205 | overflow-x: hidden;
206 | }
207 | br.clear {
208 | clear: both;
209 | }
210 | .left {
211 | float: left;
212 | }
213 | .right {
214 | float: right;
215 | }
216 | #overlay h2 {
217 | margin-top: 0;
218 | }
219 | #pattern_file_container, #pattern_link_container, #pattern_urls {
220 | overflow: hidden;
221 | text-overflow: ellipsis;
222 | }
223 |
--------------------------------------------------------------------------------
/examples/logt2growth.rle:
--------------------------------------------------------------------------------
1 | #N Log(t)^2 growth
2 | #O Dean Hickerson
3 | #C A pattern that experience infinite growth that is O(log(t)^2). Foun
4 | #C d in April 1992.
5 | #C www.conwaylife.com/wiki/index.php?title=Log(t)^2_growth
6 | x = 290, y = 218, rule = b3/s23
7 | 156bo133b$155bobo132b$155b2obo7b2o122b$140b2o13b2ob2o6bobo121b$139bobo
8 | 13b2obob3o6bo120b$125bo12b3o14bobo2bo2bo2bo2bo7b2o111b$125b4o8b3o16bo
9 | 4b2o6bo8bo111b$126b4o8b3o25bobo121b$115bo10bo2bo9bobo24b2o122b$115b2o
10 | 9b4o10b2o148b$125b4o8bo152b$125bo12bo151b$136b3o151b2$101bo188b$100b4o
11 | 186b$83b2o14b2obo187b$83bo2bo11b3obobo3b2o180b$87bo11b2obo6bo180b$74bo
12 | 12bo12b4o186b$74b2o11bo7bo5bo188b$42bo40bo2bo9bo193b$42bo40b2o9b3o13b
13 | 2o178b$44bo5bo59bobo177b$43bo6bobo58b3o176b$42bo3bo2bo62b2o176b$43bo2b
14 | obob2o57b2o179b$48bob2o57b3o178b$62b2o7b2o217b$62bo9bo217b$72bobo5bo
15 | 29bo179b$73b2o3bobo29b2o178b$77bobo9b3o2b2o194b$76bo2bo11bo2b3o193b$
16 | 77bobo10bo5b2obo190b$78bobo15bo2bo190b$70b2o8bo15b2obo190b$26b2o2bo39b
17 | o23b3o6b2o185b$29bobo62b2o7bobo184b$28bo76bo184b$105b2o183b$30b2o258b
18 | 2$31b2o75b3o179b$30bo47b2o29b3o178b$28b2ob2o45bo211b$31b2o257b$16bo12b
19 | o166bo93b$16bo22b3o154b2o92b$18bo5bo13bo251b$17bo6bobo10bo4b2o81bo164b
20 | $16bo3bo2bo12bo3bo85bo163b$17bo2bobob2o10bo2bo4bo41b2o36b3o71bo91b$22b
21 | ob2o10bo3bo3bo32bo8bo111b2o90b$37b2obob3o31bobo211b$40bo157bo91b$41b4o
22 | 31bo2bo117bobo90b$30b3o10b2o33b2o117bo2bo89b$29bo3bo45bo118bo2bo88b$
23 | 28bo4bo256b$27bo3bo166bo91b$27bo2bob3o163b2o90b$27bo7bo254b$2o2bo24bo
24 | 3bobo254b$3bobo23bo3bob2o155bob2o94b$2bo28b3ob2o155b2obo94b2$4b2o284b
25 | 2$5b2o283b$4bo146b2o137b$2b2ob2o52bobo90bo137b$5b2o51bo93bobo6bo128b$
26 | 3bo55bo2bo37bobo50b2o4bobo29bo98b$61b3o36bo3bo24bo27b2o15b2o14b2o98b$
27 | 104bo7bo16b3o25b2o16bo28b2o84b$105bo4b4o18bo24b2o18b2o23bo2bo84b$104bo
28 | 4bobob2o16b2o26bobo15b3o7bo13bo11b2o75b$92b2o6bo3bo3bo2bob3o45bo15b2o
29 | 6b4o12bo12bo75b$51bo22bo16bobo6bobo6bobob2o60bo8bobob2o11bo88b$50bobo
30 | 20bobo15bo18b4o8b2o50b2o7bo2bob3o11bo2bo84b$74b2o14b2o20bo9bobo59bobob
31 | 2o14b2o63b2o19b$50bo2bo70bo60b4o81bo19b$7b2o43b2o70b2o61bo26bo75b$7bo
32 | 45bo159bobo39b2o33b$196b2o14bo3b2o35bo2bo33b$123bo72bobo13bo3b2o3b2o
33 | 17bobo9bo11b2o24b$122bobo62bo9b3o12bo3b2o4bo17bo3bo7bo12bo24b$123bo63b
34 | 2o9b3o12bobo28bo7bo37b$197b3o14bo15bo14bo7bo2bo33b$196bobo31b2o12bo10b
35 | 2o12b3o18b$15b2o100b2o77b2o25b2o15bo3bo23bo3bo17b$15bo101bo104bo2bo14b
36 | obo24bo5bo16b$61b2o45b2o5bobo107bo41b2obob2o16b$60bo3bo42b3o5b2o108bo
37 | 64b$59bo5bo7bo18bo11bob2o114b2obo64b$49b2o8bo3bob2o4bobo18b2o10bo2bo
38 | 18bo96bo46bo12b2o5b$33bobo13bo9bo5bo3b2o22b2o9bob2o17b2o142bobo12bo5b$
39 | 32bo27bo3bo4b2o13bo8b3o11b3o159bobo18b$23b2o8bo2bo24b2o6b2o12b2o8b2o
40 | 13b2o15bo68bo28bo46b2o18b$23bo11b3o33bobo18b2o30bobo65bobo28b2o25b2o
41 | 20bo17b$73bo18bo31bo2bo56b2o4b2o10b2o3b2o41bo20b3o10bo5b$125bo2bo55bo
42 | 5b2o11b2o3bo29b2o8bobo19bo3bo7bo3bo3b$190b2o10bo7b2o27bo8b2o19bob3obo
43 | 6b5o3b$125bo66bobo15b3o16b2o10b2o22b2o3b5o6b2o3b2o2b$125b2o67bo15b2o
44 | 17bo11b3o22bo15b5o3b$208bo7b2o23b2o40b3o4b$31b2o174b2o7bobo20bo22b2o
45 | 20bo5b$31bo186bo19b2o23bo26b$94bo123b2o70b$94b2o194b$85b2o8b2o14bo137b
46 | o40b$85bo9b3o13bobo23bo111bobo12bo25b$95b2o15bobo20bobo111b2o14bo8b2o
47 | 14b$94b2o16bo2bo6b2o9b2o12b2o112bo4bo2bo4bo15b$94bo17bobo8bo9b2o13bo
48 | 77b2o33b2obo2bob2o4b3o12b$111bobo3bo7b2o6b2o91bo38b2o10bo12b$111bo5b2o
49 | 6b3o7bobo79bo6bobo63b$118bo6b2o10bo78b2o6b2o64b$123bo91b2o62b2o9b$122b
50 | 2o81bo8b3o63bo2b2o3b2o$205b2o8b2o73b$216b2o65bo5bo$217bo72b$209bo74b2o
51 | b2ob$209b3o47bo26bo3b$212bo44b3o30b$211b2o43bo33b$243b2o11b2o4b2o26b$
52 | 244bo18bo26b2$161b2o127b$162bo98bob2o25b$149b2o11bobo8b2o78b3o5bobo26b
53 | $150bo12b2o6bo2bo87bo19b3o5b$170bo12bo69bobo6b2o17bo3bo4b$170bo11b2o
54 | 68b5o5b2o16bo5bo3b$170bo80b2o3b2o4b2o16bo5bo3b$171bo2bo76b2o3b2o32b$
55 | 173b2o115b$149b3o138b$148b2ob2o137b$148b2ob2o6b2o129b$148b5o7b2o128b$
56 | 147b2o3b2o5bo130b2$255bo34b$226bo27b2o22bo5bo5b$223b4o34b2o10bo4b2o3b
57 | 2o5b$222b4o31b2obo2bob2o4b3o16b$212b3o7bo2bo27bo3bo4bo2bo4bo9b3o7b$
58 | 211b3o8b4o19bo6b2o7bo8b2o8b3o7b$147b2o68b2o4b4o7b2o9b3o12bo20bo8b$148b
59 | o67bobo7bo7bobo11bo41b$145b3o68bo19bo10b2o41b$145bo69b2o19b2o52b2$250b
60 | o14b2obob2o18b$248b2ob2o12bo5bo8bo9b$266bo3bo9b2o8b$247bo5bo13b3o20b2$
61 | 191bo55b2o3b2o36b$192bo42b2o53b$190b3o43bo53b4$266bo23b$266bo23b$265bo
62 | bo22b$264b2ob2o21b$233b2o3b2o23bo5bo20b$174b2o58b5o27bo23b$174bobo58b
63 | 3o25b2o3b2o20b$174bo61bo15bo37b$251b3o36b$250b5o35b$249b2o3b2o34b$250b
64 | 5o35b$250bo3bo35b$252bo37b$265bo24b$265b2o23b$233b3o54b$253bo36b$233bo
65 | bo16b2o36b$171b2o59b5o53b$172bo23b2o33b2o3b2o52b$197bo33b2o3b2o52b$
66 | 197bobo6bo83b$198b2o4bobo83b$202b2o10b2o3b2o69b$187b2o13b2o11b2o3bo69b
67 | $187b2o13b2o10bo7b2o66b$187b2o15bobo15b3o6bo4b2o52b$188bo17bo15b2o6b2o
68 | 4bo53b$187bobo30bo16b3o50b$186b2obo29b2o18bo50b3$187bo102b$187b2o101b$
69 | 204b2o84b$204bobo83b$204bo85b$215bo74b$213b4o73b$203bobo6bobob2o9b2o
70 | 61b$176bo26bo3bo3bo2bob3o9bo61b$173b4o30bo4bobob2o72b$172b4o7bo4b2o18b
71 | o4b4o73b$172bo2bo7b2o3bobo16bo7bo74b$172b4o6bobo4b3o11bo3bo82b$167b2o
72 | 4b4o13b3o10bobo84b$166bobo7bo12b3o98b$166bo21bobo99b$165b2o21b2o!
--------------------------------------------------------------------------------
/examples/infinitegliderhotel.rle:
--------------------------------------------------------------------------------
1 | #N Infinite glider hotel
2 | #O David Bell
3 | #C A pattern in which two pairs of Corderships recede and allow more and
4 | #C more gliders to bounce back and forth between them. Created on October 9, 1992.
5 | #C www.conwaylife.com/wiki/index.php?title=Infinite_glider_hotel
6 | x = 566, y = 572, rule = b3/s23
7 | 13b2o551b$13b2o551b6$13b3o550b2$13bobo550b$12b5o549b$11b2o3b2o548b$11b
8 | 2o3b2o548b4$2bo6bo556b$b2o6b2o555b$3o6b3o554b$b2o6b2o555b$2bo6bo556b
9 | 165$301bo264b2$297bo7bo260b$291b3o2bo8bo260b$291b3o2bo3b2o4bo259b$289b
10 | o2b2o2bo6bobo260b$289bobo10b2obo260b$289b3o274b$280b2o18bo265b$280b2o
11 | 284b$316bo249b$314b2ob2o247b2$314b2o250b$314bo251b$316bo3bo245b$272b2o
12 | 38bo3bo249b$272b2o292b$306bo259b$305bobo10bo247b$305bobo7bobo248b$304b
13 | o2bo6bo251b$304bobo8b2o249b$303bo11bobo248b$264b2o37b2o10bobo248b$264b
14 | 2o38bo9bob2o248b$313b2ob2o9bo238b$316b3o247b$323bo7bo234b$306bo15bo8bo
15 | 234b$272b3o30bobo14bo3b2o4bo233b$305bo16bo6bobo234b$270bo34bo22b2obo
16 | 234b$269b2o3bo30bo260b$270bobo53bo22b2o215b$273b3o28bo261b$273bo29b3ob
17 | 2o38bo3bo214b$301b2ob3o39bo219b$273b2o28bo41bo7bo212b$272b2o75bo4bo
18 | 211b$273bo70bo4bobobo212b$272b2o32bo37bo8bo212b$273b2o30bob2o35bob2o4b
19 | o213b$283bo20b2obob2o33b3ob2obo214b$276bo3bo2bobo2bo19bo36b2ob3o215b$
20 | 276b5ob2o4bo21bob2o4b2o12b2o232b$277bobo4bo3bo25bob2o8b2o4b2o232b$311b
21 | 4obob3o5b2o238b$284b3o28bo250b$285bo280b2$370bo195b$368b2obo194b$324b
22 | 2o41bo198b$318b2o4b2o40bo2bo3bo192b$318b2o45bo9bo190b$240b2o56b3o64b2o
23 | 2b2o4bo190b$239b2o124b2o199b$241bo21b2o31bo70bo5bo192b$262bobo30b2o3bo
24 | 64b3o4bo193b$252b2o7bo13bobo18bobo66b2o4bo3b2o189b$252b2o7bo2bo6b2o2bo
25 | 2bo20b3o14b2o48b4o196b$261bo8bobo5b2o19bo10b2o4b2o39bobo13bo3bo188b$
26 | 262bobo3bo3bo3bo3b2o4b2o22b2o45b3o12bo193b$263b2o2b2ob3o5b2o6b2o11b2o
27 | 57b2o11bo7bo186b$270b2o3bo2bo19b2o75bo4bo185b$275bobo21bo70bo4bobobo
28 | 186b$298b2o56bo13bo8bo186b$299b2o55bobo11bob2o4bo187b$261bo94b3o11b3ob
29 | 2obo188b$261bobo38b2o51bo15b2ob3o189b$238bo22b2o39b2o21bobo27b5o206b$
30 | 236bobo85b2ob2o12bo224b$227bo7bobo86b2obo12bobo223b$226b2o6bo2bo11b2o
31 | 72bo17bo224b$225b2o4b2o2bobo11b2o73bo18bo222b$215b2o7b3o4b2o3bobo15bo
32 | 69bo18b2o221b$215b2o8b2o4b2o5bo14bo87bo2bo221b$226b2o25b3o85b3o222b$
33 | 227bo107bo6bo223b$239bo94b3o229b$234b4o2bo9b4o26b4o84b2o196b$236bob3o
34 | 8bo3bo25bo3bo50b3o29b2o2bo5bo189b$237bo15bo29bo5b3o39b2ob2o30bo2b3o4bo
35 | 189b$234bo14bo2bo26bo2bo6bo43bo32bo4bo4bo189b$237bo52bo76b5o194b$234bo
36 | 134b2o195b2$227bo338b$227b2o337b$226bobo337b$370b2o194b$214b2o27bo126b
37 | 2o194b$213bobo26b2o322b$203b2o7bo6b2o4bo16bobo321b$203b2o7bo2bo2bo2bo
38 | 2bobo26bo312b$212bo6b3obob2o25bobo311b$213bobo6b2ob2o14bo8b2o3bo9b2o
39 | 84bobo212b$214b2o7bob2o14b4o5b2o3bo9b2o83b2ob2o211b$224bobo15b4o4b2o3b
40 | o94b2obo8b2o202b$225bo16bo2bo6bobo94bo12b2o202b$242b4o7bo72b2o22bo215b
41 | $241b4o80bobo22bo215b$241bo82b3o239b$324b2o240b$324b2o240b$325bobo238b
42 | $326bo27b2o210b$354b2o210b2$323b2o3b2o236b$323b2o3b2o236b2$319b3o3b3o
43 | 238b$319bo5b3o238b$203b2o115bo5bo239b$203b2o113bo247b$318b2o246b$317bo
44 | bo246b3$208bo114b3o240b$208bo114b3o240b$195b2o12bo112bo3bo239b$195b2o
45 | 8bob2o101b2o254b$204b2ob2o102b2o8b2o3b2o238b$205bobo102bo255b5$187b2o
46 | 114bo262b$187b2o114b2o261b$302bobo261b2$290b2o31b2o241b$289bobo31b2o
47 | 241b$188b2o89b2o7bo6b2o4bo264b$187b5o87b2o7bo2bo2bo2bo2bobo263b$182bo
48 | 4bo4bo32bo62bo6b3obob2o263b$182bo4b3o2bo30b2ob2o61bobo6b2ob2o10b2o251b
49 | $182bo5bo2b2o29b3o65b2o7bob2o10b2o251b$189b2o109bobo263b$222b3o76bo
50 | 264b$216bo6bo342b$215b3o348b$214bo2bo348b$214b2o18bo331b$215bo18bo331b
51 | $217bo17bo330b$216bobo12bob2o331b$217bo12b2ob2o331b$199b5o27bobo21b2o
52 | 309b$182b3ob2o15bo51b2o309b$181bob2ob3o11b3o363b$180bo4b2obo11bobo55b
53 | 2o306b$179bo8bo13bo56b2o305b$179bobobo4bo70bo306b$178bo4bo75b2o305b$
54 | 179bo7bo11b2o57b2o306b$186bo12b3o45b2o317b$181bo3bo13bobo39b2o4b2o10bo
55 | 306b$189b4o48b2o14b3o306b$182b2o3bo4b2o66bobo303b$186bo4b3o64bo3b2o83b
56 | o218b$185bo5bo70bo85bo217b$192b2o152b3o217b$183bo4b2o2b2o64b3o305b$
57 | 183bo9bo45b2o325b$185bo3bo2bo40b2o4b2o325b$191bo41b2o331b$187bob2o375b
58 | $188bo377b2$273bo292b$243bo28b3o291b$231b2o5b3obob4o318b$225b2o4b2o8b
59 | 2obo25bo3bo4bobo284b$225b2o12b2o4b2obo21bo4b2ob5o283b$208b3ob2o36bo19b
60 | o2bobo2bo3bo283b$207bob2ob3o33b2obob2o20bo290b$206bo4b2obo35b2obo30b2o
61 | 280b$205bo8bo37bo32b2o279b$205bobobo4bo70bo280b$204bo4bo75b2o279b$205b
62 | o7bo41bo28b2o280b$212bo39b3ob2o308b$207bo3bo38b2ob3o29bo280b$254bo28b
63 | 3o280b$208b2o22bo53bobo277b$253bo30bo3b2o276b$227bob2o22bo34bo277b$
64 | 227bobo6bo16bo312b$226bo4b2o3bo14bobo30b3o279b$227bo8bo15bo313b$227bo
65 | 7bo330b$240b3o323b$231bo9b2ob2o320b$241b2obo9bo38b2o271b$241bobo10b2o
66 | 37b2o271b$241bobo11bo310b$242b2o8bobo311b$244bo6bo2bo311b$241bobo7bobo
67 | 312b$240bo10bobo312b$252bo313b$285b2o279b$242bo3bo38b2o279b$238bo3bo
68 | 323b$244bo321b$243b2o321b2$240b2ob2o321b$242bo323b$277b2o287b$258bo18b
69 | 2o287b$267b3o296b$253bob2o10bobo296b$253bobo6bo2b2o2bo296b$252bo4b2o3b
70 | o2b3o298b$253bo8bo2b3o298b$253bo7bo304b2$257bo308b144$558bo4bo2b$556b
71 | 2ob4ob2o$552bo5bo4bo2b$551bo14b$551bo14b3$549b2o3b2o10b$550b5o11b$551b
72 | 3o12b$552bo13b8$552b2o12b$552b2o!
--------------------------------------------------------------------------------
/examples/3enginecordershipgun.rle:
--------------------------------------------------------------------------------
1 | #N 3-engine Cordership gun
2 | #O Paul Tooke
3 | #C A gun that fires 3-engine Corderships.
4 | #C www.conwaylife.com/wiki/index.php?title=3-engine_Cordership_gun
5 | x = 279, y = 258, rule = b3/s23
6 | 115bo163b$106bo8b2o162b$105bobo2b2o4b2o161b$105bobo2b2o4b3o7b2o151b$
7 | 106bo3b2o4b2o8b2o151b$115b2o62b2o98b$115bo63b2o98b$23b2o78b2o3b2o169b$
8 | 23b2o78b2o3b2o169b2$105b3o116b2o53b$24bo80b3o115bobo53b$23bobo80bo23b
9 | 2o90bo6b2o48b$22bo3bo86b2o14b2ob2o6b2o80bo2bo2bo2bob2o44b$22b5o86b2o
10 | 15bo2bo6b2o37bo42bo6b2o2b2o44b$21b2o3b2o102bo2bo44b3o31b3o8bobo28b2o
11 | 23b$22b5o73bobo28b2o44b5o42b2o28b2o23b$23b3o74bo3bo71b2o3b2o29bobo64b$
12 | 24bo65b2o12bo9b3ob3o10b2o78b5o63b$90b2o8bo4bo7bob2ob2obo8bo2bo27b2o47b
13 | 2o3b2o62b$104bo7b2o7b2o7bo2bo6b2o2b2o14b2ob2o6b2o37b2o3b2o62b$41b2o57b
14 | o3bo8bob2ob2obo7b2ob2o6b2o2b2o15bo2bo6b2o5b3o73bo24b$31b2o7bobo15b2o
15 | 40bobo11b3ob3o9b2o29bo2bo13b3o46b2o2bobo20bo24b$31b2o6b2obo15b2o102b2o
16 | 19b2o28bo6b2o4b3obo3bo12b2o4bobo23b$40b2o141b2o26b2o7b2o3b2o6bo13b2o3b
17 | 2ob2o22b$17b2o22bo120b2o14b2o6b2o6b2o30bob5o18bo5bo21b$17bobo141bo2bo
18 | 12bo2bo5b3o5b2o11bo2bo16b3o24bo24b$8b3ob2o4b3o20bo102b2o15bo2bo13b2o6b
19 | 2o17bobo2bo40b2o3b2o21b$8b4o2bo4b3o18b2o102b2o14b2ob2o18b2o12b2o4b2o9b
20 | o12b3o33b2o14b$12b2o4b3o18b2obo15b2o101b2o20b2o12b2o4b2o6bo14bob5o30bo
21 | bo13b$17bobo20bobo15b2o143b2o8b2o10b2o6bo13b2o5bo3b2o4b3o12b$17b2o22b
22 | 2o162bobo18b3obo3bo12b2o4bob3o2bo4b3o11b$207bo19b2o2bobo19bob2ob2o4b3o
23 | 12b$186b2o66bo8bobo13b$186b2o75b2o14b$53b2o224b$54bo224b$54bobo8b2o
24 | 119b3o90b$20b2o5b2o26b2o6bo2bo7bo111b3o70b2o18b$20b2o5b2o33bo7b2o3bo
25 | 177bo5b2o18b$62bo6bo5bo176b3o24b$62bo7b5o176bo3bo14bo8b$63bo2bo117b2o
26 | 3b2o60b2ob2o13b3o7b$65b2o118b5o78b5o6b$76b2o108b3o63b3o12b2o3b2o5b$77b
27 | o109bo64b3o13b5o6b$77bobo8b2o84bo93bo3bo6b$78b2o7b3o83bobo93bobo7b$84b
28 | ob2o9b2o73bob2o94bo8b$84bo2bo4bo5bo67b2o3b2ob2o103b$84bob2o5bo72b2o4bo
29 | b2o103b$87b3o3bo3bo75bobo70bo7b2ob2o10b2o8b$88b2o5bo78bo48b2o19b3o7b2o
30 | b2o10b2o8b$223bo19bo10b2ob2o20b$210bo10bobo19b2o7bob2ob2obo18b$19b2obo
31 | 3bob2o66b2o111bobo9b2o29b3o3b3o18b$19bo2bo3bo2bo67bo83b2o19b2o3b2o3bo
32 | 40bo5bo19b$20b3o3b3o68bobo10bo69bo2bo18b2o3b2o3bo27b3o36b$98b2o9b4o67b
33 | o7bo18b2o3bo27b3o36b$108b2obobo3b2o61bo2bo3bobo19bobo27bo3bo35b$107b3o
34 | bo2bo2b2o61b2ob2ob2ob2o19bo27bo5bo34b$108b2obobo70bobo52bo3bo35b$109b
35 | 4o70b2ob2o52b3o36b$110bo168b$130bo148b$20b2o108b3o119b2o5b2o18b$20b2o
36 | 111bo118b2o5b2o18b$132b2o47b3o3b3o89b$180bo9bo88b$180bo3bobo3bo88b$14b
37 | 2o165b3o3b3o89b$14bobo165bo5bo90b$9b2o6bo223b2o36b$5b2obo2bo2bo2bo116b
38 | 3o104b2o36b$5b2o2b2o6bo115bo3bo141b$14bobo8b3o251b$14b2o116bo5bo140b$
39 | 25bobo104b2o3b2o140b$24b5o250b$23b2o3b2o249b$23b2o3b2o105bo92bo50b$
40 | 134bobo89b3o50b$134bobo88bo53b$26bo109bo44b2o5b2o35b2o52b$27b2o107bo
41 | 44b2o5b2o89b$133bo2bo86bo55b$29bo104b2o86b3o54b$221bo3bo53b$25bo2bo
42 | 194bo55b$25b2o193bo5bo52b$220bo5bo52b$221bo3bo53b$222b3o54b4$228bo2bo
43 | 47b$231bo7b3o23bo13b$227bo9bo4bo21bobo12b$227b2o8bo5bo19bob2o12b$233bo
44 | 8bo19b2ob2o10b2o$52b2o14bo7b2o145b2o5b2o8b2o21bob2o10b2o$51bobo13b2o6b
45 | o2bo12b2o130b2o39bobo12b$50bo6b2o7bo8bo2b2o11b2o137b2o8b2o23bo13b$41b
46 | 2o7bo2bo2bo2bo7b2obo4bo2bo154bo8bo36b$41b2o7bo6b2o9b3o6bo149b2o8bo5bo
47 | 10b2o23b$51bobo173bo9bo4bo11b2o23b$52b2o14b3o6bo153bo7b3o19b3o15b$65bo
48 | b2obo4bo2bo18b2o129bo2bo28b2ob2o14b$56b3o5bo10bo2b2o11b2o4bobo160b2ob
49 | 2o14b$56b3o5bo3bo6bo2bo12b2o5b3o159b5o14b$11b2o42bo3bo5b4o7b2o21b2o
50 | 158b2o3b2o13b$10bobo13b3o5b4o12b2o2bo5bo38b2o178b$9b3o4b2o8bo7b2obo12b
51 | 2o3bo3bo37bobo179b$2o6b3o4bo2bo7b2obo7bo18b3o39bo180b$2o7b3o4b2o10b2o
52 | 5b2o242b$10bobo247b2o17b$11b2o15b2o5b2o58b2o3b2o177b$16bo9b2obo7bo57b
53 | 2o3b2o177b$15bobo5b4o7b2obo12b2o227b$14bo3bo4b6o5b4o12b2o45b3o162b2o
54 | 15b$14b5o67bo10b3o162b2o15b$13b2o3b2o66b2o10bo180b$14b5o58b2o2b2o4b2o
55 | 190b$15b3o38b2o19b2o2b2o4b3o189b$16bo39b2o23b2o4b2o190b$86b2o191b$86bo
56 | 192b4$92b2o185b$74b2o16b2o185b$74b2o203b$15b2o262b$15b2o262b2$93bo5bo
57 | 179b$92b3o3b3o178b$91bo2b2ob2o2bo177b$91bo3bobo3bo177b$93bobobobo179b$
58 | 72b2obob2o200b$90b2ob2o3b2ob2o176b$72bo5bo13bo7bo178b$63b2o214b$63b2o
59 | 8b2ob2o201b$54b2o3bo6b2o7bo203b$54bobo3bo5b3o210b$55b5o6b2o211b$56b3o
60 | 4b2o214b$63b2o214b4$51b2o16b2o208b$51b2o16b2o208b$75b3o201b$74bo3bo13b
61 | 2o5b2o178b$74b2ob2o13b2o5b2o178b2$74b2ob2o200b$76bo202b$148bo130b$147b
62 | obo129b$147b2obo128b$69bo7bo69b2ob2o3b2o122b$49b2o3b2o12bo2bo3bo2bo68b
63 | 2obo4b2o122b$40bobo8b3o18bobo61b2o9bobo129b$40bo2bo6bo3bo17bobo60bobo
64 | 10bo130b$31b2o10b2o6bobo18bobo60bo143b$31b2o8bo3b2o5bo15bo2bo3bo2bo55b
65 | 2o143b$36b2o5b2o24b3o3b3o201b$35bo4bo2bo235b$40bobo236b4$46b2o5bo225b$
66 | 27b2o17b2o4b3o224b$27b2o22b2ob2o223b2$50bobobobo12b2o5b2o201b$69b2o5b
67 | 2o201b$51b2ob2o61bo161b$51b2ob2o60bobo160b$53bo60b2o3bo159b$114b2o3bo
68 | 9b2o148b$28bo85b2o3bo9b2o148b$27b3o80b2o4bobo160b$26b5o78bobo5bo161b$
69 | 25b2o3b2o77bo169b$20bo87b2o169b$19bobo257b$7b2o10b2obo256b$7b2o10b2ob
70 | 2o3b3o15b2obo3bob2o223b$19b2obo4b3o15bo2bo3bo2bo223b$19bobo24b3o3b3o
71 | 224b$20bo258b4$22b2o4b3o248b$22b2o3bo3bo247b$27b2ob2o247b$28bobo15b2o
72 | 5b2o39bo184b$46b2o5b2o39b4o181b$28bobo64b4o180b$27b2ob2o63bo2bo5b2o
73 | 173b$27bo3bo63b4o5b2o173b$28b3o54b2o7b4o181b$84bobo7bo184b$84bo194b$
74 | 83b2o194b6$21b3o5b3o247b$21bo2b2ob2o2bo247b$22b3o3b3o248b$23bo5bo249b$
75 | 63bobo213b$63bo2bo212b$66b2o211b$64bo3b2o4b2o203b$66b2o6b2o203b$55b2o
76 | 6bo2bo212b$22b2o5b2o23bobo6bobo213b$22b2o5b2o23bo224b$53b2o224b3$37bo
77 | 3bo237b$21b2o13bobobobo8b4o224b$21bobo10b2o2bobo2b2o6bo2b2o6b2o215b$
78 | 16b2o6bo9b2o7b2o7bo2b2o5b2o215b$12b2obo2bo2bo2bo9b2o2bobo2b2o7bo2bo
79 | 223b$12b2o2b2o6bo11bobobobo10b2o224b$21bobo13bo3bo237b$21b2o30b2o224b$
80 | 52bo2bo223b$35b2o15bo2b2o5b2o215b$35b2o14bo2b2o6b2o215b$51b4o224b4$27b
81 | 3o249b$26bo3bo248b$25bo5bo5bobo239b$26bo3bo4bo3bo239b$27b3o5bo12b2o
82 | 229b$27b3o4bo4bo8b2o229b$35bo243b$35bo3bo239b$37bobo!
--------------------------------------------------------------------------------
/examples/p94s.rle:
--------------------------------------------------------------------------------
1 | #N P94S
2 | #O Dean Hickerson
3 | #C A true period 94 twelve-barreled glider gun based on the AK47 react
4 | #C ion.
5 | #C www.conwaylife.com/wiki/index.php?title=P94S
6 | x = 607, y = 155, rule = b3/s23
7 | 368bo49bo104bo83b$368b3o47b3o102b3o81b$371bo49bo104bo80b$370b2o48b2o
8 | 103b2o80b$421b3o183b$422b2o183b$422bobo182b10$465b2o7bo132b$465b2o5b3o
9 | 14bo7b2o108b$66bo65bo7b2o329bo8bo8b3o5b2o108b$66b2o40b2o7bo14b3o5b2o
10 | 303bo7b2o16b2o5b3o2bo8bo49b2o63b$65bobo40b2o5b3o8bo8bo309b3o5b2o22bo5b
11 | 3o5b2o16b2o7bo23bobo62b$114bo8bo2b3o5b2o16b2o7bo258b2o7bo18bo17bo10b2o
12 | 7bo22b2o5b3o23bo64b$88bo7b2o16b2o5b3o5bo22b2o5b3o169b2o7bo79b2o5b3o17b
13 | 2o16b2o18b2o6b3o19bo91b$54b2o32b3o5b2o22bo7bo11b3o15bo18bo7b2o144b2o5b
14 | 3o14bo7b2o34bo7b2o17bo8bo28bob6obo18bo3bo18b2o90b$54bobo34bo28b2o6bo2b
15 | o7bo3bo14b2o17b3o5b2o79bo7b2o61bo8bo8b3o5b2o34b3o5b2o17b2o5b3o17bo9b3o
16 | 2bob2o2b2o15bo5bo50b2o5bo7b2o42b$54bo35b2o40bo6b2ob2o27bo8bo17b2o7bo
17 | 34b2o7bo14b3o5b2o35bo7b2o16b2o5b3o2bo8bo43bo29bo20b2o9bo4bo4bo16bo5bo
18 | 14b3o34b2o4b3o5b2o42b$42b2o7bo55b3o7bo12bo8bo4bo6b3o17b3o5b2o17b2o5b3o
19 | 5b2o27b2o5b3o8bo8bo41b3o5b2o22bo5b3o5b2o16b2o7bo16b2o16b3o11bo12bob6ob
20 | o9b2o5b2o17bo5bo13bo3bo14b2o7bo8bo9bo48b$42b2o5b3o54bo2bo7b2o21b2ob2o
21 | 5bo3bo7b2o10bo29bo7bobo33bo8bo2b3o5b2o16b2o7bo6b2o10bo28b2o7bo22b2o5b
22 | 3o10b2o21bo3bo7bo2bo10b2o2b2obo2b3o10bo3bo20bo3bo13bo5bo13b2o5b3o17b2o
23 | 48b$48bo18bo7b2o29b3o7bobo25bo5b2ob2o6bobo9b2o29b2o8bo7bo7b2o16b2o5b3o
24 | 5bo22b2o5b3o7bob3o5b2o36b2o9bo18bo8bo3b2o10bo11b2ob2o6bo15bo4bo4bo11bo
25 | bobo21b3o14bo5bo19bo70b$48b2o17b3o5b2o11bo7b3o13b2o25b2ob2o5bo4bo8bo
26 | 58b3o5b2o22bo7b2o14bo13bo9bob2o55bo3bo15b2o5b3o5bo8bo3bo7bo4bo8bo14b2o
27 | 5b2o13b3o39bo5bo19b2o69b$70bo16b2o7bo2bo12bo26b3o7b2ob2o32bobo27bo8bo
28 | 28b2o21bobo12b2o12bo21bo36bo21bo21bo7b2ob2o26bo3bo16bo41bo3bo91b$69b2o
29 | 16bobo7b3o11bob2o21bob2o9bo33b2o4bo4b3o19b3o5b2o12b3o36bob2o45b2ob2o
30 | 35bo10bo9b2o21bo6bo30bobobo59b3o92b$92b2o17bob2o19b2ob2o11b2ob2o27bo6b
31 | o29bo55bob2o49bo31b4obo8bo3bo25b4obo8b2ob2o26b3o155b$48bo44bo18b2o23b
32 | 2o13b3o28b2obo2bo2bo5bo19b2o17bo4bo31b2o47bo15bo25b3o6bo34b3o8b3o27bo
33 | 107bo48b$46b4o41b2obo59b2obo21b3o6bo3bo5bo34b3obo4bo78b2ob2o14bo17bo
34 | 14bo28bo19b2obo131b2o48b$46b2o2bo40b2obo60b2ob2o18bo3bo9bo5bo8bo34bo8b
35 | o71bo16b2o15bobo14bob4o21bobo19b2ob2o35b2o91bo2bo47b$45bo3bo42b2o61b2o
36 | 20bo5bo22b2o23bo18b2o34b2o24bo23b2o3bo14bo3bo11b3o25bo3bo18b2o39bo34b
37 | 2o54b3o49b$46b3o21bo71b2o33bo16b3o8bo2bo22bo4bob3o8bo2bo9b2o19b2obo24b
38 | o27b2o15bo3bo20bo18bo3bo56b3o5b2o28bo56bo2bo47b$46b3o20b2o35b2o34bo34b
39 | ob2o3bo22bo14bo8bo4bo14bo10b2o17b2obo25b2o24b5o15bo4bo18bobo17bo4bo55b
40 | o8bo22b2o5b3o33b3o12b3o3b2o48b$55b2o11bo2bo35bo28b2o5b3o34bo28b2o11b2o
41 | 29b2o7bobo3b2o12bobo25bo3b2o41bo2bo18bo3bo17bo2bo62b3o5b2o16bo8bo32bo
42 | 3bo11bobo8bo44b$53bo13b3o34b3o5b2o22bo8bo35bobo20bo5bo10bo2bo8b3o12bo
43 | 5bo12b2obo12bo14b2o11b2o46b2o18bo3bo19b2o13b2o29b2o16bo7b2o10b2o5b3o
44 | 37bo5bo10bo2bo8b2o42b$50bo2bo2bo11bo2bo32bo8bo16b2o5b3o64bo4bo12bo25bo
45 | 4bo14bobo27b2o11b5o13b2o47bo4bo35bo29bo37b2o7bo16b2o18bo3bo3bo10bobo7b
46 | 2o43b$49b3o3bo7b3o3b2o39b3o5b2o10b2o7bo16b2o29b2o15bob3o10b2o27bob3o
47 | 16bo22b2o3bobo30bo34b2o12bo2bo26b2o5b3o5b2o17b2o5b3o61bo18bo2bobo2bo
48 | 10b3o52b$48bob5o8bobo8bo17b2o16bo7b2o37bo29bo17b2o12bo5bo23b2o25b2o13b
49 | ob2o32b3o5b2o28bo13b2o28bo6bo8bo17b2o7bo58b3o5b2o12bo3bo3bo23b2o40b$
50 | 52b2o9bo2bo8b2o15bo61b3o5b2o17b2o5b3o5b2o22bo4bo14b2o34bo14bobo33bo8bo
51 | 22b2o5b3o34b2o5b3o9b3o5b2o31bo37bobo7bo7b2o13bo5bo24bo41b$40b2o9bo12bo
52 | bo7b2o10b2o5b3o58bo7b2o17bo8bo6bo23b3obo15bo28b2o5b3o12bo40b3o5b2o16bo
53 | 8bo34bo8bo9bo7b2o29bobo37b2o36bo19b2o5b3o38b$41bo9bo12b3o19b2o7bo79b2o
54 | 5b3o9b3o5b2o19b2o13b3o5b2o22bo8bo35b2o16bo7b2o10b2o5b3o34b2o5b3o55b2o
55 | 38bo31bo3bo20bo8bo38b$20b2o16b3o5b2o127b2o7bo9bo8bo34bo8bo16b2o5b3o41b
56 | o37b2o7bo16b2o16b2o7bo127bo18b2o5b3o44b$21b2o15bo8bo59bo92b3o5b2o34b3o
57 | 5b2o10b2o7bo16b2o17b2o5b3o61bo154bo17b2o7bo24b3o17b$20bo23b3o5b2o17b2o
58 | 35bo31bobo57bo7b2o16b2o16bo7b2o37bo17b2o7bo58b3o5b2o145b3o5b2o45bo19b$
59 | 44bo7b2o17bo34b3o31b2o84bo61b3o5b2o79bo7b2o145bo7b2o46bo18b$65b2o5b3o
60 | 66bo78b2o5b3o58bo7b2o309b$65b2o7bo145b2o7bo377b4$334bo26bo245b$335b2o
61 | 24bobo243b$334b2o25b2o244b2$539bo67b$246bobo19bo268bo3bo65b$247b2o19bo
62 | bo220b5o14bo31bo42b5o17b$60b3o184bo20b2o220bo4bo14bobo24bo4bo41bo4bo
63 | 17b$12b2o45b5o42b2o387bo14b2o26b5o46bo17b$11b2ob3o41b2ob3o41b2ob3o379b
64 | o3bo89bo3bo18b$12b5o42b2o45b5o381bo93bo20b$13b3o81bobo7b3o260b3o91b3o
65 | 91b3o41b2o3b$89bo8b2o83bo185b5o45b2o42b5o45b2o42b5o39bo2bo2b$3b2o82bo
66 | 3bo6bo82bo3bo183b3ob2o41b3ob2o41b3ob2o41b3ob2o41b3ob2o39b2o3b$2bo2bo
67 | 33b5o42bo46b5o42bo46b5o140b2o42b5o45b2o42b5o45b2o45b$3b2o34bo4bo41bo4b
68 | o41bo4bo41bo4bo41bo4bo184b3o91b3o93b$39bo46b5o42bo46b5o42bo375b2o2b$
69 | 40bo3bo89bo3bo89bo3bo370bo3b$2b2o38bo93bo93bo373b3o$3bo602bo$3o604b$o
70 | 606b2$445b2o7bo152b$144bo126b2o172b2o5b3o152b$143b2o7bo7b2o109bobo57b
71 | 2o118bo7b2o9bo7b2o127b$143bobo6b3o5b2o109bo60b2o117b2o5bobo9b3o4bo2bo
72 | 126b$127b2o7bo18bo175bo128bo3bo8bo6bo126b$127b2o5b3o17b2o308b3o5b2o3bo
73 | 129b$133bo8bo324bo9bo3bo5bo119b$133b2o5b3o21bo277bo23b2o8bo9bo120b$
74 | 139bo24bo144b2o7bo122bobo31bo2bobo5b3o118b$139b2o23bo144b2o5b3o121bo3b
75 | o30bo2bobo126b$288bo7b2o17bo18bo7b2o97bobo31bobo2bobo124b$122b2o36b3o
76 | 3b3o119b3o5b2o17b2o17b3o5b2o98bo11bo25bo2bo123b$124bo138b2o7bo18bo36bo
77 | 8bo115bobo25b2o124b$121bobo40bo98b2o5b3o17b2o36b3o5b2o118bo24b2o124b$
78 | 122bobo39bo104bo8bo52bo123b2o150b$136bo11b2o14bo8bo95b2o5b3o51b2o120b
79 | 2obo17b2o132b$135bobo9bo6bo17b2o101bo40bo113b2o19bo2bo17b2obo131b$138b
80 | o14b3o16bobo100b2o15bo22b2o21bo90bobo19bobo19bo2bo130b$137b2o13bo3bo
81 | 111bo22bo2bo19bo22bo2bo8bo81bo20bo21b2o131b$134b2obo15b2obo110bobo21bo
82 | 2b2o18b2o21bo2b2o6bobo256b$133bo2bo17b2o106b2o3bobo26bo23b3o19bo4bo
83 | 259b$133bobo131b2o22b2o3bo22b4o14b2o3bo5b2o99b2o156b$134bo126b2o26bo5b
84 | o22b2obo2bo10bo5bo108bo156b$156b2o104bo31bo23b2o2bobo15bo106b3o5b2o17b
85 | 2o131b$156bo119b3o3bobo3bo4bo15bo7bo2b2o6bobo3bo4bo107bo7b2o17bo132b$
86 | 131b2o17b2o5b3o122bo2bo2bo19bo8bobobobo4bo2bo2bo133b2o5b3o129b$132bo
87 | 17b2o7bo114bo5b2o2bo23b3o6bo5bo4bobo137b2o7bo129b$129b3o5b2o135bo5bo
88 | 38b3o285b$129bo7b2o135bo5bo38b3o285b$299bo13b2o30bo261b$276b3o21b2o12b
89 | o31b2o259b$292b2o5b2o10b3o5b2o17b2o5b2o145bo114b$292bo18bo7b2o17bo90bo
90 | bo58bobo114b$267b2o17b2o5b3o36b2o5b3o87b2o60b2o114b$257bo10bo17b2o7bo
91 | 36b2o7bo31bo7b2o47bo176b$257bobo5b3o5b2o98b3o5b2o224b$179bo44b2o7bo6b
92 | 2o15b2o6bo7b2o101bo230b$180bo43b2o5b3o7b2o124b3o5b2o16b2o7bo204b$178b
93 | 3o49bo9bo126bo25b2o5b3o204b$196b2o6bo7b2o16b2o136bo30bo207b$195b2o7b3o
94 | 5b2o185b2o5b3o198b$197bo9bo13bo186bo198b$206b2o12bobo162bo21bo199b$
95 | 219b2obo160b2ob2o219b$221b2obo160bo221b$224b2o148bo15bo216b$373bo14b2o
96 | b2o214b$365b2o5b2o16bo216b$212b2o71bo79b2o5bo3b2o23bo205b$213bob2o19b
97 | 2o47bobo76b3o6b2o27bo204b$215bob2o17b2o47b2o86b5o24b2o203b$215bobo12b
98 | 2o3bobo160b2o3bo4b4o195b$200b2o14bo12bob2o168b2o5b3obo194b$200b2o27bob
99 | o151b2o13b5o6b2o196b$200bobo3b2o22bo152bo223b$205b2obo13b2o153b2o5b3o
100 | 220b$206bobo14bo153bo8bo220b$207bo12b3o5b2o141b2o5b3o226b$220bo8bo141b
101 | 2o7bo16b2o208b$226b3o5b2o162bo208b$208b2o16bo7b2o37b2o120b3o5b2o202b$
102 | 208bo63bobo120bo7b2o202b$202b2o5b3o60bo334b$202b2o7bo59b2o334b5$379bo
103 | 227b$377b2o228b$378b2o227b3$231bo375b$229bobo375b$230b2o!
--------------------------------------------------------------------------------
/bench/primer.js:
--------------------------------------------------------------------------------
1 | var primer_rle = "#N Primer\n#O Dean Hickerson\n#C A prime number sieve created in November 1991.\n#C www.conwaylife.com/wiki/index.php?title=Primer\nx = 440, y = 294, rule = B3/S23\n412b2o$410b2ob2o13b2o$410b4o13b4o$411b2o14b2ob2o$93b3o11b3o319b2o$93bo\n2bo10bo2bo$93bo6b3o4bo16b3o11b3o$93bo5bo2bo4bo15bo2bo10bo2bo$94bo4b2ob\no5bo17bo4b3o6bo285b2o$126bo4bo2bo5bo284bo2bo$125bo5bob2o4bo285bo2b2o$\n424bo2b2o$99bo8bo315b4o$99bobo5b3o278bo7bo$107bob2o14bo8bo254bo7b2o$\n100bo2bo4b3o13b3o5bobo249bo4bo6b2o30b2o$101b3o4b2o13b2obo258b5o29b4o4b\n4o$102bo20b3o4bo2bo280bo3bo3bo4b2ob2o$124b2o4b3o282bo6bo6b2o$131bo279b\no3bo5bo$412b4o$91b3o313b3o$90bo2bo311b2ob2o26b2o$93bo46b3o264b3o17b4o\n4b4o$93bo46bo2bo268b4o10bo3bo4b2ob2o$92bo47bo270bo3bo14bo6b2o$106b3o3b\n3o25bo274bo13bo$105bo2bo3bo2bo25bo272bo18bo$108bo3bo6b3o3b3o253bo49bo$\n96b3o9bo3bo5bo2bo3bo2bo253b2o47bo2b2o$98bo8bo5bo7bo3bo255b2o47bo5bo$\n97bo12bo10bo3bo9b3o293bobo2b2o$110bo9bo5bo8bo295bo3b2o$109bobo11bo12bo\n296b3o$101b3o19bo$76bo13bo12bo18bobo$75b3o11b3o10bo27b3o303b2o$75bob2o\n4bo5bob2o37bo12bo13bo277b4o$76b3o3b3o5b3o38bo10b3o11b3o245bo13b2o15b2o\nb2o$76b2o3b2o2bo4b2o49b2obo5bo4b2obo244bo13b4o16b2o$81bo3bo24b3o28b3o\n5b3o3b3o245b3o11b2ob2o$81bob2o57b2o4bo2b2o3b2o261b2o$81b2o38b3o24bo3bo\n$149b2obo213bo$75b3o73b2o214b2o42b2o$74bo2bo288b2o41b2ob2o$77bo78b3o\n250b4o$77bo78bo2bo246bo3b2o$76bo79bo248b2o$156bo249bo3b2o$102b3o52bo\n251b4o$102bo2bo303b2ob2o$102bo26b3o279b2o$92bo9bo25bo2bo227bo$91b3o8bo\n28bo226bo$55b3o11b3o19bob2o8bo27bo9bo216b3o36b4o$54bo2bo10bo2bo20b3o\n36bo8b3o253bo3bo$57bo4b3o6bo20b2o36bo8b2obo239b2o16bo$57bo4bo2bo5bo67b\n3o209bo21b4o4b4o14bo$56bo4bo8bo69b2o21bo13bo9b2o163b2o18bo3bo4b2ob2o$\n97bo5bo58b3o11b3o7b4o161b2o23bo6b2o$96b3o3b3o57bob2o4bo5bob2o6b2ob2o\n184bo$62b2o31b2obo3bob2o4b2o18bo5bo26b3o3b3o5b3o8b2o189bo$62bo7bo24b3o\n5b3o4bobo16b3o3b3o25b2o3b2o2bo4b2o198bo$69b3o24b2o5b2o6b2o9b2o4b2obo3b\nob2o29bo3bo28bo175bo2b2o$68b2obo49bobo4b3o5b3o29bob2o30bo173bo5bo$68b\n3o29bo20b2o6b2o5b2o30b2o28bo3bo174bobo2b2o$69b2o28b3o97b4o174bo3b2o$\n98bo3bo30bo28b3o26bo2b3o117bo64b3o$132b3o26bo2bo25b2o2bobo116bo$72bo5b\no52bo3bo28bo26bo2b3o116b3o$71b3o3b3o18b2ob2o61bo34b4o179b2o$53b3o15bob\n2ob2obo20bo62bo34bo3bo178b4o25b2o$53bo2bo15b3ob3o52b2ob2o66bo133bo27b\n2o15b2ob2o15b4o4b4o$53bo18b2o3b2o33bo20bo67bo135b2o24b4o16b2o15bo3bo4b\n2ob2o$53bo57b2o41b3o3b3o16bo29bo126b2o25b2ob2o36bo6b2o$54bo20bo35bobo\n7bo31bo2bo3bo2bo14b3o29bo154b2o36bo$74bobo10bo33b2o33bo3bo17b3o25bo3bo\n16bo$73bo3bo9b2o31bobo33bo3bo19bo26b4o17bo$58b2o14bobo9bobo57bo8bo5bo\n16bobo43bo3bo128b2o49b2o$57bobo14b3o68b2o11bo19bo46b4o126b2ob2o48bobo$\n59bo85bobo10bo192bo3b4o49bob2o$157bobo16bo172b2obo3b2o51b2o$82b3o90b2o\n92bo79bo3bo55bo$82bo2bo89bobo90bo80b2obo3b2o$82bo66b3o72b3o41b3o80bo3b\n4o$82bo65bo2bo74bo128b2ob2o50b2o$83bo67bo72bobo130b2o50b4o$151bo60bo\n11b2o166b2o15b2ob2o$150bo59bo2bo177b4o16b2o$210bo2bo129b4o44b2ob2o$\n211bo5b2o8bo114bo3bo46b2o$216b4o8bo117bo$216b2ob2o3bo3bo116bo$73b2o\n143b2o5b4o156b2o$72bobo308b2ob2o$67b3o4bo304bo3b4o$67bo2bo90bo215b2obo\n3b2o$67bo92b2o215bo3bo$67bo92bobo10bo13bo189b2obo3b2o$67bo104b3o11b3o\n52bo29bo29bo29bo47bo3b4o$68bo103bob2o4bo5bob2o51b3o27b3o27b3o27b3o49b\n2ob2o$173b3o3b3o5b3o54bo29bo29bo29bo50b2o11b2o$173b2o3b2o2bo4b2o54b2o\n28b2o28b2o28b2o19bo39b4ob2o$178b2ob2o172bo38b6o$178bo2b3o165bo5bo15b4o\n20b4o$179bob2o167b6o14bo3bo29b2o$181bo192bo28b4o$172b3o2bo3bo191bo29b\n2ob2o$171bo2bo3bobo224b2o$174bo4bo221bo$174bo71b2o28b2o28b2o28b2o28b2o\n31bobo$173bo72bobo27bobo27bobo27bobo27bobo32bo$164b3o80b2o28b2o28b2o\n28b2o28b2o36b2o$163bo2bo236b2ob2o$166bo3b3o230b4o$166bo3bo2bo15bo214b\n2o$166bo3bo17b3o194b2o8b4o$166bo3bo16b2obo192b2ob2o6b6o$165bo5bo15b3o\n135b2o52bo3b4o7b4ob2o$188b2o134b4o46b2o2bobo3b2o12b2o$167b3o154b2ob2o\n44bo2b2o3bo$167bobo76b2o28b2o28b2o18b2o46b2o2bobo3b2o$167b3o76bobo27bo\nbo27bobo10bobo57bo3b4o$247b2o28b2o22b2o4b2o9bo2b2o24b2o34b2ob2o$301bo\n17bobo16b4o4b4o35b2o5b2o5b4o$145b3o11b3o5b3o156b2o9bo3bo4b2ob2o9bo29b\n2ob2o3bo3bo$145bo2bo10bo2bo5bo155b2ob2o12bo6b2o11bo28b4o8bo$145bo6b3o\n4bo164b4o12bo15bo4bo29b2o8bo$145bo5bo2bo4bo140b3o14bo7b2o30b5o$146bo4b\n2obo5bo129b4o5b5o13b2o16bo$289bo3bo5b3ob2o11bobo12bo3bo62b2o$293bo8b2o\n26bo3bo9bo52bo2bo$285bo6bo38bo12b6o42b2o3bo2bo$152b2o6bo88bo29bo7b3o\n32bo9b2o9bob3o44bo3b2ob2o$152bo6b3o86b2o28b2o5bo6bo29b2o13b2o9bo48b2o$\n159bob2o130bo27bobo13bo37b3o$160b3o126bo3bo83bo$107b2o6b2o43b2o128b4o\n53b2o27bo$106b4o4b4o228b4o49b4o$106b2ob2o3b2ob2o227b2ob2o33bo13bo3bo$\n108b2o6b2o7b2o47b3o120b4o30b2o15b2o35bo16bo$123b2ob2o46bo2bo118bo3bo\n28b2ob2o47bo3bo15bo$123b4o16b3o28bo125bo14b4o10b4o49b4o$124b2o16bo2bo\n28bo9b2o8bo104bo14bo3bo11b2o$145bo28bo8b4o8bo51bo70bo$145bo29bo7b2ob2o\n3bo3bo52bo68bo$120b4o20bo40b2o5b4o48bo3bo$116b2o2bo2b2o120b4o$117bo3bo\n2b2o114b3o25b2o39b2o3b2o$121bo2bo113b2ob2o24b4o36bo6bobo$122b2o67bo31b\n2o15b3o24b2ob2o34bo2bo6bo$146b2o44b2o30b2o19b4o20b2o34b2o7b3o$81b5o58b\n2ob2o44bo29bo20bo3bo5bo51b2o$80bo4bo31bo26b4o13b3o29bo54bo6bo6b2o$85bo\n32bo6b2o18b2o7bo6bo2bo27bo54bo3bo3bo4b2ob2o$84bo29bo3bo4b2ob2o24bobo6b\no56b5o29b4o4b4o$108b4o3b4o4b4o26b2o6bo55bo4bo38b2o45b2o5b4o$107bo3bo\n12b2o36bo31bo27bo83b2ob2o3bo3bo$111bo83bo25bo33bo50b4o8bo$103b2o2bo2bo\n65bo14bo3bo11b2o45bo3b3o46b2o8bo$103b3o71bo14b4o10b4o43bo3bob3o$103b2o\n2bo2bo62bo3bo28b2ob2o43bo6b2o$111bo62b4o30b2o15b2o28b5obo$107bo3bo111b\n2ob2o29b4o$108b4o89bobo19b4o31bo$167b4o31b2o20b2o12b2o$166bo3bo31bo36b\n2o$170bo67bo23b2o$162b2o2bo2bo51b3o20b2o14b2ob2o$162b3o31bobo20bo3b2o\n18b4o13b4o$162b2o2bo2bo27b2o20bobo2b2o17b2ob2o13b2o$170bo8b2o16bo20bo\n5bo20b2o$166bo3bo5b3ob2o37bo2b2o$167b4o5b5o38bo$177b3o22b2o17bo$201b4o\n12bo$201b2ob2o12bo6b2o$194bo2bo5b2o9bo3bo4b2ob2o$185b2o2bo4bo3bo16b4o\n4b4o$170b2o12bo2bo2bo2bo4b2o24b2o$169bobo13b2o2b3o2bo3bo$156b2o11b2o\n14b3o2bo3bo2bo5b2o$155bobo31bo11b2ob2o$157bo43b4o$202b2o3$200b2o$155bo\n43b4o$153bobo31bo11b2ob2o$154b2o11b2o14b3o2bo3bo2bo5b2o$167bobo13b2o2b\n3o2bo3bo$168b2o12bo2bo2bo2bo4b2o24b2o$183b2o2bo4bo3bo16b4o4b4o$192bo2b\no5b2o9bo3bo4b2ob2o$199b2ob2o12bo6b2o$199b4o12bo$103bo71b3o22b2o17bo$\n103b2o60b4o5b5o38bo$102bobo59bo3bo5b3ob2o37bo2b2o$168bo8b2o16bo20bo5bo\n$160b2o2bo2bo27b2o20bobo2b2o$160b3o31bobo20bo3b2o$160b2o2bo2bo51b3o$\n168bo$164bo3bo31bo$165b4o31b2o20b2o$105b2o92bobo19b4o$b6o31b2o63b2ob2o\n113b2ob2o$o5bo28b3ob2o58bo3b4o65b4o30b2o15b2o$6bo28b5o54b2o2bobo3b2o\n65bo3bo28b2ob2o$5bo30b3o54bo2b2o3bo73bo14b4o10b4o$94b2o2bobo3b2o68bo\n14bo3bo11b2o$99bo3b4o86bo$103b2ob2o84bo$105b2o5b2o5b4o28b2o$80bo29b2ob\n2o3bo3bo27bobo$81bo28b4o8bo20b2o7bo37bo$76bo4bo29b2o8bo20b4o45bo83bo$\n77b5o60b2ob2o44bo84bo$144b2o44b2o79bo4bo20b2o8bo$119bo69bo82b5o19b4o8b\no$120bo175b2ob2o3bo3bo$115bo4bo177b2o5b4o$114b2o3b2o$118bo64b2o5b4o$\n181b2ob2o3bo3bo90bobo14bobo$181b4o8bo90b2o5b2o6b2o3bo$182b2o8bo92bo5bo\nbo5b3obob2o$119b4o170b2o4b3o4bo$104bo13bo3bo169bo9bo3bo$105bo16bo180b\n3o$101bo3bo15bo181bo$102b4o$307bo$297b2o9bo$294b3ob2o4bo3bo$294b5o6b4o\n$271b2o22b3o$269b2ob2o$269b4o16b2o$270b2o15b2ob2o$287b4o$135b2o151b2o$\n134b4o$127bobo4b2ob2o$136b2o15b2o132bo$128bo22b2ob2o94b3o34b2o$128bo\n22b4o94b5o32bob2o$128bo23b2o95b3ob2o31bobo$252b2o32b2o2$128bo22bo$128b\no22b2o128bo$128bo21bob2o113b2o13bo6b2o$150bobo113bobo9bo3bo4b2ob2o3b2o\n8bo$127bobo20b2o116bo10b4o4b4o3b4o8bo$288b2o4b2ob2o3bo3bo$296b2o5b4o$\n145bo126b2o$146bo6b2o116bobo$142bo3bo4b2ob2o117bo$125b2o16b4o4b4o146b\n2o$123b2ob2o24b2o146b2ob2o$123b4o36b2o112b2o22bo2bo$124b2o36b4o110bobo\n22bo2bo$162b2ob2o111bo23b2o$164b2o$157bobo$156bo2b2o121b2o21bo$157bobo\n121bobo22bo$164b2o117bo3bo14bo3bo$162b2ob2o3b2o8bo105bo3bo12b4o$162b4o\n3b4o8bo104bo2b2o$163b2o4b2ob2o3bo3bo109bo$136b5o30b2o5b4o105b2o$135bo\n4bo$140bo$139bo$177bo$178b2o$179bo$179bo$178bo3$180bo$181bo$177bo3bo$\n161b4o13b4o$160bo3bo$164bo$163bo!\n"
2 |
--------------------------------------------------------------------------------
/examples/primer.rle:
--------------------------------------------------------------------------------
1 | #N Primer
2 | #O Dean Hickerson
3 | #C A prime number sieve created in November 1991.
4 | #C www.conwaylife.com/wiki/index.php?title=Primer
5 | x = 440, y = 294, rule = B3/S23
6 | 412b2o$410b2ob2o13b2o$410b4o13b4o$411b2o14b2ob2o$93b3o11b3o319b2o$93bo
7 | 2bo10bo2bo$93bo6b3o4bo16b3o11b3o$93bo5bo2bo4bo15bo2bo10bo2bo$94bo4b2ob
8 | o5bo17bo4b3o6bo285b2o$126bo4bo2bo5bo284bo2bo$125bo5bob2o4bo285bo2b2o$
9 | 424bo2b2o$99bo8bo315b4o$99bobo5b3o278bo7bo$107bob2o14bo8bo254bo7b2o$
10 | 100bo2bo4b3o13b3o5bobo249bo4bo6b2o30b2o$101b3o4b2o13b2obo258b5o29b4o4b
11 | 4o$102bo20b3o4bo2bo280bo3bo3bo4b2ob2o$124b2o4b3o282bo6bo6b2o$131bo279b
12 | o3bo5bo$412b4o$91b3o313b3o$90bo2bo311b2ob2o26b2o$93bo46b3o264b3o17b4o
13 | 4b4o$93bo46bo2bo268b4o10bo3bo4b2ob2o$92bo47bo270bo3bo14bo6b2o$106b3o3b
14 | 3o25bo274bo13bo$105bo2bo3bo2bo25bo272bo18bo$108bo3bo6b3o3b3o253bo49bo$
15 | 96b3o9bo3bo5bo2bo3bo2bo253b2o47bo2b2o$98bo8bo5bo7bo3bo255b2o47bo5bo$
16 | 97bo12bo10bo3bo9b3o293bobo2b2o$110bo9bo5bo8bo295bo3b2o$109bobo11bo12bo
17 | 296b3o$101b3o19bo$76bo13bo12bo18bobo$75b3o11b3o10bo27b3o303b2o$75bob2o
18 | 4bo5bob2o37bo12bo13bo277b4o$76b3o3b3o5b3o38bo10b3o11b3o245bo13b2o15b2o
19 | b2o$76b2o3b2o2bo4b2o49b2obo5bo4b2obo244bo13b4o16b2o$81bo3bo24b3o28b3o
20 | 5b3o3b3o245b3o11b2ob2o$81bob2o57b2o4bo2b2o3b2o261b2o$81b2o38b3o24bo3bo
21 | $149b2obo213bo$75b3o73b2o214b2o42b2o$74bo2bo288b2o41b2ob2o$77bo78b3o
22 | 250b4o$77bo78bo2bo246bo3b2o$76bo79bo248b2o$156bo249bo3b2o$102b3o52bo
23 | 251b4o$102bo2bo303b2ob2o$102bo26b3o279b2o$92bo9bo25bo2bo227bo$91b3o8bo
24 | 28bo226bo$55b3o11b3o19bob2o8bo27bo9bo216b3o36b4o$54bo2bo10bo2bo20b3o
25 | 36bo8b3o253bo3bo$57bo4b3o6bo20b2o36bo8b2obo239b2o16bo$57bo4bo2bo5bo67b
26 | 3o209bo21b4o4b4o14bo$56bo4bo8bo69b2o21bo13bo9b2o163b2o18bo3bo4b2ob2o$
27 | 97bo5bo58b3o11b3o7b4o161b2o23bo6b2o$96b3o3b3o57bob2o4bo5bob2o6b2ob2o
28 | 184bo$62b2o31b2obo3bob2o4b2o18bo5bo26b3o3b3o5b3o8b2o189bo$62bo7bo24b3o
29 | 5b3o4bobo16b3o3b3o25b2o3b2o2bo4b2o198bo$69b3o24b2o5b2o6b2o9b2o4b2obo3b
30 | ob2o29bo3bo28bo175bo2b2o$68b2obo49bobo4b3o5b3o29bob2o30bo173bo5bo$68b
31 | 3o29bo20b2o6b2o5b2o30b2o28bo3bo174bobo2b2o$69b2o28b3o97b4o174bo3b2o$
32 | 98bo3bo30bo28b3o26bo2b3o117bo64b3o$132b3o26bo2bo25b2o2bobo116bo$72bo5b
33 | o52bo3bo28bo26bo2b3o116b3o$71b3o3b3o18b2ob2o61bo34b4o179b2o$53b3o15bob
34 | 2ob2obo20bo62bo34bo3bo178b4o25b2o$53bo2bo15b3ob3o52b2ob2o66bo133bo27b
35 | 2o15b2ob2o15b4o4b4o$53bo18b2o3b2o33bo20bo67bo135b2o24b4o16b2o15bo3bo4b
36 | 2ob2o$53bo57b2o41b3o3b3o16bo29bo126b2o25b2ob2o36bo6b2o$54bo20bo35bobo
37 | 7bo31bo2bo3bo2bo14b3o29bo154b2o36bo$74bobo10bo33b2o33bo3bo17b3o25bo3bo
38 | 16bo$73bo3bo9b2o31bobo33bo3bo19bo26b4o17bo$58b2o14bobo9bobo57bo8bo5bo
39 | 16bobo43bo3bo128b2o49b2o$57bobo14b3o68b2o11bo19bo46b4o126b2ob2o48bobo$
40 | 59bo85bobo10bo192bo3b4o49bob2o$157bobo16bo172b2obo3b2o51b2o$82b3o90b2o
41 | 92bo79bo3bo55bo$82bo2bo89bobo90bo80b2obo3b2o$82bo66b3o72b3o41b3o80bo3b
42 | 4o$82bo65bo2bo74bo128b2ob2o50b2o$83bo67bo72bobo130b2o50b4o$151bo60bo
43 | 11b2o166b2o15b2ob2o$150bo59bo2bo177b4o16b2o$210bo2bo129b4o44b2ob2o$
44 | 211bo5b2o8bo114bo3bo46b2o$216b4o8bo117bo$216b2ob2o3bo3bo116bo$73b2o
45 | 143b2o5b4o156b2o$72bobo308b2ob2o$67b3o4bo304bo3b4o$67bo2bo90bo215b2obo
46 | 3b2o$67bo92b2o215bo3bo$67bo92bobo10bo13bo189b2obo3b2o$67bo104b3o11b3o
47 | 52bo29bo29bo29bo47bo3b4o$68bo103bob2o4bo5bob2o51b3o27b3o27b3o27b3o49b
48 | 2ob2o$173b3o3b3o5b3o54bo29bo29bo29bo50b2o11b2o$173b2o3b2o2bo4b2o54b2o
49 | 28b2o28b2o28b2o19bo39b4ob2o$178b2ob2o172bo38b6o$178bo2b3o165bo5bo15b4o
50 | 20b4o$179bob2o167b6o14bo3bo29b2o$181bo192bo28b4o$172b3o2bo3bo191bo29b
51 | 2ob2o$171bo2bo3bobo224b2o$174bo4bo221bo$174bo71b2o28b2o28b2o28b2o28b2o
52 | 31bobo$173bo72bobo27bobo27bobo27bobo27bobo32bo$164b3o80b2o28b2o28b2o
53 | 28b2o28b2o36b2o$163bo2bo236b2ob2o$166bo3b3o230b4o$166bo3bo2bo15bo214b
54 | 2o$166bo3bo17b3o194b2o8b4o$166bo3bo16b2obo192b2ob2o6b6o$165bo5bo15b3o
55 | 135b2o52bo3b4o7b4ob2o$188b2o134b4o46b2o2bobo3b2o12b2o$167b3o154b2ob2o
56 | 44bo2b2o3bo$167bobo76b2o28b2o28b2o18b2o46b2o2bobo3b2o$167b3o76bobo27bo
57 | bo27bobo10bobo57bo3b4o$247b2o28b2o22b2o4b2o9bo2b2o24b2o34b2ob2o$301bo
58 | 17bobo16b4o4b4o35b2o5b2o5b4o$145b3o11b3o5b3o156b2o9bo3bo4b2ob2o9bo29b
59 | 2ob2o3bo3bo$145bo2bo10bo2bo5bo155b2ob2o12bo6b2o11bo28b4o8bo$145bo6b3o
60 | 4bo164b4o12bo15bo4bo29b2o8bo$145bo5bo2bo4bo140b3o14bo7b2o30b5o$146bo4b
61 | 2obo5bo129b4o5b5o13b2o16bo$289bo3bo5b3ob2o11bobo12bo3bo62b2o$293bo8b2o
62 | 26bo3bo9bo52bo2bo$285bo6bo38bo12b6o42b2o3bo2bo$152b2o6bo88bo29bo7b3o
63 | 32bo9b2o9bob3o44bo3b2ob2o$152bo6b3o86b2o28b2o5bo6bo29b2o13b2o9bo48b2o$
64 | 159bob2o130bo27bobo13bo37b3o$160b3o126bo3bo83bo$107b2o6b2o43b2o128b4o
65 | 53b2o27bo$106b4o4b4o228b4o49b4o$106b2ob2o3b2ob2o227b2ob2o33bo13bo3bo$
66 | 108b2o6b2o7b2o47b3o120b4o30b2o15b2o35bo16bo$123b2ob2o46bo2bo118bo3bo
67 | 28b2ob2o47bo3bo15bo$123b4o16b3o28bo125bo14b4o10b4o49b4o$124b2o16bo2bo
68 | 28bo9b2o8bo104bo14bo3bo11b2o$145bo28bo8b4o8bo51bo70bo$145bo29bo7b2ob2o
69 | 3bo3bo52bo68bo$120b4o20bo40b2o5b4o48bo3bo$116b2o2bo2b2o120b4o$117bo3bo
70 | 2b2o114b3o25b2o39b2o3b2o$121bo2bo113b2ob2o24b4o36bo6bobo$122b2o67bo31b
71 | 2o15b3o24b2ob2o34bo2bo6bo$146b2o44b2o30b2o19b4o20b2o34b2o7b3o$81b5o58b
72 | 2ob2o44bo29bo20bo3bo5bo51b2o$80bo4bo31bo26b4o13b3o29bo54bo6bo6b2o$85bo
73 | 32bo6b2o18b2o7bo6bo2bo27bo54bo3bo3bo4b2ob2o$84bo29bo3bo4b2ob2o24bobo6b
74 | o56b5o29b4o4b4o$108b4o3b4o4b4o26b2o6bo55bo4bo38b2o45b2o5b4o$107bo3bo
75 | 12b2o36bo31bo27bo83b2ob2o3bo3bo$111bo83bo25bo33bo50b4o8bo$103b2o2bo2bo
76 | 65bo14bo3bo11b2o45bo3b3o46b2o8bo$103b3o71bo14b4o10b4o43bo3bob3o$103b2o
77 | 2bo2bo62bo3bo28b2ob2o43bo6b2o$111bo62b4o30b2o15b2o28b5obo$107bo3bo111b
78 | 2ob2o29b4o$108b4o89bobo19b4o31bo$167b4o31b2o20b2o12b2o$166bo3bo31bo36b
79 | 2o$170bo67bo23b2o$162b2o2bo2bo51b3o20b2o14b2ob2o$162b3o31bobo20bo3b2o
80 | 18b4o13b4o$162b2o2bo2bo27b2o20bobo2b2o17b2ob2o13b2o$170bo8b2o16bo20bo
81 | 5bo20b2o$166bo3bo5b3ob2o37bo2b2o$167b4o5b5o38bo$177b3o22b2o17bo$201b4o
82 | 12bo$201b2ob2o12bo6b2o$194bo2bo5b2o9bo3bo4b2ob2o$185b2o2bo4bo3bo16b4o
83 | 4b4o$170b2o12bo2bo2bo2bo4b2o24b2o$169bobo13b2o2b3o2bo3bo$156b2o11b2o
84 | 14b3o2bo3bo2bo5b2o$155bobo31bo11b2ob2o$157bo43b4o$202b2o3$200b2o$155bo
85 | 43b4o$153bobo31bo11b2ob2o$154b2o11b2o14b3o2bo3bo2bo5b2o$167bobo13b2o2b
86 | 3o2bo3bo$168b2o12bo2bo2bo2bo4b2o24b2o$183b2o2bo4bo3bo16b4o4b4o$192bo2b
87 | o5b2o9bo3bo4b2ob2o$199b2ob2o12bo6b2o$199b4o12bo$103bo71b3o22b2o17bo$
88 | 103b2o60b4o5b5o38bo$102bobo59bo3bo5b3ob2o37bo2b2o$168bo8b2o16bo20bo5bo
89 | $160b2o2bo2bo27b2o20bobo2b2o$160b3o31bobo20bo3b2o$160b2o2bo2bo51b3o$
90 | 168bo$164bo3bo31bo$165b4o31b2o20b2o$105b2o92bobo19b4o$b6o31b2o63b2ob2o
91 | 113b2ob2o$o5bo28b3ob2o58bo3b4o65b4o30b2o15b2o$6bo28b5o54b2o2bobo3b2o
92 | 65bo3bo28b2ob2o$5bo30b3o54bo2b2o3bo73bo14b4o10b4o$94b2o2bobo3b2o68bo
93 | 14bo3bo11b2o$99bo3b4o86bo$103b2ob2o84bo$105b2o5b2o5b4o28b2o$80bo29b2ob
94 | 2o3bo3bo27bobo$81bo28b4o8bo20b2o7bo37bo$76bo4bo29b2o8bo20b4o45bo83bo$
95 | 77b5o60b2ob2o44bo84bo$144b2o44b2o79bo4bo20b2o8bo$119bo69bo82b5o19b4o8b
96 | o$120bo175b2ob2o3bo3bo$115bo4bo177b2o5b4o$114b2o3b2o$118bo64b2o5b4o$
97 | 181b2ob2o3bo3bo90bobo14bobo$181b4o8bo90b2o5b2o6b2o3bo$182b2o8bo92bo5bo
98 | bo5b3obob2o$119b4o170b2o4b3o4bo$104bo13bo3bo169bo9bo3bo$105bo16bo180b
99 | 3o$101bo3bo15bo181bo$102b4o$307bo$297b2o9bo$294b3ob2o4bo3bo$294b5o6b4o
100 | $271b2o22b3o$269b2ob2o$269b4o16b2o$270b2o15b2ob2o$287b4o$135b2o151b2o$
101 | 134b4o$127bobo4b2ob2o$136b2o15b2o132bo$128bo22b2ob2o94b3o34b2o$128bo
102 | 22b4o94b5o32bob2o$128bo23b2o95b3ob2o31bobo$252b2o32b2o2$128bo22bo$128b
103 | o22b2o128bo$128bo21bob2o113b2o13bo6b2o$150bobo113bobo9bo3bo4b2ob2o3b2o
104 | 8bo$127bobo20b2o116bo10b4o4b4o3b4o8bo$288b2o4b2ob2o3bo3bo$296b2o5b4o$
105 | 145bo126b2o$146bo6b2o116bobo$142bo3bo4b2ob2o117bo$125b2o16b4o4b4o146b
106 | 2o$123b2ob2o24b2o146b2ob2o$123b4o36b2o112b2o22bo2bo$124b2o36b4o110bobo
107 | 22bo2bo$162b2ob2o111bo23b2o$164b2o$157bobo$156bo2b2o121b2o21bo$157bobo
108 | 121bobo22bo$164b2o117bo3bo14bo3bo$162b2ob2o3b2o8bo105bo3bo12b4o$162b4o
109 | 3b4o8bo104bo2b2o$163b2o4b2ob2o3bo3bo109bo$136b5o30b2o5b4o105b2o$135bo
110 | 4bo$140bo$139bo$177bo$178b2o$179bo$179bo$178bo3$180bo$181bo$177bo3bo$
111 | 161b4o13b4o$160bo3bo$164bo$163bo!
--------------------------------------------------------------------------------
/examples/infinitelwsshotel.rle:
--------------------------------------------------------------------------------
1 | #N Infinite LWSS hotel
2 | #O Jason Summers
3 | #C Similar to the infinite glider hotel, but for lightweight spaceship
4 | #C s.
5 | #C www.conwaylife.com/wiki/index.php?title=Infinite_LWSS_hotel
6 | x = 515, y = 298, rule = b3/s23
7 | 196b2o141b2o174b$196bo2bobo133bobo2bo174b$198b2ob3o129b3ob2o176b$204bo
8 | 127bo182b$198b2ob3o129b3ob2o176b$198b2obo133bob2o176b3$163b2o207b2o
9 | 141b$164bo207bo142b$162bo211bo140b$162b2o209b2o140b$154bo227bo132b$
10 | 154b3o223b3o132b$157bo221bo135b$156b2o10bo210b2o134b$165bo3bo6bo176b2o
11 | 160b$165bo4bo4b4o173b3o15b2o143b$165bo3bo3b5obo73bo29bo67b3obo14b2o
12 | 143b$166b3o3bo6b2o71bobo27bobo65b3obo160b$166bobo2bo3bob3o73bo29bo67b
13 | 4o160b$162b3obobo3bobo2b2o173b2o161b$167b2o346b$258b2o17b2o236b$233b2o
14 | 23b2o17b2o23b2o211b$175b2o57bo31b2ob2o31bo57b2o153b$176bo57bobo29bo3bo
15 | 21bo7bobo57bo154b$173b3o59b2o27bobo3bobo20bo6b2o59b3o151b$173bo17b2o
16 | 51b3o11b2o4b2o5b2o4b2o10bobo2bo49b2o17bo151b$171bobo18bo50b2ob2o10b2o
17 | 17b2o9b3o3bo49bo18bobo149b$171b2o16b3o52bo2b2o46bo49b3o16b2o149b$189bo
18 | 34b2o18bo4bo33b2o3b5obo16b2o34bo167b$147b2o76bo18bobo2b2o15b2ob2o12b4o
19 | 5b2o17bo76b2o125b$147bo77bobo19bob3o15bobo15b2ob2o19bobo77bo125b$149bo
20 | b2o18b2o53b2o5bo13b2o2bo10b2obo5bob2o34b2o53b2o18b2obo127b$148b2ob2o
21 | 18bobo59bobo11bo3bo10b2ob2o3b2ob2o10bobo3bo71bobo18b2ob2o126b$173bo59b
22 | 2o9b3o3bo34bo2b3obo70bo151b$148b2ob2o20b2o74bo12b2ob2o3b2ob2o12b2o3b2o
23 | 68b2o20b2ob2o126b$149bobo85b2o8bo15bobo5bobo14bo9b2o7bo77bobo127b$149b
24 | obo68b2o14bo2bo7bo15bobo5bobo15bo7bo2bo4bobo7b2o68bobo127b$150b2ob2o
25 | 65b2o15b2o25bo7bo25b2o6b2o7b2o65b2ob2o128b$152bobo88b3o136bobo130b$
26 | 152bo31b2o165b2o31bo130b$151b2o31bo167bo31b2o129b$182bobo17bo149bobo
27 | 160b$181bobo18bo133b3o14bobo159b$177b2o3bo19b2o150bo3b2o155b$177b2o
28 | 157bobo19b2o155b$203b3o31b2o59b2o36bobo176b$203b2o32b2o59b2o36b3o176b$
29 | 184b2o13b2o135bob2o175b$180b2o2b3o2b2o5bo3b2o11b2o107b2o7bo6b2o17b3obo
30 | 153b$179b2o4bobo2bo4bobo15b2o107b2o6b3ob4o18bo3bob2o151b$180bob2obo3bo
31 | 4bo3bo131b2ob4o19b2o4bo152b$181b2o3bo8bobo33b2o71b2o26b3o21bob4o153b$
32 | 196bo34bobo69bobo33b3o173b$233bo69bo35bo175b$233b2o67b2o211b$158b2o
33 | 217b2o136b$158b2o217b2o136b$164b2o205b2o142b$164b2o56b2o89b2o56b2o142b
34 | $222bobo87bobo200b$224bo87bo202b$162b2o60b2o85b2o60b2o140b$162b2o5b2o
35 | 40b2o111b2o40b2o5b2o140b$169b2o40b2o111b2o40b2o147b3$209b2o115b2o187b$
36 | 209b2o115b2o187b11$204bo310b$205b2o308b$204b2o309b2$328bo186b$326b2o
37 | 187b$327b2o186b12$376bo138b$377bo137b$377b2o136b$378bo136b$375b2ob2o
38 | 135b$331bo42bo3bo136b$330bobo43b2o137b$332b2o42bo138b$332bo43b2o137b$
39 | 324bobo4bobo39bo2b2o137b$324bob2ob5o40bo3bo136b$327b2obo47b2o135b$324b
40 | 2ob2ob2ob2o42bo2bo134b$324b3o6b2o42bo137b$326bo2b4o44b2obo134b$328bo3b
41 | o44bo2bo3bo130b$330b2o46b3o2bobo129b$325bo3b2o46b3o4b2o129b$323b8o47bo
42 | 6bo129b$328bo47bob2o2bobo130b$329bo2bo46bo2bobo130b$17bo311bobobo43b3o
43 | 3b3o129b$4bo11bobo314bo51b2o128b$3bobo10bobo308bo3bo2bo42b3o6b2o127b$
44 | 2b2o12bo312b2ob3o43b2o5bo129b$4bo321bo4bo2bo39bo10bo2b3o124b$2b2o11b2o
45 | 311b6o40bo4bo3b3obobo125b$2b3o11bobo10bobo293bo2bo43b2obobobo3bo4bo
46 | 126b$16b2o10b2obob2o293b3ob2o38bobobo2bo8bo126b$2bo2bo11bo9bo300b3o2bo
47 | 38bobob3o6bo129b$2bobo13bo2bo3b7o3bo289bo4b2o40b2ob2obo3b2ob2o128b$2bo
48 | 19bobo299b2o3b2ob3o38bo4b2obo4bo128b$3bo15b2o3bob7o293bo6b2o38bo2bob2o
49 | 3b2obo128b$3bobo13bobo3b2o5b4o291bo3b2o43bobobobobo130b$4bo13b2o7bobo
50 | 3bo293b2obo44b2obob2o2b3o128b$3b2o14bobo7bobo2bo289b2obo48b2o2b2o2b3o
51 | 22bo105b$20bo10bo292b3o49b5o28b2ob2o101b$2bo2bo26bobo290b2o83bo3bo100b
52 | $bo408bo3bo100b$2o2bo402bo3bo3bo99b$2b4o399b3o3bobobo99b$2bob2o397bob
53 | 3o3bo3bo99b$2bobo405bo3bo100b$2b3o397bobo6b3o101b$2b2o399b3o4b3o52bo
54 | 49b$3bob2o397b3o3bo53bobo48b$6bo4bo2bo246bo2bo141b2o3b2o51bobo48b$6bo
55 | 3bo124b4o121bo145b3o2bo54bo48b$4b3o3bo3bo120bo3bo120bo3bo145bo55b2o47b
56 | $2b2o6b4o121bo124b4o201bobo47b$2b2o2bo129bo2bo375b$5bo460b3o46b$3b2o
57 | 461b3o46b$3b3o460bo48b$84b3o375bo4b2o46b$84b2o375bo2b2o2bo46b$86bo376b
58 | ob3o47b$83b3o376b4obo47b$21bo58b2o2bobo376b2obo48b$20bobo56bobo2bo293b
59 | o84b2obo48b$19b2o58bobo2b3o292b2o85bo48b$20bobo56bo6b3o283b4o3b2o82b2o
60 | 50b$20b2o56b2o6b2o261bo23bo4bo83bo2bo49b$23bo48bo5bobo267bo27bo3bo78b
61 | 2o2b3o49b$19bo2bo48bobo11bo2bo262bo4bo15bo2b3o3bo80bo2bo49b$18bo52bo5b
62 | 3o4bo242bo20b2ob2o4bo13bob2obo3bo82b2o50b$17b2o51bo2bo3bo5b2o3bo237bob
63 | o19bobobobo2b2o17b4o135b$18bo51b3o5bo6b2o2bo238b2o18bobo5bo19b3o136b$
64 | 18b3o49bo3bo3bo2b6o239bobo17b3ob2ob2ob3o13b2o2bo138b$19bo51b4o11bo2bo
65 | 237b2o16b3o9b2o13b3o2b2o136b$21bo52b2o3b2o2b3obo237bo16b2o3b2obo3b2o
66 | 21bo65bo71b$19b2o53b2o4b2obo3b2o77bo159bo2bo15bo3b2o3b2obo13bobo2bo65b
67 | o72b$19b2o49b5o6b4ob3o76bobo162bo14bo9b5o11bobo71bo4bo64b$21bo51bo8bo
68 | 3b3o76bo164b2o10b2o3bob3o3bo2b3o12b2o67b2ob2o4bo63b$69bo2bo91bo2bo162b
69 | o14b5obo4bo4bo8bo4bo66bobobobo2b2o62b$69b2o8b3o2b2o78b3o161b3o4bo12bob
70 | o5bo4bo10b4o66bobo5bo64b$69b2o8b3o2bo79bo3bo160bo6b2o10bob2o6bo2bo8bob
71 | 3o65b3ob2ob2ob3o62b$70bo8b2o5bo78b4o158bo8b2o20bo10b2o68b3o9b2o62b$65b
72 | o2b2o2b2o10b2o10bo71b2o158b2o5bo14bo6b2o10b4o42bo20b2o3b2obo3b2o65b$
73 | 63b2o4b2o6b2o2bo13bobo70b2o158b2o7bo12bo20bobo42b2o21bo3b2o3b2obo63b$
74 | 63b2o13bo4b3o8b2o68b5o151b2o5bo7bobo10bo2bo2b3o14bobo42b2o11b4o6bo9b5o
75 | 61b$70bobo5bo3b3obo9bo70bo13bo8b2o127b3o15bo11b2o3b3o17bo55bo5b2o3bob
76 | 3o3bo2b3o60b$64b3o3b2o10bo3bo7b2o67bo2bo13bobo7b3obo124b2obo2bo8bobo
77 | 11bobo21bobo39b3o10bo5bo5b5obo4bo4bo59b$64b3o2bo2bo6b2o3bo9b3o66b2o15b
78 | 2o6bo4b3o127bobo8bobo19b2o16bo39b3o12bo2b2o8bobo5bo4bo59b$70bo8bo2bo3b
79 | o55bo20b2o15bo5b7ob2o121b3o7b2o3b4o14b2o4b2o14bo53bob2ob4o7bob2o6bo2bo
80 | 59b$62b2o6bo7b2obob3o9bobo42b2o22bo16bobobo8b2o124b7o2bobobo13b2o2b2o
81 | 2bo17b2o42b3o6b3o6bo16bo62b$62bo16bo6b3o6b3o42b2o17bo2b2o2b2o13bobobo
82 | 2b7o124b2o8bobobo16bo22b2o42bobo9b3obob2o7bo6b2o62b$59bo2bo6b2obo7b4ob
83 | 2obo53bo14b2o4b2o14b4o3b2o7b3o121b2ob7o5bo15b2o20bo55bo3bo2bo8bo70b$
84 | 59bo4bo5bobo8b2o2bo12b3o39bo16b2o19bobo8bobo127b3o4bo6b2o15b2o66b3o9bo
85 | 3b2o6bo2bo2b3o64b$59bo4bo4bob5o5bo5bo10b3o39bobo21bobo11bobo8bo2bob2o
86 | 124bob3o7bobo13bo2bo67b2o7bo3bo10b2o3b3o64b$60b3o2bo3b3obo3b2o5bo55bo
87 | 17b3o3b2o11bo15b3o127b2o8bo13bo70bo9bob3o3bo5bobo70b$61b5o9bo6b4o11b2o
88 | 42bobo14b3o2bo2bo10bobo7bo5b2o151b5o68b2o8b3o4bo13b2o63b$63bob2o3b2o3b
89 | o21b2o42bobo20bo12bo7b2o158b2o70bobo13bo2b2o6b2o4b2o63b$65b2o3bob2o3b
90 | 2o20bo42b4o10b2o6bo14bo5b2o158b2o71bo10b2o10b2o2b2o2bo65b$62b2o9b3o68b
91 | 2o10bo20b2o8bo158b4o78bo5b2o8bo70b$62b3ob2ob2ob3o65b3obo8bo2bo6b2obo
92 | 10b2o6bo160bo3bo79bo2b3o8b2o69b$64bo5bobo66b4o10bo4bo5bobo12bo4b3o161b
93 | 3o78b2o2b3o8b2o69b$62b2o2bobobobo66bo4bo8bo4bo4bob5o14bo162bo2bo91bo2b
94 | o69b$63bo4b2ob2o67b2o12b3o2bo3b3obo3b2o10b2o164bo76b3o3bo8bo51bo21b$
95 | 64bo4bo71bobo11b5o9bo14bo10b2o150bobo76b3ob4o6b5o49b2o19b$72bo65bo2bob
96 | o13bob2o3b2o3bo15bo2bo5b2o152bo77b2o3bob2o4b2o53b2o19b$71bo65bo21b2o3b
97 | ob2o3b2o16bo6bo230bob3o2b2o3b2o52bo21b$136b2o2b3o13b2o9b3o16b2o237bo2b
98 | o11b4o51bo19b$138bo2b2o13b3ob2ob2ob3o17bobo239b6o2bo3bo3bo49b3o18b$
99 | 136b3o19bo5bobo18b2o238bo2b2o6bo5b3o51bo18b$135b4o17b2o2bobobobo19bobo
100 | 237bo3b2o5bo3bo2bo51b2o17b$50b2o82bo3bob2obo13bo4b2ob2o20bo242bo4b3o5b
101 | o52bo18b$49bo2bo80bo3b3o2bo15bo4bo262bo2bo11bobo48bo2bo19b$49b3o2b2o
102 | 78bo3bo27bo267bobo5bo48bo23b$49bo2bo83bo4bo23bo156b3o102b2o6b2o56b2o
103 | 20b$50b2o82b2o3b4o179bo103b3o6bo56bobo20b$48bo85b2o64bo122bo104b3o2bob
104 | o58b2o19b$48bob2o84bo63bo229bo2bobo56bobo20b$48bob2o147bobo226bobo2b2o
105 | 58bo21b$47bob4o145bob2o227b3o83b$47b3obo145b2o3bobo223bo86b$46bo2b2o2b
106 | o143bo3bo3b2o222b2o84b$46b2o4bo144b2obo6bo220b3o84b$48bo151bo3bo3bo4bo
107 | 295b3o3b$46b3o148b3o5bobo3b2o297b2o3b$46b3o147bo3b3ob2o5b3o295bo5b$
108 | 195b5o3b3o302bo2b2o2b$47bobo143bo7bo2b2o55b4o246b2o2b$47b2o55bo89bo3b
109 | 4ob3o54bo3bo243b3o4b$48bo54bo2b3o85bo3b2o64bo243bo6b$48bobo51b2o3b2o
110 | 151bo2bo244bo6b$48bobo53bo3b3o83b3o311b2obo3b$49bo52b3o4b3o399b2o2b$
111 | 101b3o6bobo77b4o2b2o126b2o184b3o2b$100bo3bo84bob2o131b2o184bobo2b$99bo
112 | 3bo3b3obo77bo2b2o2b2o311b2obo2b$99bobobo3b3o80b2o317b4o2b$99bo3bo3bo
113 | 214b2o40b2o144bo2b2o$100bo3bo217b2o40b2o5b2o140bob$100bo3bo83b2o119b2o
114 | 60b2o107bobo26bo2bo2b$101b2ob2o28b5o49b3o119bo172bo10bo20b$105bo22b3o
115 | 2b2o2b2o48bob2o119bobo167bo2bobo7bobo14b2o3b$128b3o2b2obob2o44bob2o
116 | 123b2o56b2o110bo3bobo7b2o13bo4b$130bobobobobo43b2o3bo181b2o108b4o5b2o
117 | 3bobo13bobo3b$128bob2o3b2obo2bo38b2o6bo186b2o105b7obo3b2o15bo3b$128bo
118 | 4bob2o4bo38b3ob2o3b2o184b2o113bobo19bo2b$128b2ob2o3bob2ob2o40b2o4bo
119 | 110b2o56b3o118bo3b7o3bo2bo13bobo2b$129bo6b3obobo38bo2b3o114bo54bo4bo
120 | 125bo9bo11bo2bo2b$126bo8bo2bobobo38b2ob3o114bobo54bob2o118b2obob2o10b
121 | 2o16b$126bo4bo3bobobob2o43bo2bo112b2o51b3o125bobo10bobo11b3o2b$125bobo
122 | b3o3bo4bo40b6o148bo18bo143b2o11b2o2b$124b3o2bo10bo39bo2bo4bo131b2o12bo
123 | bo173bo4b$129bo5b2o43b3ob2o134b2o14bo161bo12b2o2b$127b2o6b3o42bo2bo3bo
124 | 145b2o161bobo10bobo3b$128b2o51bo114b2o36bo2bo158bobo11bo4b$129b3o3b3o
125 | 43bobobo110b2o35b2obobo158bo17b$130bobo2bo46bo2bo147bo5bo16b2o157b$
126 | 130bobo2b2obo47bo150b2o13bo3b2o157b$129bo6bo47b8o141bo4bo12bobo161b$
127 | 129b2o4b3o46b2o3bo143bo3bo12bobo162b$129bobo2b3o46b2o149b2obo12bo31b2o
128 | 131b$130bo3bo2bo44bo3bo119b2o27b2o12b2o31bo132b$134bob2o44b4o2bo118b2o
129 | 71bobo132b$137bo42b2o6b3o79bo25b2o8bo6b2o65b2ob2o130b$134bo2bo42b2ob2o
130 | b2ob2o78bobo23bo2bo14b2o68bobo129b$135b2o47bob2o81bobo24b2o85bobo129b$
131 | 136bo3bo40b5ob2obo77b2ob2o14b3o70b2o20b2ob2o128b$137b2o2bo39bobo4bobo
132 | 95bo4bo69bo153b$137b2o43bo85b2ob2o12bo5bo69bobo18b2ob2o128b$138bo42b2o
133 | 86bob2o12bobo19b2o53b2o18b2obo129b$137b2o43bobo82bo16b2o3b3o15bobo77bo
134 | 127b$136bo3bo42bo83b2o14b2o5bo18bo76b2o127b$135b2ob2o144b2o23b2o34bo
135 | 169b$136bo148bob3o53b3o16b2o151b$136b2o137b2o11bo53bo18bobo151b$137bo
136 | 131b2o4b2o10bo54b2o17bo153b$138bo129bobo17bo3b2o4b2o59b3o153b$268bo25b
137 | o3bobo57bo156b$267b2o23b2o6bo57b2o155b$275b2o23b2o213b$275b2o238b2$
138 | 351bobo161b$281bo65bo3bobo161b$280bobo70b2o160b$281bo71bo14b2o145b$
139 | 347bobobo16b2o145b$347b3obo2bo160b$348bo3bo24b2o136b$377bo137b$378b3o
140 | 134b$380bo134b$371b2o142b$372bo142b$370bo144b$370b2o143b3$333bob2o178b
141 | $331b3ob2o178b$330bo184b$331b3ob2o178b$333bobo2bo176b$337b2o!
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Conway's Game of Life
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
60 |
61 |
62 |
0, 0
63 |
0
64 |
0
65 |
0
66 |
1
67 |
68 |
69 |
70 |
71 |
Conway's Game of Life in JavaScript
72 |
73 |
Sorry, this applications needs JavaScript to work.
74 |
75 |
76 |
77 |
78 |
79 |
80 | This is an implementation of
Conway's Game of Life or
81 | more precisely, the super-fast
Hashlife algorithm,
82 | written in JavaScript using the
canvas-tag. It can simulate the largest known patterns, including the
83 |
Caterpillar (7.6MB, 11m cells) and
84 |
Gemini (1.6MB, 846k cells).
85 |
86 |
87 |
88 | If you encounter any bugs or have feedback, you can contact me at
this email .
89 |
90 | Click on the pattern name on the bottom left to get some informations about the current pattern.
91 |
92 |
93 |
List of all patterns —
94 |
Source code on Github —
95 |
Report an issue
96 |
97 |
98 |
Controls:
99 |
100 | Left mouse - Move around
101 | Right mouse - Create / Delete cells
102 | Mouse wheel - Zoom
103 |
104 | Arrow keys, HJKL - Move around
105 | +, - - Zoom
106 | Space - One generation forward
107 | Tab - Many generations forward
108 | Enter - Run/Pause
109 | Backspace - Rewind
110 | ] - Faster
111 | [ - Slower
112 | Escape - Close Popups
113 |
114 |
115 |
116 |
117 |
118 |
Ok
119 |
120 |
121 |
Random Pattern
122 |
123 | Width
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 | Height
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 | Density
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
Randomize
149 |
Abort
150 |
151 |
152 |
Import Pattern
153 | Supports RLE, Life 1.06, Plaintext
154 |
155 |
156 |
157 |
158 | Or:
159 |
160 |
161 |
162 |
163 |
164 |
165 |
Import
166 |
Abort
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 | Pattern file:
177 |
178 |
179 | Link to view online:
180 |
181 |
182 |
183 |
184 |
185 |
Ok
186 |
187 |
193 |
194 |
Settings
195 |
196 | Rule
197 |
198 | Or pick one:
199 | Conway
200 | HighLife
201 | 2x2
202 | Replicator
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 | Maximum Frames per Second
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 | Generation step
220 | Only powers of 2 (automatically rounded)
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 | Border width
229 | 0 .. 0.5
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
Save
241 |
Reset
242 |
Abort
243 |
244 |
251 |
252 |
253 |
254 |
255 |
--------------------------------------------------------------------------------
/examples/c5greyship.rle:
--------------------------------------------------------------------------------
1 | #N c/5 greyship
2 | #O Hartmut Holzwart
3 | #C A c/5 orthogonal greyship discovered in March 2010
4 | #C http://www.conwaylife.com/wiki/index.php?title=C/5_orthogonal
5 | x = 286, y = 199, rule = b3/s23
6 | 86b5o195b$89bobo194b$85bo6bo5b5o183b$85bo3bo11bobo182b$86b2obo7bo6bo5b
7 | 5o171b$89bob2o4bo3bo11bobo170b$87b2o9b2obo7bo6bo5b5o159b$88bo12bob2o4b
8 | o3bo11bobo158b$86b2o11b2o9b2obo7bo6bo5b5o147b$85bobo12bo12bob2o4bo3bo
9 | 11bobo146b$85bob2o9b2o11b2o9b2obo7bo6bo5b5o135b$86bobo8bobo12bo12bob2o
10 | 4bo3bo11bobo134b$88bo8bob2o9b2o11b2o9b2obo7bo6bo5b5o123b$98bobo8bobo
11 | 12bo12bob2o4bo3bo11bobo122b$88bo11bo8bob2o9b2o11b2o9b2obo7bo6bo5b5o
12 | 111b$86bobo21bobo8bobo12bo12bob2o4bo3bo11bobo110b$85bob2o11bo11bo8bob
13 | 2o9b2o11b2o9b2obo7bo6bo5b5o99b$85bobo10bobo21bobo8bobo12bo12bob2o4bo3b
14 | o11bobo98b$86b2o9bob2o11bo11bo8bob2o9b2o11b2o9b2obo7bo6bo5b5o87b$88bo
15 | 8bobo10bobo21bobo8bobo12bo12bob2o4bo3bo11bobo86b$87b2o9b2o9bob2o11bo
16 | 11bo8bob2o9b2o11b2o9b2obo7bo6bo5b5o75b$89bob2o7bo8bobo10bobo21bobo8bob
17 | o12bo12bob2o4bo3bo11bobo74b$86b2obo9b2o9b2o9bob2o11bo11bo8bob2o9b2o11b
18 | 2o9b2obo7bo6bo5b5o63b$85bo3bo11bob2o7bo8bobo10bobo21bobo8bobo12bo12bob
19 | 2o4bo3bo11bobo62b$85bo6bo5b2obo9b2o9b2o9bob2o11bo11bo8bob2o9b2o11b2o9b
20 | 2obo7bo6bo5b5o51b$89bobo5bo3bo11bob2o7bo8bobo10bobo21bobo8bobo12bo12bo
21 | b2o4bo3bo11bobo50b$86b5o6bo6bo5b2obo9b2o9b2o9bob2o11bo11bo8bob2o9b2o
22 | 11b2o9b2obo7bo6bo5b5o39b$101bobo5bo3bo11bob2o7bo8bobo10bobo21bobo8bobo
23 | 12bo12bob2o4bo3bo11bobo38b$93bo4b5o6bo6bo5b2obo9b2o9b2o9bob2o11bo11bo
24 | 8bob2o9b2o11b2o9b2obo7bo6bo37b$91b2o20bobo5bo3bo11bob2o7bo8bobo10bobo
25 | 21bobo8bobo12bo12bob2o4bo3bo40b$105bo4b5o6bo6bo5b2obo9b2o9b2o9bob2o11b
26 | o11bo8bob2o9b2o11b2o9b2obo40b$92b2o9b2o20bobo5bo3bo11bob2o7bo8bobo10bo
27 | bo21bobo8bobo12bo12bob2o37b$117bo4b5o6bo6bo5b2obo9b2o9b2o9bob2o11bo11b
28 | o8bob2o9b2o11b2o41b$92bo11b2o9b2o20bobo5bo3bo11bob2o7bo8bobo10bobo21bo
29 | bo8bobo12bo41b$129bo4b5o6bo6bo5b2obo9b2o9b2o9bob2o11bo11bo8bob2o9b2o
30 | 42b$91b2o11bo11b2o9b2o20bobo5bo3bo11bob2o7bo8bobo10bobo21bobo8bobo42b$
31 | 90b2o49bo4b5o6bo6bo5b2obo9b2o9b2o9bob2o11bo11bo8bob2o41b$89bo13b2o11bo
32 | 11b2o9b2o20bobo5bo3bo11bob2o7bo8bobo10bobo21bobo41b$89bo12b2o49bo4b5o
33 | 6bo6bo5b2obo9b2o9b2o9bob2o11bo11bo41b$90b2o9bo13b2o11bo11b2o9b2o20bobo
34 | 5bo3bo11bob2o7bo8bobo10bobo53b$91b2o8bo12b2o49bo4b5o6bo6bo5b2obo9b2o9b
35 | 2o9bob2o11bo41b$102b2o9bo13b2o11bo11b2o9b2o20bobo5bo3bo11bob2o7bo8bobo
36 | 10bobo41b$92bo10b2o8bo12b2o49bo4b5o6bo6bo5b2obo9b2o9b2o9bob2o41b$114b
37 | 2o9bo13b2o11bo11b2o9b2o20bobo5bo3bo11bob2o7bo8bobo42b$92b2o10bo10b2o8b
38 | o12b2o49bo4b5o6bo6bo5b2obo9b2o9b2o42b$126b2o9bo13b2o11bo11b2o9b2o20bob
39 | o5bo3bo11bob2o7bo41b$91b3o10b2o10bo10b2o8bo12b2o49bo4b5o6bo6bo5b2obo9b
40 | 2o41b$91b2o45b2o9bo13b2o11bo11b2o9b2o20bobo5bo3bo11bob2o37b$93bo9b3o
41 | 10b2o10bo10b2o8bo12b2o49bo4b5o6bo6bo5b2obo40b$90b3o10b2o45b2o9bo13b2o
42 | 11bo11b2o9b2o20bobo5bo3bo40b$89bo15bo9b3o10b2o10bo10b2o8bo12b2o49bo4b
43 | 5o6bo6bo37b$90bo11b3o10b2o45b2o9bo13b2o11bo11b2o9b2o20bobo38b$90bo10bo
44 | 15bo9b3o10b2o10bo10b2o8bo12b2o49bo4b5o39b$90bo11bo11b3o10b2o45b2o9bo
45 | 13b2o11bo11b2o9b2o49b$102bo10bo15bo9b3o10b2o10bo10b2o8bo12b2o49bo36b$
46 | 85b2ob2o12bo11bo11b3o10b2o45b2o9bo13b2o11bo11b2o9b2o37b$85b2o27bo10bo
47 | 15bo9b3o10b2o10bo10b2o8bo12b2o74b$97b2ob2o12bo11bo11b3o10b2o45b2o9bo
48 | 13b2o11bo11b2o36b$86bo10b2o27bo10bo15bo9b3o10b2o10bo10b2o8bo12b2o62b$
49 | 86bobo20b2ob2o12bo11bo11b3o10b2o45b2o9bo13b2o11bo37b$79b2o4bo2bo9bo10b
50 | 2o27bo10bo15bo9b3o10b2o10bo10b2o8bo12b2o50b$78b3o5bo11bobo20b2ob2o12bo
51 | 11bo11b3o10b2o45b2o9bo13b2o37b$77b2ob2o4b2o9bo2bo9bo10b2o27bo10bo15bo
52 | 9b3o10b2o10bo10b2o8bo12b2o38b$79bo6bo2bo8bo11bobo20b2ob2o12bo11bo11b3o
53 | 10b2o45b2o9bo40b$77b2o10bo8b2o9bo2bo9bo10b2o27bo10bo15bo9b3o10b2o10bo
54 | 10b2o8bo40b$70b2o5bo2bo3bo2bo10bo2bo8bo11bobo20b2ob2o12bo11bo11b3o10b
55 | 2o45b2o38b$71bobo5b2o3b2o15bo8b2o9bo2bo9bo10b2o27bo10bo15bo9b3o10b2o
56 | 10bo10b2o37b$70bob2o17b2o3bo2bo10bo2bo8bo11bobo20b2ob2o12bo11bo11b3o
57 | 10b2o73b$64bo5bo7b10o3b2o3b2o15bo8b2o9bo2bo9bo10b2o27bo10bo15bo9b3o10b
58 | 2o10bo37b$64b2o4bo2bo3bo10bo14b2o3bo2bo10bo2bo8bo11bobo20b2ob2o12bo11b
59 | o11b3o10b2o61b$63bo2bo4b4ob24o3b2o3b2o15bo8b2o9bo2bo9bo10b2o27bo10bo
60 | 15bo9b3o10b2o36b$62b2o3bo3bo3bo24bo14b2o3bo2bo10bo2bo8bo11bobo20b2ob2o
61 | 12bo11bo11b3o10b2o49b$56bobo3b2o6b42o3b2o3b2o15bo8b2o9bo2bo9bo10b2o27b
62 | o10bo15bo9b3o36b$55bo13bo42bo14b2o3bo2bo10bo2bo8bo11bobo20b2ob2o12bo
63 | 11bo11b3o10b2o37b$55bo3bo3b4o2b55o3b2o3b2o15bo8b2o9bo2bo9bo10b2o27bo
64 | 10bo15bo36b$57b2o65bo14b2o3bo2bo10bo2bo8bo11bobo20b2ob2o12bo11bo11b3o
65 | 37b$21b5o29b3o5b73o3b2o3b2o15bo8b2o9bo2bo9bo10b2o27bo10bo40b$24bobo21b
66 | 3o4bo2bo3bo73bo14b2o3bo2bo10bo2bo8bo11bobo20b2ob2o12bo11bo39b$20bo6bo
67 | 23bo5b2o3b86o3b2o3b2o15bo8b2o9bo2bo9bo10b2o27bo39b$20bo3bo23bob2o4bo3b
68 | o87bo14b2o3bo2bo10bo2bo8bo11bobo20b2ob2o12bo39b$21b2obo17b2o3b2ob2o4b
69 | 104o3b2o3b2o15bo8b2o9bo2bo9bo10b2o55b$24bob2o13b3o4bo2b2obo105bo14b2o
70 | 3bo2bo10bo2bo8bo11bobo20b2ob2o40b$22b2o16b2ob2o3b2ob121o3b2o3b2o15bo8b
71 | 2o9bo2bo9bo10b2o43b$23bo18bo129bo14b2o3bo2bo10bo2bo8bo11bobo53b$21b2o
72 | 17b2o6b136o3b2o3b2o15bo8b2o9bo2bo9bo43b$20bobo10b2o5bo2bo3bo136bo14b2o
73 | 3bo2bo10bo2bo8bo11bobo8b3o30b$20bob2o10bobo5b2o3b149o3b2o3b2o15bo8b2o
74 | 9bo2bo11bo29b$21bobo9bob2o159bo14b2o3bo2bo10bo2bo8bo10bob2o29b$23bo9bo
75 | 7b167o3b2o3b2o15bo8b2o8b2ob2o29b$33bo2bo3bo167bo14b2o3bo2bo10bo2bo7bo
76 | 2b2o9bo2bobo13b$6b2o15bo10b4ob181o3b2o3b2o15bo7b2ob2o4bo3b5obo13b$5bo
77 | 3bo11bobo10bo3bo181bo14b2o3bo2bo14bo2bob2o19bob$4b2obobo6b2o3b3o9b199o
78 | 3b2o3b2o11b9o2bobobo10b2o2b2ob$15bo4bobo4b2obobo199bo14b2o3bo7bo2b2o3b
79 | obo7bob4obo$4b8o3b2o4b2o4b2obob212o3b2o3b8o3b2o2bo2bobob2o3b3o4b$3bo4b
80 | obo6bo6bo219bo16bo2bo2bo2bob6o2b2obo2b$4b2obo3b6o3b245o8b2o2bo2b2obo2b
81 | $4bo2b2o259bo7bo2b3obo2b$5bo4b259o8b3o4bob$6o280b$5bo4b259o8b3o4bob$4b
82 | o2b2o259bo7bo2b3obo2b$4b2obo3b6o3b245o8b2o2bo2b2obo2b$3bo4bobo6bo6bo
83 | 219bo16bo2bo2bo2bob6o2b2obo2b$4b8o3b2o4b2o4b2obob212o3b2o3b8o3b2o2bo2b
84 | obob2o3b3o4b$15bo4bobo4b2obobo199bo14b2o3bo7bo2b2o3bobo7bob4obo$4b2obo
85 | bo6b2o3b3o9b199o3b2o3b2o11b9o2bobobo10b2o2b2ob$5bo3bo11bobo10bo3bo181b
86 | o14b2o3bo2bo14bo2bob2o19bob$6b2o15bo10b4ob181o3b2o3b2o15bo7b2ob2o4bo3b
87 | 5obo13b$33bo2bo3bo167bo14b2o3bo2bo10bo2bo7bo2b2o9bo2bobo13b$23bo9bo7b
88 | 167o3b2o3b2o15bo8b2o8b2ob2o29b$21bobo9bob2o159bo14b2o3bo2bo10bo2bo8bo
89 | 10bob2o29b$20bob2o10bobo5b2o3b149o3b2o3b2o15bo8b2o9bo2bo11bo29b$20bobo
90 | 10b2o5bo2bo3bo136bo14b2o3bo2bo10bo2bo8bo11bobo8b3o30b$21b2o17b2o6b136o
91 | 3b2o3b2o15bo8b2o9bo2bo9bo43b$23bo18bo129bo14b2o3bo2bo10bo2bo8bo11bobo
92 | 53b$22b2o16b2ob2o3b2ob121o3b2o3b2o15bo8b2o9bo2bo9bo10b2o43b$24bob2o13b
93 | 3o4bo2b2obo105bo14b2o3bo2bo10bo2bo8bo11bobo20b2ob2o40b$21b2obo17b2o3b
94 | 2ob2o4b104o3b2o3b2o15bo8b2o9bo2bo9bo10b2o55b$20bo3bo23bob2o4bo3bo87bo
95 | 14b2o3bo2bo10bo2bo8bo11bobo20b2ob2o12bo39b$20bo6bo23bo5b2o3b86o3b2o3b
96 | 2o15bo8b2o9bo2bo9bo10b2o27bo39b$24bobo21b3o4bo2bo3bo73bo14b2o3bo2bo10b
97 | o2bo8bo11bobo20b2ob2o12bo11bo39b$21b5o29b3o5b73o3b2o3b2o15bo8b2o9bo2bo
98 | 9bo10b2o27bo10bo40b$57b2o65bo14b2o3bo2bo10bo2bo8bo11bobo20b2ob2o12bo
99 | 11bo11b3o37b$55bo3bo3b4o2b55o3b2o3b2o15bo8b2o9bo2bo9bo10b2o27bo10bo15b
100 | o36b$55bo13bo42bo14b2o3bo2bo10bo2bo8bo11bobo20b2ob2o12bo11bo11b3o10b2o
101 | 37b$56bobo3b2o6b42o3b2o3b2o15bo8b2o9bo2bo9bo10b2o27bo10bo15bo9b3o36b$
102 | 62b2o3bo3bo3bo24bo14b2o3bo2bo10bo2bo8bo11bobo20b2ob2o12bo11bo11b3o10b
103 | 2o49b$63bo2bo4b4ob24o3b2o3b2o15bo8b2o9bo2bo9bo10b2o27bo10bo15bo9b3o10b
104 | 2o36b$64b2o4bo2bo3bo10bo14b2o3bo2bo10bo2bo8bo11bobo20b2ob2o12bo11bo11b
105 | 3o10b2o61b$64bo5bo7b10o3b2o3b2o15bo8b2o9bo2bo9bo10b2o27bo10bo15bo9b3o
106 | 10b2o10bo37b$70bob2o17b2o3bo2bo10bo2bo8bo11bobo20b2ob2o12bo11bo11b3o
107 | 10b2o73b$71bobo5b2o3b2o15bo8b2o9bo2bo9bo10b2o27bo10bo15bo9b3o10b2o10bo
108 | 10b2o37b$70b2o5bo2bo3bo2bo10bo2bo8bo11bobo20b2ob2o12bo11bo11b3o10b2o
109 | 45b2o38b$77b2o10bo8b2o9bo2bo9bo10b2o27bo10bo15bo9b3o10b2o10bo10b2o8bo
110 | 40b$79bo6bo2bo8bo11bobo20b2ob2o12bo11bo11b3o10b2o45b2o9bo40b$77b2ob2o
111 | 4b2o9bo2bo9bo10b2o27bo10bo15bo9b3o10b2o10bo10b2o8bo12b2o38b$78b3o5bo
112 | 11bobo20b2ob2o12bo11bo11b3o10b2o45b2o9bo13b2o37b$79b2o4bo2bo9bo10b2o
113 | 27bo10bo15bo9b3o10b2o10bo10b2o8bo12b2o50b$86bobo20b2ob2o12bo11bo11b3o
114 | 10b2o45b2o9bo13b2o11bo37b$86bo10b2o27bo10bo15bo9b3o10b2o10bo10b2o8bo
115 | 12b2o62b$97b2ob2o12bo11bo11b3o10b2o45b2o9bo13b2o11bo11b2o36b$85b2o27bo
116 | 10bo15bo9b3o10b2o10bo10b2o8bo12b2o74b$85b2ob2o12bo11bo11b3o10b2o45b2o
117 | 9bo13b2o11bo11b2o9b2o37b$102bo10bo15bo9b3o10b2o10bo10b2o8bo12b2o49bo
118 | 36b$90bo11bo11b3o10b2o45b2o9bo13b2o11bo11b2o9b2o49b$90bo10bo15bo9b3o
119 | 10b2o10bo10b2o8bo12b2o49bo4b5o39b$90bo11b3o10b2o45b2o9bo13b2o11bo11b2o
120 | 9b2o20bobo38b$89bo15bo9b3o10b2o10bo10b2o8bo12b2o49bo4b5o6bo6bo37b$90b
121 | 3o10b2o45b2o9bo13b2o11bo11b2o9b2o20bobo5bo3bo40b$93bo9b3o10b2o10bo10b
122 | 2o8bo12b2o49bo4b5o6bo6bo5b2obo40b$91b2o45b2o9bo13b2o11bo11b2o9b2o20bob
123 | o5bo3bo11bob2o37b$91b3o10b2o10bo10b2o8bo12b2o49bo4b5o6bo6bo5b2obo9b2o
124 | 41b$126b2o9bo13b2o11bo11b2o9b2o20bobo5bo3bo11bob2o7bo41b$92b2o10bo10b
125 | 2o8bo12b2o49bo4b5o6bo6bo5b2obo9b2o9b2o42b$114b2o9bo13b2o11bo11b2o9b2o
126 | 20bobo5bo3bo11bob2o7bo8bobo42b$92bo10b2o8bo12b2o49bo4b5o6bo6bo5b2obo9b
127 | 2o9b2o9bob2o41b$102b2o9bo13b2o11bo11b2o9b2o20bobo5bo3bo11bob2o7bo8bobo
128 | 10bobo41b$91b2o8bo12b2o49bo4b5o6bo6bo5b2obo9b2o9b2o9bob2o11bo41b$90b2o
129 | 9bo13b2o11bo11b2o9b2o20bobo5bo3bo11bob2o7bo8bobo10bobo53b$89bo12b2o49b
130 | o4b5o6bo6bo5b2obo9b2o9b2o9bob2o11bo11bo41b$89bo13b2o11bo11b2o9b2o20bob
131 | o5bo3bo11bob2o7bo8bobo10bobo21bobo41b$90b2o49bo4b5o6bo6bo5b2obo9b2o9b
132 | 2o9bob2o11bo11bo8bob2o41b$91b2o11bo11b2o9b2o20bobo5bo3bo11bob2o7bo8bob
133 | o10bobo21bobo8bobo42b$129bo4b5o6bo6bo5b2obo9b2o9b2o9bob2o11bo11bo8bob
134 | 2o9b2o42b$92bo11b2o9b2o20bobo5bo3bo11bob2o7bo8bobo10bobo21bobo8bobo12b
135 | o41b$117bo4b5o6bo6bo5b2obo9b2o9b2o9bob2o11bo11bo8bob2o9b2o11b2o41b$92b
136 | 2o9b2o20bobo5bo3bo11bob2o7bo8bobo10bobo21bobo8bobo12bo12bob2o37b$105bo
137 | 4b5o6bo6bo5b2obo9b2o9b2o9bob2o11bo11bo8bob2o9b2o11b2o9b2obo40b$91b2o
138 | 20bobo5bo3bo11bob2o7bo8bobo10bobo21bobo8bobo12bo12bob2o4bo3bo40b$93bo
139 | 4b5o6bo6bo5b2obo9b2o9b2o9bob2o11bo11bo8bob2o9b2o11b2o9b2obo7bo6bo37b$
140 | 101bobo5bo3bo11bob2o7bo8bobo10bobo21bobo8bobo12bo12bob2o4bo3bo11bobo
141 | 38b$86b5o6bo6bo5b2obo9b2o9b2o9bob2o11bo11bo8bob2o9b2o11b2o9b2obo7bo6bo
142 | 5b5o39b$89bobo5bo3bo11bob2o7bo8bobo10bobo21bobo8bobo12bo12bob2o4bo3bo
143 | 11bobo50b$85bo6bo5b2obo9b2o9b2o9bob2o11bo11bo8bob2o9b2o11b2o9b2obo7bo
144 | 6bo5b5o51b$85bo3bo11bob2o7bo8bobo10bobo21bobo8bobo12bo12bob2o4bo3bo11b
145 | obo62b$86b2obo9b2o9b2o9bob2o11bo11bo8bob2o9b2o11b2o9b2obo7bo6bo5b5o63b
146 | $89bob2o7bo8bobo10bobo21bobo8bobo12bo12bob2o4bo3bo11bobo74b$87b2o9b2o
147 | 9bob2o11bo11bo8bob2o9b2o11b2o9b2obo7bo6bo5b5o75b$88bo8bobo10bobo21bobo
148 | 8bobo12bo12bob2o4bo3bo11bobo86b$86b2o9bob2o11bo11bo8bob2o9b2o11b2o9b2o
149 | bo7bo6bo5b5o87b$85bobo10bobo21bobo8bobo12bo12bob2o4bo3bo11bobo98b$85bo
150 | b2o11bo11bo8bob2o9b2o11b2o9b2obo7bo6bo5b5o99b$86bobo21bobo8bobo12bo12b
151 | ob2o4bo3bo11bobo110b$88bo11bo8bob2o9b2o11b2o9b2obo7bo6bo5b5o111b$98bob
152 | o8bobo12bo12bob2o4bo3bo11bobo122b$88bo8bob2o9b2o11b2o9b2obo7bo6bo5b5o
153 | 123b$86bobo8bobo12bo12bob2o4bo3bo11bobo134b$85bob2o9b2o11b2o9b2obo7bo
154 | 6bo5b5o135b$85bobo12bo12bob2o4bo3bo11bobo146b$86b2o11b2o9b2obo7bo6bo5b
155 | 5o147b$88bo12bob2o4bo3bo11bobo158b$87b2o9b2obo7bo6bo5b5o159b$89bob2o4b
156 | o3bo11bobo170b$86b2obo7bo6bo5b5o171b$85bo3bo11bobo182b$85bo6bo5b5o183b
157 | $89bobo194b$86b5o!
--------------------------------------------------------------------------------
/draw.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | /** @constructor */
4 | function LifeCanvasDrawer()
5 | {
6 | var
7 |
8 | // where is the viewport in pixels, from 0,0
9 | /** @type {number} */
10 | canvas_offset_x = 0,
11 | /** @type {number} */
12 | canvas_offset_y = 0,
13 |
14 | canvas_width,
15 | canvas_height,
16 |
17 | // canvas contexts
18 | canvas,
19 | context,
20 |
21 | image_data,
22 | image_data_data,
23 |
24 | // in pixels
25 | border_width,
26 | cell_color_rgb,
27 |
28 | drawer = this;
29 |
30 | var pixel_ratio = 1;
31 |
32 |
33 | this.cell_color = null;
34 | this.background_color = null;
35 |
36 | // given as ratio of cell size
37 | this.border_width = 0;
38 |
39 |
40 | this.init = init;
41 | this.redraw = redraw;
42 | this.move = move;
43 | this.zoom_at = zoom_at;
44 | this.zoom_centered = zoom_centered;
45 | this.fit_bounds = fit_bounds;
46 | this.set_size = set_size;
47 | this.draw_cell = draw_cell;
48 | this.center_view = center_view;
49 | this.zoom_to = zoom_to;
50 | this.pixel2cell = pixel2cell;
51 |
52 |
53 |
54 | function init(dom_parent)
55 | {
56 | canvas = document.createElement("canvas");
57 |
58 | if(!canvas.getContext) {
59 | return false;
60 | }
61 |
62 | drawer.canvas = canvas;
63 |
64 | context = canvas.getContext("2d");
65 |
66 | dom_parent.appendChild(canvas);
67 |
68 | return true;
69 | }
70 |
71 | function set_size(width, height)
72 | {
73 | if(width !== canvas_width || height !== canvas_height)
74 | {
75 | if(true)
76 | {
77 | canvas.style.width = width + "px";
78 | canvas.style.height = height + "px";
79 | var factor = window.devicePixelRatio;
80 | }
81 | else
82 | {
83 | var factor = 1;
84 | }
85 |
86 | pixel_ratio = factor;
87 |
88 | // Math.round is important here: Neither floor nor ceil produce
89 | // sharp pixels (test by taking a screenshot at 1:1 zoom and
90 | // inspecting in an image editor)
91 | canvas.width = Math.round(width * factor);
92 | canvas.height = Math.round(height * factor);
93 |
94 | canvas_width = canvas.width;
95 | canvas_height = canvas.height;
96 |
97 | image_data = context.createImageData(canvas_width, canvas_height);
98 | image_data_data = new Int32Array(image_data.data.buffer);
99 |
100 | for(var i = 0; i < width * height; i++)
101 | {
102 | image_data_data[i] = 0xFF << 24;
103 | }
104 | }
105 | }
106 |
107 | function draw_node(node, size, left, top)
108 | {
109 | if(node.population === 0)
110 | {
111 | return;
112 | }
113 |
114 | if(
115 | left + size + canvas_offset_x < 0 ||
116 | top + size + canvas_offset_y < 0 ||
117 | left + canvas_offset_x >= canvas_width ||
118 | top + canvas_offset_y >= canvas_height
119 | ) {
120 | // do not draw outside of the screen
121 | return;
122 | }
123 |
124 | if(size <= 1)
125 | {
126 | if(node.population)
127 | {
128 | fill_square(left + canvas_offset_x | 0, top + canvas_offset_y | 0, 1);
129 | }
130 | }
131 | else if(node.level === 0)
132 | {
133 | if(node.population)
134 | {
135 | fill_square(left + canvas_offset_x, top + canvas_offset_y, drawer.cell_width);
136 | }
137 | }
138 | else
139 | {
140 | size /= 2;
141 |
142 | draw_node(node.nw, size, left, top);
143 | draw_node(node.ne, size, left + size, top);
144 | draw_node(node.sw, size, left, top + size);
145 | draw_node(node.se, size, left + size, top + size);
146 | }
147 | }
148 |
149 | function fill_square(x, y, size)
150 | {
151 | var width = size - border_width,
152 | height = width;
153 |
154 | if(x < 0)
155 | {
156 | width += x;
157 | x = 0;
158 | }
159 |
160 | if(x + width > canvas_width)
161 | {
162 | width = canvas_width - x;
163 | }
164 |
165 | if(y < 0)
166 | {
167 | height += y;
168 | y = 0;
169 | }
170 |
171 | if(y + height > canvas_height)
172 | {
173 | height = canvas_height - y;
174 | }
175 |
176 | if(width <= 0 || height <= 0)
177 | {
178 | return;
179 | }
180 |
181 | var pointer = x + y * canvas_width,
182 | row_width = canvas_width - width;
183 |
184 | //console.assert(x >= 0 && y >= 0 && x + width <= canvas_width && y + height <= canvas_height);
185 | var color = cell_color_rgb.r | cell_color_rgb.g << 8 | cell_color_rgb.b << 16 | 0xFF << 24;
186 |
187 | for(var i = 0; i < height; i++)
188 | {
189 | for(var j = 0; j < width; j++)
190 | {
191 | image_data_data[pointer] = color;
192 |
193 | pointer++;
194 | }
195 | pointer += row_width;
196 | }
197 | }
198 |
199 |
200 | function redraw(node)
201 | {
202 | var bg_color_rgb = color2rgb(drawer.background_color);
203 | var bg_color_int = bg_color_rgb.r | bg_color_rgb.g << 8 | bg_color_rgb.b << 16 | 0xFF << 24;
204 |
205 | border_width = drawer.border_width * drawer.cell_width | 0;
206 | cell_color_rgb = color2rgb(drawer.cell_color);
207 |
208 | var count = canvas_width * canvas_height;
209 |
210 | for(var i = 0; i < count; i++)
211 | {
212 | image_data_data[i] = bg_color_int;
213 | }
214 |
215 | var size = Math.pow(2, node.level - 1) * drawer.cell_width;
216 |
217 | draw_node(node, 2 * size, -size, -size);
218 |
219 | context.putImageData(image_data, 0, 0);
220 | }
221 |
222 | /**
223 | * @param {number} center_x
224 | * @param {number} center_y
225 | */
226 | function zoom(out, center_x, center_y)
227 | {
228 | if(out)
229 | {
230 | canvas_offset_x -= Math.round((canvas_offset_x - center_x) / 2);
231 | canvas_offset_y -= Math.round((canvas_offset_y - center_y) / 2);
232 |
233 | drawer.cell_width /= 2;
234 | }
235 | else
236 | {
237 | canvas_offset_x += Math.round(canvas_offset_x - center_x);
238 | canvas_offset_y += Math.round(canvas_offset_y - center_y);
239 |
240 | drawer.cell_width *= 2;
241 | }
242 | }
243 |
244 | /**
245 | * @param {number} center_x
246 | * @param {number} center_y
247 | */
248 | function zoom_at(out, center_x, center_y)
249 | {
250 | zoom(out, center_x * pixel_ratio, center_y * pixel_ratio);
251 | }
252 |
253 | function zoom_centered(out)
254 | {
255 | zoom(out, canvas_width >> 1, canvas_height >> 1);
256 | }
257 |
258 | /*
259 | * set zoom to the given level, rounding down
260 | */
261 | function zoom_to(level)
262 | {
263 | while(drawer.cell_width > level)
264 | {
265 | zoom_centered(true);
266 | }
267 |
268 | while(drawer.cell_width * 2 < level)
269 | {
270 | zoom_centered(false);
271 | }
272 | }
273 |
274 | function center_view()
275 | {
276 | canvas_offset_x = canvas_width >> 1;
277 | canvas_offset_y = canvas_height >> 1;
278 | }
279 |
280 | function move(dx, dy)
281 | {
282 | canvas_offset_x += Math.round(dx * pixel_ratio);
283 | canvas_offset_y += Math.round(dy * pixel_ratio);
284 |
285 | // This code is faster for patterns with a huge density (for instance, spacefiller)
286 | // It causes jitter for all other patterns though, that's why the above version is preferred
287 |
288 | //context.drawImage(canvas, dx, dy);
289 |
290 | //if(dx < 0)
291 | //{
292 | // redraw_part(node, canvas_width + dx, 0, -dx, canvas_height);
293 | //}
294 | //else if(dx > 0)
295 | //{
296 | // redraw_part(node, 0, 0, dx, canvas_height);
297 | //}
298 |
299 | //if(dy < 0)
300 | //{
301 | // redraw_part(node, 0, canvas_height + dy, canvas_width, -dy);
302 | //}
303 | //else if(dy > 0)
304 | //{
305 | // redraw_part(node, 0, 0, canvas_width, dy);
306 | //}
307 | }
308 |
309 | function fit_bounds(bounds)
310 | {
311 | var width = bounds.right - bounds.left,
312 | height = bounds.bottom - bounds.top,
313 | relative_size,
314 | x,
315 | y;
316 |
317 | if(isFinite(width) && isFinite(height))
318 | {
319 | relative_size = Math.min(
320 | 16, // maximum cell size
321 | canvas_width / width, // relative width
322 | canvas_height / height // relative height
323 | );
324 | zoom_to(relative_size);
325 |
326 | x = Math.round(canvas_width / 2 - (bounds.left + width / 2) * drawer.cell_width);
327 | y = Math.round(canvas_height / 2 - (bounds.top + height / 2) * drawer.cell_width);
328 | }
329 | else
330 | {
331 | // can happen if the pattern is empty or very large
332 | zoom_to(16);
333 |
334 | x = canvas_width >> 1;
335 | y = canvas_height >> 1;
336 | }
337 |
338 | canvas_offset_x = x;
339 | canvas_offset_y = y;
340 | }
341 |
342 | function draw_cell(x, y, set)
343 | {
344 | var cell_x = x * drawer.cell_width + canvas_offset_x,
345 | cell_y = y * drawer.cell_width + canvas_offset_y,
346 | width = Math.ceil(drawer.cell_width) -
347 | (drawer.cell_width * drawer.border_width | 0);
348 |
349 | if(set) {
350 | context.fillStyle = drawer.cell_color;
351 | }
352 | else {
353 | context.fillStyle = drawer.background_color;
354 | }
355 |
356 | context.fillRect(cell_x, cell_y, width, width);
357 | }
358 |
359 | function pixel2cell(x, y)
360 | {
361 | return {
362 | x : Math.floor((x * pixel_ratio - canvas_offset_x + drawer.border_width / 2) / drawer.cell_width),
363 | y : Math.floor((y * pixel_ratio - canvas_offset_y + drawer.border_width / 2) / drawer.cell_width)
364 | };
365 | }
366 |
367 | // #321 or #332211 to { r: 0x33, b: 0x22, g: 0x11 }
368 | function color2rgb(color)
369 | {
370 | if(color.length === 4)
371 | {
372 | return {
373 | r: parseInt(color[1] + color[1], 16),
374 | g: parseInt(color[2] + color[2], 16),
375 | b: parseInt(color[3] + color[3], 16)
376 | };
377 | }
378 | else
379 | {
380 | return {
381 | r: parseInt(color.slice(1, 3), 16),
382 | g: parseInt(color.slice(3, 5), 16),
383 | b: parseInt(color.slice(5, 7), 16)
384 | };
385 | }
386 | }
387 | }
388 |
--------------------------------------------------------------------------------
/examples/breeder1.rle:
--------------------------------------------------------------------------------
1 | #N Breeder 1
2 | #O Bill Gosper
3 | #C The first pattern to be found that exhibits quadratic growth. Found
4 | #C in the early 1970s.
5 | #C www.conwaylife.com/wiki/index.php?title=Breeder_1
6 | x = 749, y = 338, rule = b3/s23
7 | 404bo2bo341b$408bo340b$404bo3bo340b$405b4o340b$416b2o331b$402bo11bo4bo
8 | 329b$400bobo17bo328b$342bobo46bo8bobo11bo5bo328b$342bobo44bo3bo21b6o5b
9 | 6o317b$331bo10bob2o48bo30bo5bo317b$329bo3bo10b2o43bo4bo36bo317b$334bo
10 | 6bo2bo45b5o30bo4bo318b$329bo4bo7b2o83b2o320b$330b5o50b2o362b$385b2o32b
11 | 3o5b2o320b$385b2o2bo13bo13bo3bo4bob2o319b$368b2o12b2ob2o3bo11bobo12bo
12 | 7b2obobo318b$355b2o10bo2bo8b2o2bobo4bo4b2o4bo9b2o4bo7bob2ob2o317b$355b
13 | 2o11b2o9b2o2b3o3bo5b2o5bo8b2o5bo2bo3bo3b2o318b$419bobo5b3o319b2$419bob
14 | o5b3o319b$355b2o11b2o9b2o2b3o3bo5b2o5bo8b2o5bo2bo3bo3b2o318b$355b2o10b
15 | o2bo8b2o2bobo4bo4b2o4bo9b2o4bo7bob2ob2o317b$368b2o12b2ob2o3bo11bobo12b
16 | o7b2obobo318b$385b2o2bo13bo13bo3bo4bob2o319b$385b2o32b3o5b2o320b$330b
17 | 5o50b2o362b$329bo4bo7b2o83b2o320b$334bo6bo2bo45b5o30bo4bo318b$329bo3bo
18 | 10b2o43bo4bo36bo317b$331bo10bob2o48bo30bo5bo317b$342bobo44bo3bo21b6o5b
19 | 6o317b$342bobo46bo8bobo11bo5bo328b$400b2o18bo328b$401bo12bo4bo329b$
20 | 416b2o331b$477b2o270b$475b2ob2o269b$475b4o270b$476b2o271b$376bobo370b$
21 | 376b2o111b2o258b$377bo107b4ob2o5b4o248b$485b6o5b6o247b$463b2o21b4o6b4o
22 | b2o246b$460b3ob2o34b2o247b$403b2o55b5o21bo262b$400b3ob2o46bo8b3o23bo
23 | 261b$352bobo45b5o21b3o23bo32b4o260b$352b2o47b3o20bo2b2o54b2o3bob2o257b
24 | $353bo69bo3bobo26bo11b2o14bobobobo7b2o249b$421bo3bo9bobo13b4obo10bo2bo
25 | 13bo3b3o2bo3bo2b2o247b$405b2o14bo3b2o11bo11bo2bob2o4b2o4bobo7b2o6bobo
26 | 3bo4b3o2bo247b$405b2o14bo8bo3b2obo12bobo8b2o5bo8b2o7bo4b3o2bo4bo247b$
27 | 422bo3bo3b3o3bo14bo44b5o248b2$328bobo91bo3bo3b3o3bo14bo44b5o248b$328b
28 | 2o11b2o30b2o30b2o14bo8bo3b2obo12bobo8b2o5bo8b2o7bo4b3o2bo4bo247b$329bo
29 | 11b2o30b2o30b2o14bo3b2o11bo11bo2bob2o4b2o4bobo7b2o6bobo3bo4b3o2bo247b$
30 | 421bo3bo9bobo13b4obo10bo2bo13bo3b3o2bo3bo2b2o247b$423bo3bobo26bo11b2o
31 | 14bobobobo7b2o249b$424bo2b2o54b2o3bob2o257b$426b3o23bo32b4o260b$452bo
32 | 8b3o23bo261b$460b5o21bo262b$460b3ob2o34b2o89b2o156b$463b2o21b4o6b4ob2o
33 | 87b4o155b$485b6o5b6o88b2ob2o154b$485b4ob2o5b4o91b2o155b$489b2o258b$
34 | 464bo136b4o144b$464bobo133b6o143b$280bobo181b2o134b4ob2o142b$280b2o
35 | 294b3o13b3o9b2o9b2o132b$281bo252bobo38b5o12bo18b4ob2o131b$516b3o14b2o
36 | 2bo37b3ob2o12bo17b6o132b$515b5o12b3o2bo40b2o27bo4b4o133b$515b3ob2o10b
37 | 3o72bo2bo139b$440bo77b2o11bobo2b2o59b3o149b$440bobo87b2ob3obo38b2o17b
38 | 5o12b2o135b$440b2o89bo6bo37b2o16b3o14bo3bo133b$532bo4bo20b2o15bo2bo14b
39 | o3bo9bo3bo4bo132b$534b5o6b2o10bo2bo8b2o4bobo7b2o5b2o2bo4b2o5bobo5bo
40 | 132b$538b2o5b2o11b2o9b2o5bo8b2o5bo6b3o9b2ob3o132b$538b2o53b8o148b2$
41 | 538b2o53b8o148b$449b2o30b2o30b2o23b2o5b2o11b2o9b2o5bo8b2o5bo6b3o9b2ob
42 | 3o81b2o49b$232bobo214b2o30b2o30b2o19b5o6b2o10bo2bo8b2o4bobo7b2o5b2o2bo
43 | 4b2o5bobo5bo79b2ob2o48b$232b2o298bo4bo20b2o15bo2bo14bo3bo9bo3bo4bo79b
44 | 4o49b$233bo297bo6bo37b2o16b3o14bo3bo81b2o50b$530b2ob3obo38b2o17b5o12b
45 | 2o135b$531bobo2b2o59b3o110b2o37b$531b3o72bo2bo96b4ob2o5b4o27b$392bo
46 | 139b3o2bo40b2o27bo4b4o90b6o5b6o26b$392bobo138b2o2bo37b3ob2o12bo17b6o
47 | 67b2o21b4o6b4ob2o25b$392b2o140bobo38b5o12bo18b4ob2o63b3ob2o34b2o26b$
48 | 576b3o13b3o9b2o9b2o7b2o55b5o21bo41b$600b4ob2o14b3ob2o46bo8b3o23bo40b$
49 | 600b6o15b5o21b3o23bo32b4o39b$601b4o17b3o20bo2b2o54b2o3bob2o36b$644bo3b
50 | obo26bo11b2o14bobobobo7b2o28b$642bo3bo9bobo13b4obo10bo2bo13bo3b3o2bo3b
51 | o2b2o26b$569bo56b2o14bo3b2o11bo11bo2bob2o4b2o4bobo7b2o6bobo3bo4b3o2bo
52 | 26b$184bobo381bo57b2o14bo8bo3b2obo12bobo8b2o5bo8b2o7bo4b3o2bo4bo26b$
53 | 184b2o382b3o72bo3bo3b3o3bo14bo44b5o27b$185bo563b$643bo3bo3b3o3bo14bo
54 | 44b5o27b$562b2o30b2o30b2o14bo8bo3b2obo12bobo8b2o5bo8b2o7bo4b3o2bo4bo
55 | 26b$562b2o30b2o30b2o14bo3b2o11bo11bo2bob2o4b2o4bobo7b2o6bobo3bo4b3o2bo
56 | 26b$344bo297bo3bo9bobo13b4obo10bo2bo13bo3b3o2bo3bo2b2o26b$344bobo198bo
57 | 98bo3bobo26bo11b2o14bobobobo7b2o28b$344b2o198bo100bo2b2o54b2o3bob2o36b
58 | $544b3o100b3o23bo32b4o39b$673bo8b3o23bo40b$681b5o21bo41b$681b3ob2o34b
59 | 2o26b$684b2o21b4o6b4ob2o25b$706b6o5b6o26b$706b4ob2o5b4o27b$136bobo571b
60 | 2o37b$136b2o547bo63b$137bo547bobo61b$685b2o62b3$296bo452b$296bobo198bo
61 | 251b$296b2o198bo252b$496b3o162bo55b2o30b$661bobo52b4o29b$661b2o53b2ob
62 | 2o28b$718b2o29b2$727b4o18b$726b6o17b$88bobo635b4ob2o16b$88b2o547bo64b
63 | 3o25b2o9b2o6b$89bo547bobo61b5o31b4ob2o5b$637b2o62b3ob2o16b2o12b6o6b$
64 | 665b2o37b2o16bobo13b4o7b$664bo2bo53bo2bo12bo11b$248bo412b2obo61bo9bobo
65 | 10b$248bobo198bo216b2o52bo15bobo10b$248b2o198bo212bo3b2o39b2o17bobobo
66 | 10b2o7b$448b3o212bobo22b2o15bo2bo13bo2bobo2bo9bobo6b$643b2o30b2o10bo2b
67 | o4bo3b2o4bobo7b2o6b2o5bo2bo8bo6b$643b2o23b2o5b2o11b2o5bo3b2o5bo8b2o11b
68 | obobo2bo4b3o6b$668b2o55b2obo3bo2bo13b2$668b2o55b2obo3bo2bo13b$3b2o30b
69 | 2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b
70 | 2o30b2o30b2o30b2o30b2o30b2o23b2o5b2o11b2o5bo3b2o5bo8b2o11bobobo2bo4b3o
71 | 6b$3b2o30b2o3bobo24b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b
72 | 2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o10bo2bo4bo3b2o4bobo7b2o
73 | 6b2o5bo2bo8bo6b$40b2o547bo73bobo22b2o15bo2bo13bo2bobo2bo9bobo6b$41bo
74 | 547bobo69bo3b2o39b2o17bobobo10b2o7b$589b2o75b2o52bo15bobo10b$3bo657b2o
75 | bo61bo9bobo10b$2b3o659bo2bo53bo2bo12bo11b$bo3bo194bo464b2o37b2o16bobo
76 | 13b4o7b$ob3obo193bobo198bo299b3ob2o16b2o12b6o6b$b5o194b2o198bo300b5o
77 | 31b4ob2o5b$196b2o30b2o30b2o30b2o30b2o30b2o30b2o10b3o17b2o30b2o30b2o30b
78 | 2o30b2o152b3o25b2o9b2o6b$35b2o30b2o30b2o30b2o30b2o30bo2bo28bo2bo28bo2b
79 | o28bo2bo28bo2bo28bo2bo28bo2bo28bo2bo28bo2bo28bo2bo28bo2bo28bo2bo175b4o
80 | b2o16b$35bobo29bobo29bobo29bobo29bobo29bo2bo28bo2bo28bo2bo28bo2bo28bo
81 | 2bo28bo2bo28bo2bo28bo2bo28bo2bo28bo2bo28bo2bo28bo2bo175b6o17b$36b2o30b
82 | 2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b
83 | 2o30b2o177b4o18b$6b3o692bo47b$8bo691bo48b$7bo741b$701bobo45b$703bo45b$
84 | 701bo47b$702bo46b2$38b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o
85 | 30b2o371b4o14b$4b3o30bobo29bobo29bobo29bobo29bobo29bo2bo28bo2bo28bo2bo
86 | 28bo2bo28bo2bo28bo2bo369b6o13b$3bo3bo29b2o30b2o30b2o30b2o30b2o30bo2bo
87 | 28bo2bo28bo2bo28bo2bo28bo2bo28bo2bo229b2o138b4ob2o12b$2bo5bo189b2o30b
88 | 2o30b2o30b2o30b2o30b2o229b2o115b3o25b2o9b2o2b$2b2obob2o193b2o387bo113b
89 | 5o15b3o13b4ob2ob$202bobo461b2o37b3ob2o14bo15b6o2b$202bo464b2o39b2o18bo
90 | 13b4o3b$5bo659bobo59bo12bo8b$4bobo657b3o71b2o9b$4bobo34b2o621bo2bo62bo
91 | 8bo2bo6b$5bo35bobo356b2o262bob3o39b2o19b4o7b3ob2o3b$41bo357b2o264bo2bo
92 | 21b2o15bo2bo21bo13bo2b$5b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b
93 | 2o30b2o30b2o30b2o10bo19b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o19b2o9b2o
94 | 10bo2bo8b2o4bobo7b2o5b4o2bob2o12bo2b$5b2o30b2o30b2o30b2o30b2o30b2o30b
95 | 2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b2o30b
96 | 2o23b2o5b2o11b2o9b2o5bo8b2o5bobobobo4b2o5bo2b2o2b$670b2o53b2o2bobo11b
97 | 2o4b2$670b2o53b2o2bobo11b2o4b$422bo30b2o30b2o30b2o30b2o30b2o30b2o30b2o
98 | 23b2o5b2o11b2o9b2o5bo8b2o5bobobobo4b2o5bo2b2o2b$422bo30b2o30b2o30b2o
99 | 30b2o30b2o30b2o23b2o5b2o19b2o9b2o10bo2bo8b2o4bobo7b2o5b4o2bob2o12bo2b$
100 | 424b2o211b2o26bo2bo21b2o15bo2bo21bo13bo2b$250b2o387bo24bob3o39b2o19b4o
101 | 7b3ob2o3b$250bobo411bo2bo62bo8bo2bo6b$250bo413b3o71b2o9b$665bobo59bo
102 | 12bo8b$667b2o39b2o18bo13b4o3b$89b2o575b2o37b3ob2o14bo15b6o2b$89bobo
103 | 356b2o212b2o41b5o15b3o13b4ob2ob$89bo357b2o212b2o43b3o25b2o9b2o2b$449bo
104 | 213bo66b4ob2o12b$730b6o13b$731b4o14b2$479b6o6b2o229b2o25b$478bo5bo4bo
105 | 4bo225b2ob2o24b$472b2o10bo10bo190b2o32b4o25b$414b2o38b5o12b2o5bo4bo5bo
106 | 5bo189b2o34b2o26b$298b2o113b3o37bo4bo14bo6b2o8b6o191bo61b$298bobo93b5o
107 | 12b2o3bo41bo27bo262b$298bo94bo4bo12bo3bo37bo3bo28b3o260b$398bo11bo44bo
108 | 21bo7bob2o2bo257b$393bo3bo12b3o2b2o59b3o8b3o2bo256b$137b2o256bo14bobob
109 | 3o38b2o16b3o10b5o2bo255b$137bobo271b3ob2o20b2o15bo2bo14bo3bo3bo5b3obob
110 | 3o215b2o37b$137bo275b2o9b2o10bo2bo8b2o4bobo7b2o5bo2bobo4bo9b2ob2o213b
111 | 2o38b$417b2o5b2o11b2o9b2o5bo8b2o5bo8bo9b2ob2o216bo37b$417b2o53b8o252b
112 | 6o6b2o3b$731bo5bo4bo4bob$417b2o53b8o257bo10bo$360b2o30b2o23b2o5b2o11b
113 | 2o9b2o5bo8b2o5bo8bo9b2ob2o212b5o19bo4bo5bo5bo$360b2o30b2o19b2o9b2o10bo
114 | 2bo8b2o4bobo7b2o5bo2bobo4bo9b2ob2o210bo4bo20bobo8b6o$411b3ob2o20b2o15b
115 | o2bo14bo3bo3bo5b3obob3o152b5o59bo37b$410bobob3o38b2o16b3o10b5o2bo152bo
116 | 4bo21bo32bo3bo20bo2bo14b$346b2o62b3o2b2o59b3o8b3o2bo158bo20bobo33bo21b
117 | 3ob2o13b$346bobo61bo44bo21bo7bob2o2bo154bo3bo24bo53b2o3bob2o11b$346bo
118 | 64bo3bo37bo3bo28b3o159bo21bob2o24b2obo12b2o14bo3bo9b3o2b$411b2o3bo41bo
119 | 27bo181bob2o25b4ob2o9bo2bo13bobobob2o4bo3b2ob$413b3o37bo4bo14bo6b2o8b
120 | 6o155b2o13b3o2b2o7b2ob2o11bo4b2o4b2o4bobo7b2o6b5obobo2bobo2b2o$185b2o
121 | 227b2o38b5o12b2o5bo4bo5bo5bo155b2o14b2o2b2o3bo4b3o12bobo8b2o5bo8b2o7bo
122 | 4b2o2bo5bob$185bobo284b2o10bo10bo180b2o3b2o14bo40bo3b5o2b$185bo292bo5b
123 | o4bo4bo254b$370b2o107b6o6b2o183b2o3b2o14bo40bo3b5o2b$370bobo278b2o14b
124 | 2o2b2o3bo4b3o12bobo8b2o5bo8b2o7bo4b2o2bo5bob$370bo97bo2bo179b2o13b3o2b
125 | 2o7b2ob2o11bo4b2o4b2o4bobo7b2o6b5obobo2bobo2b2o$472bo195bob2o25b4ob2o
126 | 9bo2bo13bobobob2o4bo3b2ob$468bo3bo175bo21bob2o24b2obo12b2o14bo3bo9b3o
127 | 2b$469b4o173bo3bo24bo53b2o3bob2o11b$651bo20bobo33bo21b3ob2o13b$646bo4b
128 | o21bo32bo3bo20bo2bo14b$394b2o251b5o59bo37b$394bobo309bo4bo20bobo8b6o$
129 | 394bo312b5o19bo4bo5bo5bo$737bo10bo$731bo5bo4bo4bob$233b2o497b6o6b2o3b$
130 | 233bobo513b$233bo487bo2bo24b$418b2o305bo23b$418bobo300bo3bo23b$418bo
131 | 303b4o23b6$442b2o305b$442bobo304b$442bo306b3$281b2o466b$281bobo465b$
132 | 281bo467b$466b2o281b$466bobo280b$466bo282b$491b2o256b$487b4ob2o5b4o
133 | 246b$487b6o5b6o245b$465b2o21b4o6b4ob2o244b$462b3ob2o34b2o245b$462b5o
134 | 21bo260b$454bo8b3o23bo259b$428b3o23bo32b4o258b$426bo2b2o54b2o3bob2o
135 | 255b$425bo3bobo26bo11b2o14bobobobo7b2o247b$329b2o92bo3bo9bobo13b4obo
136 | 10bo2bo13bo3b3o2bo3bo2b2o245b$329bobo11b2o30b2o30b2o14bo3b2o11bo11bo2b
137 | ob2o4b2o4bobo7b2o6bobo3bo4b3o2bo245b$329bo13b2o30b2o30b2o14bo8bo3b2obo
138 | 12bobo8b2o5bo8b2o7bo4b3o2bo4bo245b$424bo3bo3b3o3bo14bo44b5o246b2$424bo
139 | 3bo3b3o3bo14bo44b5o246b$407b2o14bo8bo3b2obo12bobo8b2o5bo8b2o7bo4b3o2bo
140 | 4bo245b$407b2o14bo3b2o11bo11bo2bob2o4b2o4bobo7b2o6bobo3bo4b3o2bo245b$
141 | 353b2o68bo3bo9bobo13b4obo10bo2bo13bo3b3o2bo3bo2b2o245b$353bobo69bo3bob
142 | o26bo11b2o14bobobobo7b2o247b$353bo49b3o20bo2b2o54b2o3bob2o255b$402b5o
143 | 21b3o23bo32b4o258b$402b3ob2o46bo8b3o23bo259b$405b2o55b5o21bo260b$462b
144 | 3ob2o34b2o245b$465b2o21b4o6b4ob2o244b$377b2o108b6o5b6o245b$377bobo107b
145 | 4ob2o5b4o246b$377bo113b2o256b2$478b2o269b$477b4o268b$477b2ob2o267b$
146 | 479b2o268b$401b2o346b$401bobo16b2o327b$401bo14b4ob2o5b4o317b$416b6o5b
147 | 6o316b$374bo19b2o21b4o6b4ob2o315b$372b2obo15b3ob2o34b2o316b$334b2o35bo
148 | 3bo15b5o353b$331b3ob2o30b4obobo17b3o354b$331b5o30bobo3b2o12b2o33bo327b
149 | $332b3o20bo4b2o4bobo16bo2bo32b2o5b3o318b$354bobo2b2obo2b2ob2o18bo15bo
150 | 14bo2bo3b2o321b$353bo3bo2b2ob3o2b4o11b2o5b2o11b2o12b3o6bo4b2o316b$340b
151 | 2o12bo2bo4bo3b2obob2o17b2o4b2o4b3o7b2o4b2o5b2ob2o2bo316b$340b2o12b2ob
152 | 2o9b2ob2o11bobo9b2o14b2o5bobo10bo316b$370bo14bo35bo7b3o317b2$370bo14bo
153 | 35bo7b3o317b$340b2o12b2ob2o9b2ob2o11bobo9b2o14b2o5bobo10bo316b$340b2o
154 | 12bo2bo4bo3b2obob2o17b2o4b2o4b3o7b2o4b2o5b2ob2o2bo316b$353bo3bo2b2ob3o
155 | 2b4o11b2o5b2o11b2o12b3o6bo4b2o316b$354bobo2b2obo2b2ob2o18bo15bo14bo2bo
156 | 3b2o321b$332b3o20bo4b2o4bobo16bo2bo32b2o5b3o318b$331b5o30bobo3b2o12b2o
157 | 33bo327b$331b3ob2o30b4obobo17b3o354b$334b2o35bo3bo15b5o353b$372b2obo
158 | 15b3ob2o34b2o316b$374bo19b2o21b4o6b4ob2o315b$416b6o5b6o316b$416b4ob2o
159 | 5b4o317b$403b2o15b2o327b$402bo346b$407b2o340b$406b4o339b$406b2ob2o338b
160 | $408b2o!
--------------------------------------------------------------------------------
/examples/tlogtgrowth.rle:
--------------------------------------------------------------------------------
1 | #N tlog(t) growth
2 | #O Dean Hickerson
3 | #C An infinitely growing pattern that has growth that is O(tlog(t)). F
4 | #C ound in 1990.
5 | #C www.conwaylife.com/wiki/index.php?title=Tlog(t)_growth
6 | x = 635, y = 377, rule = b3/s23
7 | 40bo13bo580b$39b3o11b3o579b$38b2obo5bo4b2obo579b$38b3o5b3o3b3o580b$39b
8 | 2o4bo2b2o3b2o580b$45b2ob2o38b3o11b3o530b$44b3o2bo37bo2bo10bo2bo530b$
9 | 45b2obo41bo4b3o6bo530b$46bo43bo4bo2bo5bo530b$39b3o4bo3bo36bobo4bo3bo2b
10 | obo531b$39bo2bo3bo47b4o537b$39bo6bo48bo539b$39bo6b2obo585b$40bobo6b2o
11 | 52bo531b$102b3o530b$44b2o48b3o4b2obo530b$46bo48b2o4b3o531b$48bo46b2o5b
12 | 2o531b$48bo7bo38b2ob2o535b$45bobo7b3o38bobo536b$46bo7b2obo39bo537b$54b
13 | 3o578b$55b2o578b$86b3o546b$61bo5bo17bo2bo546b$60b3o3b3o19bo546b$59b2ob
14 | o3bob2o18bo546b$59b3o5b3o15bobo547b$54bo5b2o5b2o566b$52bobo20b3o3b3o6b
15 | 2o543b$53b2o9bo10bo2bobo2bo6b3o542b$63b3o9bo7bo6b2o543b$75bo7bo8bo542b
16 | $63bobo10bobobobo552b$64bo570b$79bo555b$78b3o554b$28bo13bo34b2ob2o553b
17 | $27b3o11b3o17b3ob3o10b3o554b$27bob2o4bo5bob2o18bobo12b3o554b$28b3o3b3o
18 | 5b3o33b3o554b$28b2o3b2o2bo4b2o34bobo554b$35b3o25b3o12bobo19b3o11b3o
19 | 518b$59bo19bo20bo2bo10bo2bo517b$57bobo25bobo12bo6b3o4bo520b$58b2o25b2o
20 | 13bo5bo2bo4bo520b$41b3o42bo14bobo2bo3bo4bobo517b$40bo2bo61b2o2bobo523b
21 | $43bo63bo527b$43bo64b2obo523b$40bobo58bo6b3o524b$32b2o66b3o5b3o524b$
22 | 32b2o26b2o38bob2o4b2o525b$43b3o3b3o8b2ob2o36b3o4bobo524b$26bo16bo2bobo
23 | 2bo6bo42b2o4bo2bo524b$25b3o7bo7bo7bo9bo20bo27bo524b$24b2obo5b2ob2o5bo
24 | 7bo5bo3b2o18b2o23bo528b$24b3o6b2ob2o6bobobobo6bo3bo2bo15b2obo9bo5bo5b
25 | 2o2bo525b$25b2o6b2ob2o19bo2bo2bo17bob2o7b3o3b3o4b2o2bo525b$35b2o10bo
26 | 12bo2bo18b2obo6bob2ob2obo5b3o7b3o516b$46b3o11bo20b5o7b3ob3o6b3o6bo2bo
27 | 516b$45b2ob2o10bobo17b5o8b2o3b2o18bo516b$46b3o9bo2b4o15bo2bo34bo516b$
28 | 46b3o11b2o2b2o18bo11bo18bobo517b$46b3o11bo3bo15bo2bo11bobo537b$33b2o
29 | 11bobo12b3o16b3o11bo3bo536b$34b2o10bobo13bo32bobo537b$33bo13bo47b3o
30 | 537b$110b2o523b$110bobo522b$38b2o70bo524b$39b2o53b2ob2o536b$38bo55b2ob
31 | 2o536b$94b2ob2o6b2o528b$96bo8bobo527b$43b2o60bo529b$3b3o11b3o24b2o49b
32 | 3o537b$3bo2bo10bo2bo22bo591b$3bo6b3o4bo22bo59b2o533b$3bo5bo2bo4bo21b3o
33 | 58bobo532b$4bobo2bo3bo4bobo17b2obo58bo24bo13bo495b$10b4o24b3o83b3o11b
34 | 3o494b$12bo25b3o82b2obo5bo4b2obo494b$39b2o3bo20b2o35b3o18b3o5b3o3b3o
35 | 495b$18bo25bo19bo2bo29b2o2bo2bo19b2o4bo2b2o3b2o495b$17b3o44bo2bo9b2o
36 | 18b2o5bo25b2ob2o500b$17bob2o11b3o11b3o16b2o9bo2bo20bo3bo24b3o2bo500b$
37 | 18b3o11bo2bo10bo2bo26bo2bo24bo25b2obo501b$18b2o12bo6b3o4bo30b2o22bobo
38 | 27bo503b$32bo5bo2bo4bo77b3o4bo3bo499b$8b2o23bobo2bo3bo4bobo8b2o36bo13b
39 | o13bo2bo3bo503b$8b2o10bo5bo10b2o2bobo15b2o34b3o11b3o12bo6bo503b$19b3o
40 | 3b3o11bo18bo35b2obo5bo4b2obo12bo6b2obo500b$b3o14b2obo3bob2o11b2obo41b
41 | 2o7b3o5b3o3b3o14bobo6b2o499b$o2bo6b3o5b3o5b3o11b3o4bo37bobo7b2o4bo2b2o
42 | 3b2o524b$3bo5bo3bo5b2o5b2o12b3o3b3o36bo15b3o25b2o504b$3bo4bo5bo31bob2o
43 | 66b3o3b3o6bo503b$obo6bo13bo23b3o66bo2bobo2bo8bo7bo493b$10b4o8b3o22b2o
44 | 67bo7bo8bo6b3o492b$21bo3bo69b3o18bo7bo5bobo7bob2o491b$95bo2bo18bobobob
45 | o7bo9b3o491b$49bo5bo39bo45b2o492b$21b2ob2o11b2o9b3o3b3o38bo24bo514b$
46 | 23bo6b3o14b2obo3bob2o38bobo20b3o513b$9b3o17bo2bo4bo3bo5b3o5b3o47b2o12b
47 | 3o513b$11bo20bo15b2o5b2o48b2o528b$10bo10bo3bo6bo4bo49b3o3b3o539b$20bob
48 | obobo2bobo4bo15bo34bo2bobo2bo16bo21b2o499b$21b5o10bo2bo11b3o33bo7bo7bo
49 | 7b3o4bo3bo10b2o500b$14b3o4b2ob2o10bo2bo10bo3bo32bo7bo5b2ob2o5bob2o3bo
50 | 3bo12bo499b$16bo5bobo12b2o49bobobobo6b2ob2o6b3o2bobobobo511b$15bo6b3o
51 | 76b2ob2o6b2o5b3o513b$50b2ob2o36bo10b2o15b3o7b2o504b$52bo12b2o23b3o27bo
52 | 7b2o505b$19b3o43bobo22b3o37bo504b$21bo17b3o24b2o9b2o556b$20bo20bo8bo3b
53 | o21bobo556b$15b3o22bo8bobobobo20b2o46b2o509b$14bo2bo32b5o34bo3bo10b2o
54 | 17b2o510b$17bo6b3o23b2ob2o34bo3bo9b2o20bo509b$13bo3bo8bo17b3o4bobo34bo
55 | bobobo10bo529b$17bo7bo20bo4b3o36b3o34bo507b$14bobo28bo44b3o26b2o5b3o
56 | 506b$57b3o31bo7b2o17b2o6bob2o505b$56bo2bo38b2o20bo6b3o505b$49b3o7bo40b
57 | o26b3o505b$51bo7bo67b2o506b$45bo4bo5bobo26bo549b$44b3o37b3o7b2o539b$
58 | 43b2obo37bob2o5b2o540b$43b3o39b3o7bo539b$43b3o39b2o548b$44b2o51b3o535b
59 | $96bo2bo535b$39b3o57bo535b$41bo53bo3bo535b$40bo58bo535b$96bobo5b2o529b
60 | $103b2o530b$105bo529b3$54b2o579b$54b2o9b2o568b$65bobo20b2o545b$66b2o9b
61 | 2o9b2o545b$76bobo556b$76b2o557b$132b3o11b3o486b$54b3o74bo2bo10bo2bo
62 | 486b$56bo77bo4b3o6bo486b$55bo78bo4bo2bo5bo486b$89b2o5bo13bo20bobo4bo6b
63 | obo487b$88b2o5b3o11b3o31bo491b$90bo4bob2o4bo5bob2o24bo4bo492b$96b3o3b
64 | 3o5b3o24bo497b$96b2o3b2obo5b2o21bo5bo495b$132b3o3b3o494b$131b2obo3b3o
65 | 494b$131b3o4b2o495b$101bo30b2o5b5o491b$101b3o5b3o29b3o491b$102bo5bo2bo
66 | 523b$102bo2bo5bo13bo5bo6bo496b$103b3o5bo12b3o3b3o5bo496b$108bobo12b2ob
67 | o3bob2o6bo7b3o484b$123b3o5b3o6b2o6bo2bo483b$124b2o5b2o6b2o7bo486b$111b
68 | 3o3b3o19bo8bo486b$94bo16bo2bobo2bo8bo20bobo483b$65b2o26b3o15bo7bo7b3o
69 | 505b$65b2o4bo20b2obo15bo7bo515b$54b2o6b2o6b5ob2o14b3o17bobobobo8bobo
70 | 505b$54b2o5b3o5bo2b2o4bo14b2o33bo506b$62b2o5b2o8bo8b2o25bo519b$65b2o4b
71 | o7bo8b2o7bobo14b3o24b3o491b$65b2o12bo17b2o14b2ob2o23bo493b$78bo20b3o
72 | 11b2ob2o7b3ob3o10bo492b$76b2o36bobo10bobo505b$115bo519b$136b3o496b$
73 | 127b3o6bo498b$103b2o8b2ob2o19bo497b$104b2o6bo5bo516b$103bo9bo3bo517b$
74 | 114b3o14b3o501b$114bobo14bo503b$108b2o5bo16bo502b$86b2o21b2o4bo519b$
75 | 85bobo20bo25b3o498b$87bo38b3o5bo2bo497b$126bo7bo500b$113b2o12bo6bo3bo
76 | 496b$108bo5b2o18bo500b$107b3o3bo21bobo497b$106b2obo525b$78b3o25b3o526b
77 | $80bo25b3o526b$79bo27b2o526b2$65b2o45bo253b4o265b$65b2o4bo39b3ob3o23b
78 | 2o222bo3bo12bo2bo249b$54b2o6b2o6b5ob2o32bo3b4o22b4o225bo16bo248b$54b2o
79 | 5b3o5bo2b2o4bo22b2o8b3o2bobo21b2ob2o205b2o13bo2bo13bo3bo227b2o19b$62b
80 | 2o5b2o8bo8b2o10bobo9bo18b3ob2o5b2o204bo4bo29b4o226b4o18b$65b2o4bo7bo8b
81 | 2o12bo27b2o5bo216bo258b2ob2o17b$65b2o12bo49bo7b2o209bo5bo260b2o15b2ob$
82 | 78bo51b2o5bo211b6o3bo13b2o256b2ob2o$76b2o37bo15b3ob2o5b2o14b2o199bo7bo
83 | 4b2o256b4ob$114bobo23b2ob2o4b4o4b4o196b3o6b3o13b3o215b2o29b2o2b$113b2o
84 | 25b4o4bo3bo4b2ob2o203bo18bo211b4ob2o32b$93b3o30bo14b2o9bo6b2o204b5o7b
85 | 2o3bobo211b6o17b2o14b$95bo30b2o20bo2bo201bo20bo7b2o213b4o3bobo6b3o3b2o
86 | 9bo4b$94bo27b2obobo27bo198bo250b2o6b3o14b2o3b$122bo30bo198b3o250bo6bo
87 | 3bo12bob2o2b$120bobo18bo11bo2b2o217b2o5bo2bo226b4o13bobo3b$120b2o9bo
88 | 10bo9bo5bo187bo27b4o8bo204b2o20b3o13b2o4b$131b2o8b3o9bobo2b2o185bobo
89 | 18b4o4b2ob2o3bo3bo203bo2bo5bobo33b$86b2o28b2o12bobo8b3o9bo3b2o189bo6bo
90 | 9bo3bo6b2o5b4o203bobo7b2o33b$85bobo27bobo6b4o9b5ob3o9b3o185bo4bo7b2o
91 | 11bo219b3o8bo20bo2bo10b$87bo29bo5b6o9b3o3b2o197bo4bo4b3o5b2o2bo2bo219b
92 | 3o23b2o9bo6b2ob$123b4ob2o9bo204bo2bo4b3o6b3o216b2o8bo22b4o4bo3bo4b2ob
93 | 2o$127b2o29b2o185b3o5b3o5b2o2bo2bo210bo2bo7bo10bo11b2ob2o4b4o4b4ob$
94 | 157b4o195b2o11bo210bo7b2o9b2obo3bo2bo5b2o14b2o2b$157b2ob2o193bo9bo3bo
95 | 227b5o4bo3bo24b$142b2o15b2o205b4o227bo2bo4bo4b2o23b$78b3o27b3o29b2ob2o
96 | 452b5o4bo3bo24b$80bo29bo29b4o447bo7b2obo3bo2bo5b2o18b$79bo29bo31b2o
97 | 444b2o2b2o8bo11b2ob2o17b$587bo4bo20b4o18b$65b2o521b4o22b2o19b$65b2o4bo
98 | 74bo29bo29bo29bo29bo29bo29bo29bo29bo29bo29bo29bo29bo29bo29bo21b2o45b$
99 | 54b2o6b2o6b5ob2o68b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b
100 | 3o27b3o27b3o27b3o27b3o66b$54b2o5b3o5bo2b2o4bo22b2o46bo29bo29bo29bo29bo
101 | 29bo29bo29bo29bo29bo29bo29bo29bo29bo29bo65b$62b2o5b2o8bo8b2o10bobo45b
102 | 2o28b2o28b2o28b2o28b2o28b2o28b2o28b2o28b2o28b2o28b2o28b2o28b2o28b2o28b
103 | 2o65b$65b2o4bo7bo8b2o12bo532b$65b2o12bo222bo285b2o19b4o22b$78bo222bo
104 | 285bo2b2o16bo3bo22b$76b2o223b3o283bo16bo7bo22b$582b3ob4o3bo5b7o2bo2bo
105 | 23b$560bo2bo18b6o6bo3bo2b3ob2o28b$93b3o468bo19b4obo9b7o2bo2bo23b$95bo
106 | 205b2o28b2o28b2o28b2o28b2o28b2o28b2o28b2o39bo7bo3bo15bo4bo18bo7bo22b$
107 | 94bo54b5o25b5o25b5o25b5o25b5o27bobo27bobo27bobo27bobo27bobo27bobo27bob
108 | o26bo2bo36b3o3bo4b4o14bob2ob4o4bo15bo3bo6b2o5b4o5b$148bob3obo23bob3obo
109 | 23bob3obo23bob3obo23bob3obo27b2o28b2o28b2o28b2o28b2o28b2o28b2o26bo2bo
110 | 36b2o5b2o20bo2bobo6bo17b4o4b2ob2o3bo3bo5b$149bo3bo25bo3bo25bo3bo25bo3b
111 | o25bo3bo237b2o36bo6b3o21b2o2b5o28b4o8bo5b$150b3o27b3o27b3o27b3o27b3o
112 | 261b2o14b2o5b2o23bob2ob3o28b2o5bo2bo6b$151bo29bo29bo29bo29bo260bob2o
113 | 14b3o3bo4b4o25b2o43b$86b2o444bobob2o3bo10bo7bo3bo51bo18b$85bobo56bobo
114 | 390bo2b2o22bo27bo4b3o15b2o8b2o8b$87bo57b2o388b3o2bobo17bo2bo27b2o6bo
115 | 14bo9bo2bo7b$145bo7bo29bo29bo29bo29bo324bo16b5o4bo2bo7b$153bo29bo29bo
116 | 29bo29bo202b2o89b4o45b4o3b2ob2o7b$146bo5bobo21bo5bobo21bo5bobo21bo5bob
117 | o21bo5bobo29b2o28b2o28b2o28b2o28b2o39bo8b2ob2o22b2o53bo9bo3bo48bo4b2o
118 | 9b$146bobo2b2ob2o20bobo2b2ob2o20bobo2b2ob2o20bobo2b2ob2o20bobo2b2ob2o
119 | 27bobo27bobo27bobo27bobo27bo2bo36bobo4bo3b4o22bobo52b2o13bo14b4o3b6o4b
120 | 3o30b$146b2o2bo5bo19b2o2bo5bo19b2o2bo5bo19b2o2bo5bo19b2o2bo5bo26b2o28b
121 | 2o28b2o28b2o28bo2bo35bo2bo5bo3b2o25bo52bobo8bo2bo14bo3bo2bo5bo6bo30b$
122 | 78b3o72bo29bo29bo29bo29bo150b2o36bo6bo2bo115bo8bo5bo31b$80bo69b2o3b2o
123 | 23b2o3b2o23b2o3b2o23b2o3b2o23b2o3b2o169b3o13bo2bo5bo3b2o56b2o49bo2bo3b
124 | o4bo29b4o5b$79bo383bobo4bo3b4o54b4o57b2o13bo2bo13bo3bo5b$447bob2o2b2o
125 | 10bo8b2ob2o41bo11b2ob2o31bo4b2o37bo16bo5b$65b2o72bo14bo14bo14bo14bo14b
126 | o14bo14bo29bo30b2o80bo2bo60bobobo20b2o40b2obo3bo2bo5b2o31bobo3b2o9b2o
127 | 22bo3bo12bo2bo6b$65b2o4bo66bo15bo13bo15bo13bo15bo13bo15bo29bo29b2o85bo
128 | 57b2o2bo62b5o4bo3bo36bo3bo12bo2bo22b4o22b$54b2o6b2o6b5ob2o60b3o14bo12b
129 | 3o14bo12b3o14bo12b3o14bo29bo30bo80bo3bo57bo31b2o33bo2bo4bo4b2o35bo3bo
130 | 12bo2bo48b$54b2o5b3o5bo2b2o4bo309b4o88b4o27b2o3b5o4bo3bo36bo3bo11b2ob
131 | 2o48b$62b2o5b2o8bo8b2o321b2o55b2o10b2ob2o14b2o9bobo5b2obo3bo2bo5b2o30b
132 | o2bo13b2o50b$65b2o4bo7bo8b2o62b2o28b2o28b2o28b2o28b2o28b2o28b2o28b2o
133 | 36bo8b2ob2o54bobo11b2o14b4o10bo7bo11b2ob2o3b2o5bo2bo17bo66b$65b2o12bo
134 | 72b2o28b2o28b2o28b2o28b2o28b2o28b2o28b2o34bobo4bo3b4o55bo29b2ob2o29b4o
135 | 3b4o8bo83b$78bo318bo2bo5bo3b2o26bo61b2o31b2o4b2ob2o3bo3bo83b$76b2o53bo
136 | 29bo29bo29bo175bo6bo2bo29b2o69b2o6b2o23b2o5b4o26b2o5b4o46b$131bobo27bo
137 | bo27bobo27bobo173bo2bo5bo3b2o25bobo65b3ob2o4bobo58b2ob2o3bo3bo46b$131b
138 | 2o28b2o28b2o28b2o165b3o7bobo4bo3b4o68bo4b2o17b5o7bo58b4o8bo46b$390bo9b
139 | o8b2ob2o66b3o3b2o9b2o7b3o35bobo30b2o5bo2bo47b$389bo21b2o5b2o5b4o50b2ob
140 | 2o12bo2bo42b2o3bo87b$383b3o30b2ob2o3bo3bo49b3ob3o11bo2b2o20b2o10bo8b3o
141 | bob2o85b$236b2o144b5o29b4o8bo49b3ob2o11bo2b2o20bobo19b3o4bo85b$124bo
142 | 29bo29bo49b2ob2o13b2o96b2o30b3ob2o5b3o21b2o5bo2bo52bobo12b4o23bo5b2o
143 | 15bo3bo85b$123bo29bo29bo50b4o13b4o20b2o72b2o34b2o8bo131bo7bo10b3o86b$
144 | 123b3o27b3o27b3o49b2o14b2ob2o18b4o73bo42bo27b2o103bo3bobobo10bo88b$
145 | 253b2o19b2ob2o127bob2o11b5o73b2o27b3o104b$276b2o15b2o109bo5bo10bo4bo
146 | 63b4o4b4o45bo2bo84b$227bo21bo41b2ob2o102b3o9bo10b3o2bo62bo3bo4b2ob2o
147 | 48bo83b$228b2o17bo43b4o105bo3bo5bo11bo2b2o66bo6b2o45bo3bo83b$227b2o14b
148 | o3bo2b2o40b2o105bo5bo3bo2b2o9b2o58bo5bo2bo38b4o13b4o83b$116bo29bo29bo
149 | 62bo2b3obo5bo14bobo136b3o3b2o68b2o46bo3bo100b$116bobo27bobo27bobo59bob
150 | 5o2bobo2b2o14b2o212bobo49bo100b$116b2o28b2o28b2o44bo14b2ob2o5bo3b2o15b
151 | o13bobo3b4o238bo2bo101b$223b2o13bo2bo7b3o28bo4bo2bo2b2o132b4o206b$222b
152 | 2o56bo3bo4bo2b2o15b2o96bo2bo13bo3bo95b2o109b$239b2o21bobo14bo3bo5bo2bo
153 | 14b2ob2o13b2o84bo16bo75b2o17b4o108b$263b2o15b2o8b2o15b4o13b4o79bo3bo
154 | 12bo2bo70bo4bo2bo4bo11b2ob2o107b$109bo29bo77bo32b3o10bo16b2o26b2o14b2o
155 | b2o66b2o11b4o86bo4bo2bo3bobo3bo2bo5b2o108b$108bo29bo79b2o21b5o3b5o72b
156 | 2o53b2o11b2o104bo3b2o3b3o4bo3bo114b$108b3o27b3o76b2o21bo4bo3b3ob2o27bo
157 | 2bo19bo66b4o4b4o12bo101bo2bo6b3o4bo4b2o113b$233bo2bo8bo6b2o3bobo26bo6b
158 | 2o9b3o64bo3bo4b2ob2o113bo2bo7b3o4bo3bo114b$237bo2bo3bo13b2o22bo3bo4b2o
159 | b2o7bob2o3bo11bo52bo6b2o113b4obo2b2o3bobo3bo2bo5b2o14b2o92b$225bo7bo3b
160 | o4bo15bo17b4o3b4o4b4o8bo6bo10b4o46bo2bo121b2o4bo2b2o4bo11b2ob2o4b4o4b
161 | 4o91b$164b2o28b2o16b2o9b3o3bo4b4o26bo10bo3bo12b2o3bo6bo14b5obo91b2o20b
162 | 2o56b3o4bo2bo15b4o4bo3bo4b2ob2o90b$164b2o28b2o16b2o9b2o5b2o31bobo4b2o
163 | 7bo18b2o18bo6b2o42bo8bo37bo2bo17b2ob2o56b2o6b3o15b2o9bo6b2o91b$101bo
164 | 111bo8bo6b3o29b2o2bo3b4o2bo2bo18b2o18bo3bob3o39bo3bo7b4o35bo2b2o12bo3b
165 | 4o58b4ob2ob2o22bo2bo100b$101bobo119b2o5b2o27b2obo5bo3b2o44bo3b3o39bo3b
166 | o3b8obo29b2o4b2ob3o5b2o2bobo3b2o65bo129b$101b2o104bo15b3o3bo4b4o23b2o
167 | 2bo3b4o2bo4bo38bo45bo6bo8b2o29bob2o4b3o4bo2b2o3bo70b3o126b$208b2o15bo
168 | 7bo3bo25bobo4b2o9bo10bo73b2o9bob3o33bo4b3o5b2o2bobo3b2o66b3o4bo18b2o
169 | 101b$207b2o28bo26bo10bo5bo11b2o30b2o44b2o5b3o31bo4b5o11bo3b4o4bo2bo64b
170 | 2o17bo7b2o93b$233bo2bo10bobo26b6o10b2o22b4o4b4o43bo3bo32b3o3b8o15b2ob
171 | 2o7bo6b2o54bobo17bo2bo5b2o92b$248b2o58bo2bo3bo3bo4b2ob2o80b2o3bo24b2o
172 | 4bo3bo4b2ob2o74b3o4b2o93b$94bo153bo63bo6bo6b2o27bo25b2o27bo3b5o27b4o4b
173 | 4o49b4o8bo15b2o3bo94b$93bo193bo7b2o11bo3bo2bo2bo35bo25b4o27b2o42b2o49b
174 | 6o7bo115b$70b2o21b3o4b2o28b2o28b2o28b2o28b2o66b2o7bo11b4o41b3o6b2o15b
175 | 2ob2o29bo4bo86b4ob2o6bobo113b$70b2o28b2o28b2o28b2o28b2o28b2o65b2o3bo7b
176 | 2o2b3o55b4o16b2o33b4o89b2o8bo20b2o92b$249b2o40bo8b2o2b3o21b2o32b2ob2o
177 | 52bobo4b2o16b3o7bo65b2o18b4o91b$248b4o40bo7b2o2b3o23bo9bo23b2o54bo6b2o
178 | 15bo9b2o84b2ob2o90b$248b2ob2o44bo11b4o20bo5bo81bo4bo17b3o6bob2o68b2o
179 | 15b2o91b$250b2o43b2o11bo3bo19bobo4b3o15b2o88b3o3bobo67b2ob2o107b$191b
180 | 2o119bo15bobo3bo21b4o93b2o68b4o108b$70b3o27b3o27b3o27b3o27bo2bo114bo2b
181 | o17bob3o10bo11b2ob2o63b2o5b2o91b2o109b$69b2ob2o25b2ob2o25b2ob2o25b2ob
182 | 2o26bo2bo148b2obo3bo2bo5b2o60b4ob2o5b2o201b$69b2ob2o25b2ob2o25b2ob2o
183 | 25b2ob2o26bobo147b5o4bo3bo66b6o6bo202b$69b5o25b5o25b5o25b5o25b3o117b2o
184 | 29bo2bo4bo4b2o66b4o8bo22b2o177b$68b2o3b2o23b2o3b2o23b2o3b2o23b2o3b2o
185 | 24b3o28b2o28b2o28b2o26bo2bo28b5o4bo3bo84b2o14b2ob2o176b$188bo2bo27bobo
186 | 27bobo27bobo26bo2bo30b2obo3bo2bo5b2o77b4o13b4o177b$188bobo28b2o28b2o
187 | 28b2o28b2o33bo11b2ob2o76b2ob2o13b2o178b$70b2o28b2o28b2o28b2o26b3o165b
188 | 4o79b2o194b$69b5o25b5o25b5o25b5o193b2o276b$69bo29bo29bo29bo475b$71b3o
189 | 27b3o27b3o27b3o471b$73bo29bo29bo29bo471b$71b2o28b2o28b2o28b2o472b$71b
190 | 2o28b2o28b2o28b2o472b$309b2o41b4o279b$187b2o28b2o28b2o28b2o62bo9bo3bo
191 | 279b$66b2o3b2o23b2o3b2o23b2o3b2o23b2o3b2o24bobo27bobo27bobo26bo2bo27b
192 | 4o31b2o11bo279b$66bobobobo23bobobobo23bobobobo23bobobobo25b2o28b2o28b
193 | 2o29bo25b2o32b3o5b2o2bo2bo280b$67b5o5bobo17b5o5bobo17b5o5bobo17b5o5bob
194 | o18b2o84bo3bo59b3o6b3o285b$68b3o7b2o18b3o7b2o18b3o7b2o18b3o7b2o19b2o
195 | 82bo65b3o5b2o2bo2bo280b$69bo8bo20bo8bo20bo8bo20bo8bo19bobo84b2o65b2o
196 | 11bo279b$190bo114b2o34bo9bo3bo279b$243bo2bo57b4o23b2o19b4o279b$247bo
197 | 46bo9b2ob2o16b5o305b$243bo3bo46bo11b2o16b6o2bo6b2o16bo2bo274b$85bo29bo
198 | 29bo98b4o42bo2b2o4bobo22b5o9b2o21bo273b$86b2o28b2o28b2o142bo7bo2b2o27b
199 | 2o8bo16bo3bo13bo2bo256b$68b2o15b2o11b2o15b2o11b2o15b2o11b2o28b2o28b2o
200 | 70bo2b2o4bobo56b4o17bo255b$68b2o28b2o28b2o28b2o28b2o28b2o64b2o8bo11b2o
201 | 67bo3bo255b$283bobo8bo9b2ob2o3b2o5bo2bo30b3o20b4o255b$285bo18b4o3b4o8b
202 | o29b3o279b$305b2o4b2ob2o3bo3bo28bobo280b$230b2o12b3o28b2o36b2o5b4o311b
203 | $92bobo27bobo27bobo74b4o13bo15bo8b4ob2o11b2o78bo4b2o259b$93b2o28b2o28b
204 | 2o49b2o11bo11b2ob2o11bo14bobo4bo3b6o11bobo75b4o3b2ob2o257b$93bo29bo29b
205 | o49bobo9b2obo3bo2bo5b2o26bo2bo5bo3b4o14bo12bo61b5o4bo2bo257b$205bo7b5o
206 | 4bo3bo22b2o8bo6bo2bo31bo2bo13b2o44bo9bo2bo257b$213bo2bo4bo4b2o23bo7bo
207 | 2bo5bo3b2o27bo3bo11b2ob2o43b2o8b2o258b$213b5o4bo3bo22b2o9bobo4bo3b4o
208 | 19b2o5bo3bo12bo2bo44bo268b$209b2o4b2obo3bo2bo5b2o29bo8b2ob2o17bobo5bo
209 | 3bo12bo2bo313b$100bo29bo77bobo6bo11b2ob2o12bo26b2o5b2o5b4o4bo6bobo3b2o
210 | 9b2o47b2o5bo2bo256b$101b2o28b2o77bo18b4o4b3o4bo3bo29b2ob2o3bo3bo12bo4b
211 | 2o57b4o8bo255b$100b2o28b2o98b2o4b5o8bo4b3o21b4o8bo76b2ob2o3bo3bo255b$
212 | 105b2o96b5o28b3ob2o2bo4bo6bo22b2o5bo2bo29bo2bo46b2o5b4o255b$105b2o95bo
213 | 4bo6b2o23b2o4b5o5bo67bo311b$207bo5bobo69bo33bo3bo311b$202bo3bo8bo64bo
214 | 3bo2bo15b4o13b4o311b$94bo43b2o64bo54b3o17b2o7bo13bo3bo328b$92bo3bo40bo
215 | 123bo18b2o6bo17bo328b$97bo39bobo79b2o17b2o20bo20b2o4b2o13bo2bo329b$92b
216 | o4bo40bo79bobo16b2o7b3o16bobo18bo348b$93b5o38bo83bo17bo2bo6bo16bo2bo
217 | 14b2o350b$135bo4bo98bo6bobo386b$141bo99b2o3b2o18b3o366b$135bo5bo82b2o
218 | 61b4o344b$136b6o83bo43bo2bo13bo3bo344b$225bo20bo2bo23bo16bo344b$226b2o
219 | 22bo18bo3bo12bo2bo345b$246bo3bo19b4o361b$230b4o13b4o384b$229bo3bo401b$
220 | 233bo401b$229bo2bo!
--------------------------------------------------------------------------------
/formats.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | var
4 | /** @const */
5 | MIN_BUFFER_SIZE = 0x100,
6 |
7 | /**
8 | * A
9 | * @const
10 | */
11 | MAX_BUFFER_SIZE = 0x1000000,
12 |
13 | /**
14 | * An estimated guess for the density of a Life pattern, in alive/cell
15 | * @const
16 | */
17 | DENSITY_ESTIMATE = .009;
18 |
19 |
20 |
21 | var formats = (function()
22 | {
23 |
24 | return {
25 | parse_rle: parse_rle,
26 | //parse_life105: parse_life105,
27 | //parse_life106: parse_life106,
28 | //parse_plaintext: parse_plaintext,
29 | parse_pattern: parse_pattern,
30 | rule2str: rule2str,
31 | parse_rule: parse_rule,
32 | parse_comments: parse_comments,
33 | generate_rle: generate_rle,
34 | };
35 |
36 |
37 |
38 | function parse_rle(pattern_string)
39 | {
40 | var
41 | result = parse_comments(pattern_string, "#"),
42 | x = 0, y = 0,
43 | header_match,
44 | expr = /([a-zA-Z]+) *= *([a-zA-Z0-9\/()]+)/g,
45 | match;
46 |
47 | pattern_string = result.pattern_string;
48 | var pos = pattern_string.indexOf("\n");
49 |
50 | if(pos === -1)
51 | {
52 | return { error : "RLE Syntax Error: No Header" };
53 | }
54 |
55 | while(header_match = expr.exec(pattern_string.substr(0, pos)))
56 | {
57 | switch(header_match[1])
58 | {
59 | case "x":
60 | result.width = Number(header_match[2]);
61 | break;
62 |
63 | case "y":
64 | result.height = Number(header_match[2]);
65 | break;
66 |
67 | case "rule":
68 | result.rule_s = parse_rule_rle(header_match[2], true);
69 | result.rule_b = parse_rule_rle(header_match[2], false);
70 |
71 | result.comment += "\nRule: " + rule2str(result.rule_s, result.rule_b) + "\n";
72 | result.rule = rule2str(result.rule_s, result.rule_b);
73 | break;
74 |
75 | case "alpha":
76 | case "color":
77 | break;
78 |
79 | default:
80 | //console.log(header_match);
81 | return { error : "RLE Syntax Error: Invalid Header: " + header_match[1] };
82 | }
83 | }
84 | /*
85 | Today I learned:
86 |
87 | Optimize a certain string parsing algorithm (1 Megabyte input).
88 | Timings:
89 | 1. using while(str = str.replace(re, callback)): Over 9000
90 | 2. using while(match = re.exec(str)): 800ms
91 | 3. using for(var pos = 0; pos < str.length; pos++) chr = str[pos]: 750ms
92 | 4. using for(var pos = 0; pos < str.length; pos++) chr = str.charCodeAt(pos): 50ms
93 |
94 | => re.exec is way faster than str.replace (obviously)
95 | => parsing character by character with str comparisons is same speed as re.exec
96 | => number comparisons are way faster than single character comparisons
97 | */
98 | //console.time("parse rle");
99 |
100 | var initial_size = MIN_BUFFER_SIZE;
101 |
102 | if(result.width && result.height)
103 | {
104 | var size = result.width * result.height;
105 |
106 | if(size > 0)
107 | {
108 | initial_size = Math.max(initial_size, size * DENSITY_ESTIMATE | 0);
109 | initial_size = Math.min(MAX_BUFFER_SIZE, initial_size);
110 | }
111 | }
112 |
113 | var count = 1,
114 | in_number = false,
115 | chr,
116 | field_x = new Int32Array(initial_size),
117 | field_y = new Int32Array(initial_size),
118 | alive_count = 0,
119 | len = pattern_string.length;
120 |
121 | for(; pos < len; pos++)
122 | {
123 | chr = pattern_string.charCodeAt(pos);
124 |
125 | if(chr >= 48 && chr <= 57)
126 | {
127 | if(in_number)
128 | {
129 | count *= 10;
130 | count += chr ^ 48;
131 | }
132 | else
133 | {
134 | count = chr ^ 48;
135 | in_number = true;
136 | }
137 | }
138 | else
139 | {
140 | if(chr === 98) // b
141 | {
142 | x += count;
143 | }
144 | else if(chr >= 65 && chr <= 90 || chr >= 97 && chr < 122) // A-Za-z
145 | {
146 | if(alive_count + count > field_x.length)
147 | {
148 | field_x = increase_buf_size(field_x);
149 | field_y = increase_buf_size(field_y);
150 | }
151 |
152 | while(count--)
153 | {
154 | field_x[alive_count] = x++;
155 | field_y[alive_count] = y;
156 | alive_count++;
157 | }
158 | }
159 | else if(chr === 36) // $
160 | {
161 | y += count;
162 | x = 0;
163 | }
164 | else if(chr === 33) // !
165 | {
166 | break;
167 | }
168 |
169 | count = 1;
170 | in_number = false;
171 | }
172 | }
173 | //console.timeEnd("parse rle");
174 | //console.log(initial_size, alive_count);
175 |
176 | result.field_x = new Int32Array(field_x.buffer, 0, alive_count);
177 | result.field_y = new Int32Array(field_y.buffer, 0, alive_count);
178 |
179 | return result;
180 | }
181 |
182 | function increase_buf_size(buffer)
183 | {
184 | var new_buffer = new Int32Array(buffer.length * 1.5 | 0);
185 | new_buffer.set(buffer);
186 | return new_buffer;
187 | }
188 |
189 | function parse_life105(pattern_string)
190 | {
191 | var result = parse_comments(pattern_string, "#");
192 |
193 | // defunctional now
194 | // parsing this is similiar to plaintext
195 |
196 | return result;
197 | }
198 |
199 | function parse_life106(pattern_string)
200 | {
201 | // a list of coordinates essentially
202 | var expr = /\s*(-?\d+)\s+(-?\d+)\s*(?:\n|$)/g,
203 | match,
204 | field_x = [],
205 | field_y = [];
206 |
207 | while(match = expr.exec(pattern_string))
208 | {
209 | field_x.push(Number(match[1]));
210 | field_y.push(Number(match[2]));
211 | }
212 |
213 | return {
214 | field_x: field_x,
215 | field_y: field_y,
216 | };
217 | }
218 |
219 | function parse_plaintext(pattern_string)
220 | {
221 | var result = parse_comments(pattern_string, "!");
222 |
223 | pattern_string = result.pattern_string;
224 |
225 | var field_x = [],
226 | field_y = [],
227 | x = 0,
228 | y = 0,
229 | len = pattern_string.length;
230 |
231 | for(var i = 0; i < len; i++)
232 | {
233 | switch(pattern_string[i])
234 | {
235 | case ".":
236 | x++;
237 | break;
238 |
239 | case "O":
240 | field_x.push(x++);
241 | field_y.push(y);
242 | break;
243 |
244 | case "\n":
245 | y++;
246 | x = 0;
247 | break;
248 |
249 | case "\r":
250 | case " ":
251 | break;
252 |
253 | /*case "":
254 | return result;
255 | break;*/
256 |
257 | default:
258 | //console.log("Plaintext: Syntax Error");
259 | return { error : "Plaintext: Syntax Error" };
260 | }
261 | }
262 |
263 | result.field_x = field_x;
264 | result.field_y = field_y;
265 |
266 | return result;
267 | }
268 |
269 | function parse_comments(pattern_string, comment_char)
270 | {
271 | var result = {
272 | comment: "",
273 | urls: [],
274 | short_comment: "",
275 | },
276 | nl,
277 | line,
278 | cont,
279 | advanced = comment_char === "#";
280 |
281 | while(pattern_string[0] === comment_char)
282 | {
283 | nl = pattern_string.indexOf("\n");
284 | line = pattern_string.substr(1, nl - 1);
285 | cont = true;
286 |
287 | if(advanced)
288 | {
289 | line = line.substr(1).trim();
290 |
291 | switch(pattern_string[1])
292 | {
293 | case "N":
294 | if(line)
295 | {
296 | result.title = line;
297 | }
298 | else
299 | {
300 | result.rule = "23/3";
301 | }
302 | cont = false;
303 | break;
304 |
305 | case "C":
306 | case "D":
307 | if(!result.short_comment)
308 | {
309 | result.short_comment = line;
310 | }
311 | break;
312 |
313 | case "O":
314 | result.author = line;
315 | break;
316 |
317 | case "R":
318 | result.rule = line;
319 | cont = false;
320 | break;
321 |
322 | //case "P":
323 | // center of the pattern
324 | // cont = false;
325 | // break;
326 |
327 | default:
328 | cont = false;
329 | }
330 | }
331 |
332 | if(cont)
333 | {
334 | if(/^(?:https?:\/\/|www\.)[a-z0-9]/i.test(line))
335 | {
336 | if(line.substr(0, 4) !== "http")
337 | {
338 | line = "http://" + line;
339 | }
340 |
341 | result.urls.push(line);
342 | }
343 | else if(line.substr(0, 5) === "Name:")
344 | {
345 | result.title = line.substr(5);
346 | }
347 | else
348 | {
349 | result.comment += line;
350 |
351 | if(nl !== 70 && nl !== 80)
352 | {
353 | result.comment += "\n";
354 | }
355 | }
356 | }
357 |
358 | pattern_string = pattern_string.substr(nl + 1);
359 | }
360 |
361 | result.pattern_string = pattern_string;
362 | result.comment = result.comment.trim();
363 |
364 | return result;
365 | }
366 |
367 | function parse_pattern(pattern_text)
368 | {
369 | pattern_text = pattern_text.replace(/\r/g, "");
370 |
371 | if(pattern_text[0] === "!")
372 | {
373 | return parse_plaintext(pattern_text);
374 | }
375 | else if(/^(?:#[^\n]*\n)*\n*(?:(?:x|y|rule|color|alpha) *= *[a-z0-9\/(),]+,? *)+\s*\n/i.test(pattern_text))
376 | {
377 | return parse_rle(pattern_text);
378 | }
379 | // defunctional
380 | //else if(pattern_text.substr(0, 10) === "#Life 1.05")
381 | //{
382 | // importer = parse_life105;
383 | //}
384 | else if(pattern_text.substr(0, 10) === "#Life 1.06")
385 | {
386 | return parse_life106(pattern_text);
387 | }
388 | else
389 | {
390 | return { error: "Format detection failed." };
391 | }
392 | }
393 |
394 | function rule2str(rule_s, rule_b)
395 | {
396 | var rule = "";
397 |
398 | for(var i = 0; rule_s; rule_s >>= 1, i++)
399 | {
400 | if(rule_s & 1)
401 | {
402 | rule += i;
403 | }
404 | }
405 |
406 | rule += "/";
407 |
408 | for(var i = 0; rule_b; rule_b >>= 1, i++)
409 | {
410 | if(rule_b & 1)
411 | {
412 | rule += i;
413 | }
414 | }
415 |
416 | return rule;
417 | }
418 |
419 | function rule2str_rle(rule_s, rule_b)
420 | {
421 | let rule = formats.rule2str(rule_s, rule_b);
422 | rule = rule.split("/");
423 | rule = `B${rule[1]}/S${rule[0]}`;
424 | return rule;
425 | }
426 |
427 | function parse_rule_rle(rule_str, survived)
428 | {
429 | rule_str = rule_str.split("/");
430 |
431 | if(!rule_str[1])
432 | {
433 | return false;
434 | }
435 |
436 | if(Number(rule_str[0]))
437 | {
438 | return parse_rule(rule_str.join("/"), survived);
439 | }
440 |
441 | if(rule_str[0][0].toLowerCase() === "b")
442 | {
443 | rule_str.reverse();
444 | }
445 |
446 | return parse_rule(rule_str[0].substr(1) + "/" + rule_str[1].substr(1), survived);
447 | }
448 |
449 | function parse_rule(rule_str, survived)
450 | {
451 | var rule = 0,
452 | parsed = rule_str.split("/")[survived ? 0 : 1];
453 |
454 | for(var i = 0; i < parsed.length; i++)
455 | {
456 | var n = Number(parsed[i]);
457 |
458 | if(isNaN(n) || rule & 1 << n)
459 | {
460 | return false;
461 | }
462 |
463 | rule |= 1 << n;
464 | }
465 |
466 | return rule;
467 | }
468 |
469 | function* rle_generator(life, bounds)
470 | {
471 | function make(length, is_empty)
472 | {
473 | console.assert(length >= 0);
474 |
475 | if(length === 0)
476 | {
477 | return "";
478 | }
479 |
480 | let length_tag = "";
481 |
482 | if(length > 1)
483 | {
484 | length_tag = String(length);
485 | }
486 |
487 | return length_tag + (is_empty ? "b" : "o");
488 | }
489 |
490 | for(let y = bounds.top; y <= bounds.bottom; y++)
491 | {
492 | let state_is_empty = true;
493 | let run_start = bounds.left;
494 |
495 | for(let x = bounds.left; x <= bounds.right; x++)
496 | {
497 | const is_empty = !life.get_bit(x, y);
498 | const run_length = x - run_start;
499 | console.assert(run_length >= 0);
500 |
501 | if(state_is_empty !== is_empty)
502 | {
503 | yield make(run_length, state_is_empty);
504 | run_start = x;
505 | state_is_empty = is_empty;
506 | }
507 | }
508 |
509 | if(!state_is_empty)
510 | {
511 | const run_length = bounds.right + 1 - run_start;
512 | yield make(run_length, state_is_empty);
513 | }
514 |
515 | if(y !== bounds.bottom)
516 | {
517 | yield "$";
518 | }
519 | }
520 |
521 | yield "!";
522 | }
523 |
524 | // implemented according to http://www.conwaylife.com/w/index.php?title=Run_Length_Encoded
525 | function generate_rle(life, name, comments)
526 | {
527 | const lines = [];
528 | const MAX_LINE_LENGTH = 70;
529 |
530 | if(name)
531 | {
532 | lines.push("#N " + name);
533 | }
534 |
535 | lines.push.apply(lines, comments.map(c => "#C " + c));
536 |
537 | const root = life.root;
538 | const bounds = life.get_root_bounds();
539 |
540 | {
541 | const width = bounds.right - bounds.left + 1;
542 | const height = bounds.bottom - bounds.top + 1;
543 | const rule = rule2str_rle(life.rule_s, life.rule_b);
544 | lines.push(`x = ${width}, y = ${height}, rule = ${rule}`);
545 | }
546 |
547 | let current_line = "";
548 |
549 | for(let fragment of rle_generator(life, bounds))
550 | {
551 | if(current_line.length + fragment.length > MAX_LINE_LENGTH)
552 | {
553 | console.assert(fragment.length < MAX_LINE_LENGTH);
554 | lines.push(current_line);
555 | current_line = "";
556 | }
557 |
558 | current_line += fragment;
559 | }
560 |
561 | lines.push(current_line);
562 |
563 | return lines.join("\n");
564 | }
565 | })();
566 |
--------------------------------------------------------------------------------
/life.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | var
4 | /** @const */
5 | LOAD_FACTOR = .9,
6 | /** @const */
7 | INITIAL_SIZE = 16,
8 | /** @const */
9 | HASHMAP_LIMIT = 24,
10 |
11 | /** @const */
12 | MASK_LEFT = 1,
13 | /** @const */
14 | MASK_TOP = 2,
15 | /** @const */
16 | MASK_RIGHT = 4,
17 | /** @const */
18 | MASK_BOTTOM = 8;
19 |
20 |
21 |
22 | /** @constructor */
23 | function LifeUniverse()
24 | {
25 | // last id for nodes
26 | /** @type {number} */
27 | this.last_id = 0;
28 |
29 | // Size of the hashmap.
30 | // Always a power of 2 minus 1
31 | this.hashmap_size = 0;
32 |
33 |
34 | // Size when the next GC will happen
35 | this.max_load = 0;
36 |
37 | // the hashmap
38 | this.hashmap = [];
39 |
40 | this.empty_tree_cache = [];
41 | this.level2_cache = [];
42 |
43 | this._powers = new Float64Array(1024);
44 | this._powers[0] = 1;
45 |
46 | for(var i = 1; i < 1024; i++)
47 | {
48 | this._powers[i] = this._powers[i - 1] * 2;
49 | }
50 |
51 |
52 | this._bitcounts = new Int8Array(0x758);
53 | this._bitcounts.set([0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]);
54 |
55 | for(var i = 0x10; i < 0x758; i++)
56 | {
57 | this._bitcounts[i] = this._bitcounts[i & 0xF] +
58 | this._bitcounts[i >> 4 & 0xF] +
59 | this._bitcounts[i >> 8];
60 | }
61 |
62 |
63 | // current rule setting
64 | /** @type {number} */
65 | this.rule_b = 1 << 3;
66 | /** @type {number} */
67 | this.rule_s = 1 << 2 | 1 << 3;
68 |
69 | this.root = null;
70 |
71 | this.rewind_state = null;
72 |
73 | /**
74 | * number of generations to calculate at one time,
75 | * written as 2^n
76 | * @type {number}
77 | */
78 | this.step = 0;
79 |
80 | // in which generation are we
81 | /** @type {number} */
82 | this.generation = 0;
83 |
84 | // living or dead leaf
85 | this.false_leaf =
86 | {
87 | id: 3,
88 | population: 0,
89 | level: 0,
90 | };
91 | this.true_leaf =
92 | {
93 | id: 2,
94 | population: 1,
95 | level: 0,
96 | };
97 |
98 | this.clear_pattern();
99 | }
100 |
101 | LifeUniverse.prototype.pow2 = function(x)
102 | {
103 | if(x >= 1024)
104 | return Infinity;
105 |
106 | return this._powers[x];
107 | };
108 |
109 | LifeUniverse.prototype.save_rewind_state = function()
110 | {
111 | this.rewind_state = this.root;
112 | };
113 |
114 | LifeUniverse.prototype.restore_rewind_state = function()
115 | {
116 | this.generation = 0;
117 | this.root = this.rewind_state;
118 |
119 | // make sure to rebuild the hashmap, in case its size changed
120 | this.garbage_collect();
121 | };
122 |
123 | LifeUniverse.prototype.eval_mask = function(bitmask)
124 | {
125 | var rule = (bitmask & 32) ? this.rule_s : this.rule_b;
126 |
127 | return rule >> this._bitcounts[bitmask & 0x757] & 1;
128 | };
129 |
130 | LifeUniverse.prototype.level1_create = function(bitmask)
131 | {
132 | return this.create_tree(
133 | bitmask & 1 ? this.true_leaf : this.false_leaf,
134 | bitmask & 2 ? this.true_leaf : this.false_leaf,
135 | bitmask & 4 ? this.true_leaf : this.false_leaf,
136 | bitmask & 8 ? this.true_leaf : this.false_leaf
137 | );
138 | };
139 |
140 | LifeUniverse.prototype.set_bit = function(x, y, living)
141 | {
142 | var level = this.get_level_from_bounds({ x: x, y: y });
143 |
144 | if(living)
145 | {
146 | while(level > this.root.level)
147 | {
148 | this.root = this.expand_universe(this.root);
149 | }
150 | }
151 | else
152 | {
153 | if(level > this.root.level) {
154 | // no need to delete pixels outside of the universe
155 | return;
156 | }
157 | }
158 |
159 | this.root = this.node_set_bit(this.root, x, y, living);
160 | };
161 |
162 | LifeUniverse.prototype.get_bit = function(x, y)
163 | {
164 | var level = this.get_level_from_bounds({ x: x, y: y });
165 |
166 | if(level > this.root.level)
167 | {
168 | return false;
169 | }
170 | else
171 | {
172 | return this.node_get_bit(this.root, x, y);
173 | }
174 | };
175 |
176 | LifeUniverse.prototype.get_root_bounds = function()
177 | {
178 | if(this.root.population === 0)
179 | {
180 | return {
181 | top: 0,
182 | left: 0,
183 | bottom: 0,
184 | right: 0,
185 | };
186 | }
187 |
188 | var bounds = {
189 | top: Infinity,
190 | left: Infinity,
191 | bottom: -Infinity,
192 | right: -Infinity,
193 | },
194 | offset = this.pow2(this.root.level - 1);
195 |
196 | this.node_get_boundary(this.root, -offset, -offset, MASK_TOP | MASK_LEFT | MASK_BOTTOM | MASK_RIGHT, bounds);
197 |
198 | return bounds;
199 | };
200 |
201 | LifeUniverse.prototype.empty_tree = function(level)
202 | {
203 | if(this.empty_tree_cache[level]) {
204 | return this.empty_tree_cache[level];
205 | }
206 |
207 | var t;
208 |
209 | if(level === 1) {
210 | t = this.false_leaf;
211 | }
212 | else {
213 | t = this.empty_tree(level - 1);
214 | }
215 |
216 | return this.empty_tree_cache[level] = this.create_tree(t, t, t, t);
217 | };
218 |
219 | LifeUniverse.prototype.expand_universe = function(node)
220 | {
221 | var t = this.empty_tree(node.level - 1);
222 |
223 | return this.create_tree(
224 | this.create_tree(t, t, t, node.nw),
225 | this.create_tree(t, t, node.ne, t),
226 | this.create_tree(t, node.sw, t, t),
227 | this.create_tree(node.se, t, t, t)
228 | );
229 | };
230 |
231 | // Preserve the tree, but remove all cached
232 | // generations forward
233 | LifeUniverse.prototype.uncache = function(also_quick)
234 | {
235 | for(var i = 0; i <= this.hashmap_size; i++)
236 | {
237 | var node = this.hashmap[i];
238 |
239 | if(node !== undefined)
240 | {
241 | node.cache = null;
242 | node.hashmap_next = undefined;
243 |
244 | if(also_quick)
245 | node.quick_cache = null;
246 | }
247 | }
248 | };
249 |
250 |
251 | // return false if a node is in the hashmap
252 | LifeUniverse.prototype.in_hashmap = function(n)
253 | {
254 | var hash = this.calc_hash(n.nw.id, n.ne.id, n.sw.id, n.se.id) & this.hashmap_size,
255 | node = this.hashmap[hash];
256 |
257 | for(;;)
258 | {
259 | if(node === undefined)
260 | {
261 | return false;
262 | }
263 | else if(node === n)
264 | {
265 | return true;
266 | }
267 |
268 | node = node.hashmap_next;
269 | }
270 | };
271 |
272 | // insert a node into the hashmap
273 | LifeUniverse.prototype.hashmap_insert = function(n)
274 | {
275 | var hash = this.calc_hash(n.nw.id, n.ne.id, n.sw.id, n.se.id) & this.hashmap_size,
276 | node = this.hashmap[hash],
277 | prev;
278 |
279 | for(;;)
280 | {
281 | if(node === undefined)
282 | {
283 | if(prev !== undefined)
284 | {
285 | prev.hashmap_next = n;
286 | }
287 | else
288 | {
289 | this.hashmap[hash] = n;
290 | }
291 |
292 | return;
293 | }
294 | //else if(node === n)
295 | //{
296 | // // Should not happen
297 | //}
298 |
299 | prev = node;
300 | node = node.hashmap_next;
301 | }
302 | };
303 |
304 | // create or search for a tree node given its children
305 | LifeUniverse.prototype.create_tree = function(nw, ne, sw, se)
306 | {
307 | var hash = this.calc_hash(nw.id, ne.id, sw.id, se.id) & this.hashmap_size,
308 | node = this.hashmap[hash],
309 | prev;
310 |
311 | for(;;)
312 | {
313 | if(node === undefined)
314 | {
315 | if(this.last_id > this.max_load)
316 | {
317 | this.garbage_collect();
318 | return this.create_tree(nw, ne, sw, se);
319 | }
320 |
321 | var new_node = new this.TreeNode(nw, ne, sw, se, this.last_id++);
322 |
323 | if(prev !== undefined)
324 | {
325 | prev.hashmap_next = new_node;
326 | }
327 | else
328 | {
329 | this.hashmap[hash] = new_node;
330 | }
331 |
332 | return new_node;
333 | }
334 | else if(node.nw === nw && node.ne === ne && node.sw === sw && node.se === se)
335 | {
336 | return node;
337 | }
338 | //console.log("collision hash=" + hash +
339 | // " (" + node.nw.id + "," + node.ne.id + "," + node.sw.id + "," + node.se.id + ")" +
340 | // " (" + nw.id + "," + ne.id + "," + sw.id + "," + se.id + ")");
341 |
342 | prev = node;
343 | node = node.hashmap_next;
344 | }
345 | };
346 |
347 | LifeUniverse.prototype.next_generation = function(is_single)
348 | {
349 | var root = this.root;
350 |
351 | while(
352 | (is_single && root.level <= this.step + 2) ||
353 | root.nw.population !== root.nw.se.se.population ||
354 | root.ne.population !== root.ne.sw.sw.population ||
355 | root.sw.population !== root.sw.ne.ne.population ||
356 | root.se.population !== root.se.nw.nw.population)
357 | {
358 | root = this.expand_universe(root);
359 | }
360 |
361 | if(is_single)
362 | {
363 | this.generation += this.pow2(this.step);
364 | root = this.node_next_generation(root);
365 | }
366 | else
367 | {
368 | this.generation += this.pow2(this.root.level - 2);
369 | root = this.node_quick_next_generation(root);
370 | }
371 |
372 | this.root = root;
373 | };
374 |
375 | LifeUniverse.prototype.garbage_collect = function()
376 | {
377 | //document.getElementById("pattern_name").textContent = last_id + " / " + (last_id / hashmap_size).toFixed(5);
378 | //console.log("entries: " + this.last_id);
379 | //console.log("load factor: " + this.last_id / this.hashmap_size);
380 |
381 | //console.log("collecting garbage ...");
382 | //var t = Date.now();
383 |
384 | if(this.hashmap_size < (1 << HASHMAP_LIMIT) - 1)
385 | {
386 | this.hashmap_size = this.hashmap_size << 1 | 1;
387 | this.hashmap = [];
388 | }
389 |
390 | this.max_load = this.hashmap_size * LOAD_FACTOR | 0;
391 |
392 |
393 | for(var i = 0; i <= this.hashmap_size; i++)
394 | this.hashmap[i] = undefined;
395 |
396 | this.last_id = 4;
397 | this.node_hash(this.root);
398 |
399 | //console.log("new entries: " + this.last_id);
400 | //console.log("population: " + this.root.population);
401 | //console.log("new hashmap size: " + this.hashmap_size);
402 | //console.log("GC done in " + (Date.now() - t));
403 | //console.log("size: " + hashmap.reduce(function(a, x) { return a + (x !== undefined); }, 0));
404 | };
405 |
406 | // the hash function used for the hashmap
407 | LifeUniverse.prototype.calc_hash = function(nw_id, ne_id, sw_id, se_id)
408 | {
409 | //nw_id = nw_id | 0;
410 | //ne_id = ne_id | 0;
411 | //sw_id = sw_id | 0;
412 | //se_id = se_id | 0;
413 |
414 |
415 | //var hash = 0;
416 | //hash = hash + nw_id | 0;
417 | //nw_id = ne_id + (nw_id << 6) + (nw_id << 16) - nw_id | 0;
418 | //nw_id = sw_id + (nw_id << 6) + (nw_id << 16) - nw_id | 0;
419 | //nw_id = se_id + (nw_id << 6) + (nw_id << 16) - nw_id | 0;
420 | //return nw_id | 0;
421 |
422 | var hash = ((nw_id * 23 ^ ne_id) * 23 ^ sw_id) * 23 ^ se_id;
423 | return hash;
424 | };
425 |
426 | LifeUniverse.prototype.clear_pattern = function()
427 | {
428 | this.last_id = 4;
429 | this.hashmap_size = (1 << INITIAL_SIZE) - 1;
430 | this.max_load = this.hashmap_size * LOAD_FACTOR | 0;
431 | this.hashmap = [];
432 | this.empty_tree_cache = [];
433 | this.level2_cache = Array(0x10000);
434 |
435 | for(var i = 0; i <= this.hashmap_size; i++)
436 | this.hashmap[i] = undefined;
437 |
438 | this.root = this.empty_tree(3);
439 | this.generation = 0;
440 | };
441 |
442 | LifeUniverse.prototype.get_bounds = function(field_x, field_y)
443 | {
444 | if(!field_x.length)
445 | {
446 | return {
447 | top: 0,
448 | left: 0,
449 | bottom: 0,
450 | right: 0
451 | };
452 | }
453 |
454 | var bounds = {
455 | top : field_y[0],
456 | left : field_x[0],
457 | bottom : field_y[0],
458 | right : field_x[0]
459 | },
460 | len = field_x.length;
461 |
462 | for(var i = 1; i < len; i++)
463 | {
464 | var x = field_x[i],
465 | y = field_y[i];
466 |
467 | if(x < bounds.left)
468 | {
469 | bounds.left = x;
470 | }
471 | else if(x > bounds.right)
472 | {
473 | bounds.right = x;
474 | }
475 |
476 | if(y < bounds.top)
477 | {
478 | bounds.top = y;
479 | }
480 | else if(y > bounds.bottom)
481 | {
482 | bounds.bottom = y;
483 | }
484 | }
485 |
486 | return bounds;
487 | };
488 |
489 | /*
490 | * given a point { x, y } or a bounds object { left, top, bottom, right },
491 | * return the quadtree level that is required to contain this point
492 | */
493 | LifeUniverse.prototype.get_level_from_bounds = function(bounds)
494 | {
495 | // root should always be at least level 3
496 | var max = 4,
497 | keys = Object.keys(bounds);
498 |
499 | for(var i = 0; i < keys.length; i++)
500 | {
501 | var coordinate = bounds[keys[i]];
502 |
503 | if(coordinate + 1 > max) {
504 | max = coordinate + 1;
505 | }
506 | else if(-coordinate > max) {
507 | max = -coordinate;
508 | }
509 | }
510 |
511 | return Math.ceil(Math.log(max) / Math.LN2) + 1;
512 | };
513 |
514 | LifeUniverse.prototype.field2tree = function(field, level)
515 | {
516 | var tree = make_node(),
517 | len = field.length;
518 |
519 | function make_node()
520 | {
521 | return { nw: false, ne: false, sw: false, se: false };
522 | }
523 |
524 | for(var i = 0; i < len; i++)
525 | {
526 | var x = field[i].x,
527 | y = field[i].y,
528 | node = tree;
529 |
530 | for(var j = level - 2; j >= 0; j--)
531 | {
532 | var offset = this.pow2(j);
533 |
534 | if(x < 0)
535 | {
536 | x += offset;
537 | if(y < 0)
538 | {
539 | y += offset;
540 | if(!node.nw) {
541 | node.nw = make_node();
542 | }
543 | node = node.nw;
544 | }
545 | else
546 | {
547 | y -= offset;
548 | if(!node.sw) {
549 | node.sw = make_node();
550 | }
551 | node = node.sw;
552 | }
553 | }
554 | else
555 | {
556 | x -= offset;
557 | if(y < 0)
558 | {
559 | y += offset;
560 | if(!node.ne) {
561 | node.ne = make_node();
562 | }
563 | node = node.ne;
564 | }
565 | else
566 | {
567 | y -= offset;
568 | if(!node.se) {
569 | node.se = make_node();
570 | }
571 | node = node.se;
572 | }
573 | }
574 | }
575 |
576 | if(x < 0)
577 | {
578 | if(y < 0) {
579 | node.nw = true;
580 | }
581 | else {
582 | node.sw = true;
583 | }
584 | }
585 | else
586 | {
587 | if(y < 0) {
588 | node.ne = true;
589 | }
590 | else {
591 | node.se = true;
592 | }
593 | }
594 | }
595 |
596 | return tree;
597 | };
598 |
599 | /*
600 | * move a field so that (0,0) is in the middle
601 | */
602 | LifeUniverse.prototype.make_center = function(field_x, field_y, bounds)
603 | {
604 | var offset_x = Math.round((bounds.left - bounds.right) / 2) - bounds.left,
605 | offset_y = Math.round((bounds.top - bounds.bottom) / 2) - bounds.top;
606 |
607 | this.move_field(field_x, field_y, offset_x, offset_y);
608 |
609 | bounds.left += offset_x;
610 | bounds.right += offset_x;
611 | bounds.top += offset_y;
612 | bounds.bottom += offset_y;
613 | };
614 |
615 | LifeUniverse.prototype.move_field = function(field_x, field_y, offset_x, offset_y)
616 | {
617 | var len = field_x.length;
618 |
619 | for(var i = 0; i < len; i++)
620 | {
621 | field_x[i] += offset_x;
622 | field_y[i] += offset_y;
623 | }
624 | };
625 |
626 | /** @param {*=} bounds */
627 | LifeUniverse.prototype.setup_field = function(field_x, field_y, bounds)
628 | {
629 | if(bounds === undefined) {
630 | bounds = this.get_bounds(field_x, field_y);
631 | }
632 |
633 | var level = this.get_level_from_bounds(bounds),
634 | offset = this.pow2(level - 1),
635 | count = field_x.length;
636 |
637 | //console.log(field_x, field_y);
638 | this.move_field(field_x, field_y, offset, offset);
639 |
640 | //console.time("setup");
641 |
642 | //console.time("setup");
643 | this.root = this.setup_field_recurse(0, count - 1, field_x, field_y, level);
644 | //console.timeEnd("setup");
645 |
646 | //console.log("entries: " + this.last_id);
647 | //console.profileEnd("setup");
648 | };
649 |
650 | LifeUniverse.prototype.partition = function(start, end, test_field, other_field, offset)
651 | {
652 | // Like quicksort's partition: Seperate the values from start to end by
653 | // the bitmask in offset in the array test_field, returning the middle
654 | var i = start,
655 | j = end,
656 | swap;
657 |
658 | while(i <= j)
659 | {
660 | while(i <= end && (test_field[i] & offset) === 0)
661 | {
662 | i++;
663 | }
664 |
665 | while(j > start && (test_field[j] & offset))
666 | {
667 | j--;
668 | }
669 |
670 | if(i >= j)
671 | {
672 | break;
673 | }
674 |
675 | swap = test_field[i];
676 | test_field[i] = test_field[j];
677 | test_field[j] = swap;
678 |
679 | swap = other_field[i];
680 | other_field[i] = other_field[j];
681 | other_field[j] = swap;
682 |
683 | i++;
684 | j--;
685 | }
686 |
687 | return i;
688 | };
689 |
690 | LifeUniverse.prototype.setup_field_recurse = function(start, end, field_x, field_y, level)
691 | {
692 | if(start > end)
693 | {
694 | return this.empty_tree(level);
695 | }
696 |
697 | if(level === 2)
698 | {
699 | return this.level2_setup(start, end, field_x, field_y);
700 | }
701 |
702 | level--;
703 |
704 | var offset = 1 << level,
705 | // here we split the field from start to end into 4 parts:
706 | // [Start, part2] -> nw
707 | // [Part2, part3] -> ne
708 | // [Part3, part4] -> sw
709 | // [Part4, end ] -> se
710 | //
711 | // First we split [start, end] into north and south by partitioning
712 | // by the y coordinates. Next we split the two halfes by the x coordinate.
713 | part3 = this.partition(start, end, field_y, field_x, offset),
714 | part2 = this.partition(start, part3 - 1, field_x, field_y, offset),
715 | part4 = this.partition(part3, end, field_x, field_y, offset);
716 |
717 |
718 | return this.create_tree(
719 | this.setup_field_recurse(start, part2 - 1, field_x, field_y, level),
720 | this.setup_field_recurse(part2, part3 - 1, field_x, field_y, level),
721 | this.setup_field_recurse(part3, part4 - 1, field_x, field_y, level),
722 | this.setup_field_recurse(part4, end, field_x, field_y, level)
723 | );
724 | };
725 |
726 | LifeUniverse.prototype.level2_setup = function(start, end, field_x, field_y)
727 | {
728 | var set = 0,
729 | x,
730 | y;
731 |
732 | for(var i = start; i <= end; i++)
733 | {
734 | x = field_x[i];
735 | y = field_y[i];
736 |
737 | // interleave 2-bit x and y values
738 | set |= 1 << (x & 1 | (y & 1 | x & 2) << 1 | (y & 2) << 2);
739 | //set |= 1 << ((0xA820 >> ((y & 3) << 2) | 0x5410 >> ((x & 3) << 2) & 15));
740 | }
741 |
742 | if(this.level2_cache[set])
743 | {
744 | return this.level2_cache[set];
745 | }
746 |
747 | return this.level2_cache[set] = this.create_tree(
748 | this.level1_create(set),
749 | this.level1_create(set >> 4),
750 | this.level1_create(set >> 8),
751 | this.level1_create(set >> 12)
752 | );
753 | };
754 |
755 | LifeUniverse.prototype.setup_meta = function(otca_on, otca_off, field, bounds)
756 | {
757 | var level = this.get_level_from_bounds(bounds),
758 | node = this.field2tree(field, level);
759 |
760 | this.root = setup_meta_from_tree(node, level + 11);
761 |
762 | function setup_meta_from_tree(node, level)
763 | {
764 | if(level === 11)
765 | {
766 | return node ? otca_on : otca_off;
767 | }
768 | else if(!node)
769 | {
770 | var dead = setup_meta_from_tree(false, level - 1);
771 |
772 | return this.create_tree(dead, dead, dead, dead);
773 | }
774 | else
775 | {
776 | level--;
777 |
778 | return this.create_tree(
779 | setup_meta_from_tree(node.nw, level),
780 | setup_meta_from_tree(node.ne, level),
781 | setup_meta_from_tree(node.sw, level),
782 | setup_meta_from_tree(node.se, level)
783 | );
784 | }
785 | }
786 | };
787 |
788 |
789 | //LifeUniverse.prototype.get_field = function(node)
790 | //{
791 | // var offset = this.pow2(node.level - 1),
792 | // field = [];
793 | //
794 | // this.node_get_field(node, -offset, -offset, field);
795 | // //node.get_field(-offset, -offset, field);
796 | //
797 | // return field;
798 | //};
799 |
800 | // set the base step for generations forward
801 | LifeUniverse.prototype.set_step = function(step)
802 | {
803 | if(step !== this.step)
804 | {
805 | this.step = step;
806 |
807 | this.uncache(false);
808 | this.empty_tree_cache = [];
809 | this.level2_cache = Array(0x10000);
810 | }
811 | };
812 |
813 | LifeUniverse.prototype.set_rules = function(s, b)
814 | {
815 | if(this.rule_s !== s || this.rule_b !== b)
816 | {
817 | this.rule_s = s;
818 | this.rule_b = b;
819 |
820 | this.uncache(true);
821 | this.empty_tree_cache = [];
822 | this.level2_cache = Array(0x10000);
823 | }
824 | };
825 |
826 | /**
827 | * @constructor
828 | */
829 | LifeUniverse.prototype.TreeNode = function(nw, ne, sw, se, id)
830 | {
831 | this.nw = nw;
832 | this.ne = ne;
833 | this.sw = sw;
834 | this.se = se;
835 |
836 | this.id = id;
837 |
838 | // 2^level = width/height of area
839 | this.level = nw.level + 1;
840 |
841 | this.population = nw.population + ne.population + sw.population + se.population;
842 |
843 | // one generation forward
844 | this.cache = null;
845 |
846 | // 2^(level - 2) generations forward
847 | this.quick_cache = null;
848 |
849 | // next entry in the hashmap if this node occupies the same slot
850 | this.hashmap_next = undefined;
851 |
852 | /*if(this.population === 0)
853 | {
854 | this.cache = this.quick_cache = nw;
855 | }*/
856 | };
857 |
858 | LifeUniverse.prototype.node_set_bit = function(node, x, y, living)
859 | {
860 | if(node.level === 0)
861 | {
862 | return living ? this.true_leaf : this.false_leaf;
863 | }
864 |
865 | var offset = node.level === 1 ? 0 : this.pow2(node.level - 2),
866 | nw = node.nw,
867 | ne = node.ne,
868 | sw = node.sw,
869 | se = node.se;
870 |
871 | if(x < 0)
872 | {
873 | if(y < 0)
874 | {
875 | nw = this.node_set_bit(nw, x + offset, y + offset, living);
876 | }
877 | else
878 | {
879 | sw = this.node_set_bit(sw, x + offset, y - offset, living);
880 | }
881 | }
882 | else
883 | {
884 | if(y < 0)
885 | {
886 | ne = this.node_set_bit(ne, x - offset, y + offset, living);
887 | }
888 | else
889 | {
890 | se = this.node_set_bit(se, x - offset, y - offset, living);
891 | }
892 | }
893 |
894 | return this.create_tree(nw, ne, sw, se);
895 | };
896 |
897 | LifeUniverse.prototype.node_get_bit = function(node, x, y)
898 | {
899 | if(node.population === 0)
900 | {
901 | return false;
902 | }
903 | if(node.level === 0)
904 | {
905 | // other level 0 case is handled above
906 | return true;
907 | }
908 |
909 | var offset = node.level === 1 ? 0 : this.pow2(node.level - 2);
910 |
911 | if(x < 0)
912 | {
913 | if (y < 0)
914 | {
915 | return this.node_get_bit(node.nw, x + offset, y + offset);
916 | }
917 | else
918 | {
919 | return this.node_get_bit(node.sw, x + offset, y - offset);
920 | }
921 | }
922 | else
923 | {
924 | if(y < 0)
925 | {
926 | return this.node_get_bit(node.ne, x - offset, y + offset);
927 | }
928 | else
929 | {
930 | return this.node_get_bit(node.se, x - offset, y - offset);
931 | }
932 | }
933 | };
934 |
935 | LifeUniverse.prototype.node_get_field = function(node, left, top, field)
936 | {
937 | if(node.population === 0)
938 | {
939 | return;
940 | }
941 |
942 | if(node.level === 0)
943 | {
944 | field.push({ x: left, y: top });
945 | }
946 | else
947 | {
948 | var offset = this.pow2(node.level - 1);
949 |
950 | this.node_get_field(node.nw, left, top, field);
951 | this.node_get_field(node.sw, left, top + offset, field);
952 | this.node_get_field(node.ne, left + offset, top, field);
953 | this.node_get_field(node.se, left + offset, top + offset, field);
954 | }
955 | };
956 |
957 | LifeUniverse.prototype.node_level2_next = function(node)
958 | {
959 | var nw = node.nw,
960 | ne = node.ne,
961 | sw = node.sw,
962 | se = node.se,
963 | bitmask =
964 | nw.nw.population << 15 | nw.ne.population << 14 | ne.nw.population << 13 | ne.ne.population << 12 |
965 | nw.sw.population << 11 | nw.se.population << 10 | ne.sw.population << 9 | ne.se.population << 8 |
966 | sw.nw.population << 7 | sw.ne.population << 6 | se.nw.population << 5 | se.ne.population << 4 |
967 | sw.sw.population << 3 | sw.se.population << 2 | se.sw.population << 1 | se.se.population;
968 |
969 |
970 | return this.level1_create(
971 | this.eval_mask(bitmask >> 5) |
972 | this.eval_mask(bitmask >> 4) << 1 |
973 | this.eval_mask(bitmask >> 1) << 2 |
974 | this.eval_mask(bitmask) << 3
975 | );
976 |
977 | };
978 |
979 | LifeUniverse.prototype.node_next_generation = function(node)
980 | {
981 | if(node.cache)
982 | {
983 | return node.cache;
984 | }
985 |
986 | if(this.step === node.level - 2)
987 | {
988 | return this.node_quick_next_generation(node);
989 | }
990 |
991 | if(node.level === 2)
992 | {
993 | if(node.quick_cache)
994 | {
995 | return node.quick_cache;
996 | }
997 | else
998 | {
999 | return node.quick_cache = this.node_level2_next(node);
1000 | }
1001 | }
1002 |
1003 | var nw = node.nw,
1004 | ne = node.ne,
1005 | sw = node.sw,
1006 | se = node.se,
1007 | n00 = this.create_tree(nw.nw.se, nw.ne.sw, nw.sw.ne, nw.se.nw),
1008 | n01 = this.create_tree(nw.ne.se, ne.nw.sw, nw.se.ne, ne.sw.nw),
1009 | n02 = this.create_tree(ne.nw.se, ne.ne.sw, ne.sw.ne, ne.se.nw),
1010 | n10 = this.create_tree(nw.sw.se, nw.se.sw, sw.nw.ne, sw.ne.nw),
1011 | n11 = this.create_tree(nw.se.se, ne.sw.sw, sw.ne.ne, se.nw.nw),
1012 | n12 = this.create_tree(ne.sw.se, ne.se.sw, se.nw.ne, se.ne.nw),
1013 | n20 = this.create_tree(sw.nw.se, sw.ne.sw, sw.sw.ne, sw.se.nw),
1014 | n21 = this.create_tree(sw.ne.se, se.nw.sw, sw.se.ne, se.sw.nw),
1015 | n22 = this.create_tree(se.nw.se, se.ne.sw, se.sw.ne, se.se.nw);
1016 |
1017 | return node.cache = this.create_tree(
1018 | this.node_next_generation(this.create_tree(n00, n01, n10, n11)),
1019 | this.node_next_generation(this.create_tree(n01, n02, n11, n12)),
1020 | this.node_next_generation(this.create_tree(n10, n11, n20, n21)),
1021 | this.node_next_generation(this.create_tree(n11, n12, n21, n22))
1022 | );
1023 | };
1024 |
1025 | LifeUniverse.prototype.node_quick_next_generation = function(node)
1026 | {
1027 | if(node.quick_cache !== null)
1028 | {
1029 | return node.quick_cache;
1030 | }
1031 |
1032 | if(node.level === 2)
1033 | {
1034 | return node.quick_cache = this.node_level2_next(node);
1035 | }
1036 |
1037 | var nw = node.nw,
1038 | ne = node.ne,
1039 | sw = node.sw,
1040 | se = node.se,
1041 | n00 = this.node_quick_next_generation(nw),
1042 | n01 = this.node_quick_next_generation(this.create_tree(nw.ne, ne.nw, nw.se, ne.sw)),
1043 | n02 = this.node_quick_next_generation(ne),
1044 | n10 = this.node_quick_next_generation(this.create_tree(nw.sw, nw.se, sw.nw, sw.ne)),
1045 | n11 = this.node_quick_next_generation(this.create_tree(nw.se, ne.sw, sw.ne, se.nw)),
1046 | n12 = this.node_quick_next_generation(this.create_tree(ne.sw, ne.se, se.nw, se.ne)),
1047 | n20 = this.node_quick_next_generation(sw),
1048 | n21 = this.node_quick_next_generation(this.create_tree(sw.ne, se.nw, sw.se, se.sw)),
1049 | n22 = this.node_quick_next_generation(se);
1050 |
1051 |
1052 | return node.quick_cache = this.create_tree(
1053 | this.node_quick_next_generation(this.create_tree(n00, n01, n10, n11)),
1054 | this.node_quick_next_generation(this.create_tree(n01, n02, n11, n12)),
1055 | this.node_quick_next_generation(this.create_tree(n10, n11, n20, n21)),
1056 | this.node_quick_next_generation(this.create_tree(n11, n12, n21, n22))
1057 | );
1058 | };
1059 |
1060 | LifeUniverse.prototype.node_hash = function(node)
1061 | {
1062 | if(!this.in_hashmap(node))
1063 | {
1064 | // Update the id. We have looked for an old id, as
1065 | // the the hashmap has been cleared and ids have been
1066 | // reset, but this cannot avoided without iterating
1067 | // the tree twice.
1068 | node.id = this.last_id++;
1069 | node.hashmap_next = undefined;
1070 |
1071 | if(node.level > 1)
1072 | {
1073 | this.node_hash(node.nw);
1074 | this.node_hash(node.ne);
1075 | this.node_hash(node.sw);
1076 | this.node_hash(node.se);
1077 |
1078 | if(node.cache) {
1079 | this.node_hash(node.cache);
1080 | }
1081 | if(node.quick_cache) {
1082 | this.node_hash(node.quick_cache);
1083 | }
1084 | }
1085 |
1086 | this.hashmap_insert(node);
1087 | }
1088 | };
1089 |
1090 | LifeUniverse.prototype.node_get_boundary = function(node, left, top, find_mask, boundary)
1091 | {
1092 | if(node.population === 0 || !find_mask)
1093 | {
1094 | return;
1095 | }
1096 |
1097 | if(node.level === 0)
1098 | {
1099 | if(left < boundary.left)
1100 | boundary.left = left;
1101 | if(left > boundary.right)
1102 | boundary.right = left;
1103 |
1104 | if(top < boundary.top)
1105 | boundary.top = top;
1106 | if(top > boundary.bottom)
1107 | boundary.bottom = top;
1108 | }
1109 | else
1110 | {
1111 | var offset = this.pow2(node.level - 1);
1112 |
1113 | if(left >= boundary.left && left + offset * 2 <= boundary.right &&
1114 | top >= boundary.top && top + offset * 2 <= boundary.bottom)
1115 | {
1116 | // this square is already inside the found boundary
1117 | return;
1118 | }
1119 |
1120 | var find_nw = find_mask,
1121 | find_sw = find_mask,
1122 | find_ne = find_mask,
1123 | find_se = find_mask;
1124 |
1125 | if(node.nw.population)
1126 | {
1127 | find_sw &= ~MASK_TOP;
1128 | find_ne &= ~MASK_LEFT;
1129 | find_se &= ~MASK_TOP & ~MASK_LEFT;
1130 | }
1131 | if(node.sw.population)
1132 | {
1133 | find_se &= ~MASK_LEFT;
1134 | find_nw &= ~MASK_BOTTOM;
1135 | find_ne &= ~MASK_BOTTOM & ~MASK_LEFT;
1136 | }
1137 | if(node.ne.population)
1138 | {
1139 | find_nw &= ~MASK_RIGHT;
1140 | find_se &= ~MASK_TOP;
1141 | find_sw &= ~MASK_TOP & ~MASK_RIGHT;
1142 | }
1143 | if(node.se.population)
1144 | {
1145 | find_sw &= ~MASK_RIGHT;
1146 | find_ne &= ~MASK_BOTTOM;
1147 | find_nw &= ~MASK_BOTTOM & ~MASK_RIGHT;
1148 | }
1149 |
1150 | this.node_get_boundary(node.nw, left, top, find_nw, boundary);
1151 | this.node_get_boundary(node.sw, left, top + offset, find_sw, boundary);
1152 | this.node_get_boundary(node.ne, left + offset, top, find_ne, boundary);
1153 | this.node_get_boundary(node.se, left + offset, top + offset, find_se, boundary);
1154 | }
1155 | };
1156 |
--------------------------------------------------------------------------------