├── 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 | 69 |
70 |
71 |

Conway's Game of Life in JavaScript

72 |
73 |

Sorry, this applications needs JavaScript to work.

74 |
75 | Bi Gun 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 | 115 |
116 |
117 |
118 | 119 |
120 | 151 | 168 | 187 | 193 | 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 | --------------------------------------------------------------------------------