Shooting gliders at incoming spaceships!
Log in to post a comment.
Canvas.setpenopacity(-0.05); const gridSize = 100; const steps = 720; const GLIDER = [ [0, 1, 0], [1, 0, 0], [1, 1, 1], ] const LWSS = [ [0, 0, 1, 1, 0], [1, 1, 0, 1, 1], [1, 1, 1, 1, 0], [0, 1, 1, 0, 0], ] const MWSS = [ [0, 0, 0, 1, 1, 0], [1, 1, 1, 0, 1, 1], [1, 1, 1, 1, 1, 0], [0, 1, 1, 1, 0, 0], ] const HWSS = [ [0, 0, 0, 0, 1, 1, 0], [1, 1, 1, 1, 0, 1, 1], [1, 1, 1, 1, 1, 1, 0], [0, 1, 1, 1, 1, 0, 0], ] const patterns = [{ pattern: LWSS, x: 0, y: 15, },{ pattern: LWSS, x: 0, y: 72, },{ pattern: MWSS, x: 0, y: 62, },{ pattern: MWSS, x: 0, y: 35, },{ pattern: MWSS, x: 0, y: 55, },{ pattern: HWSS, x: 0, y: 85, }]; const launchPatterns = [{ pattern: GLIDER, x: 50, dx: 50, y: 0, every: 25, }] const applyPattern = (pattern, onto, lx, ly) => { for (let y = 0; y<pattern.length; y++) { for (let x = 0; x<pattern[y].length; x++) { onto[ly+y][lx+x] = Boolean(pattern[y][x]); } } } const applyPatterns = (patterns, onto) => { for (const { pattern, x: lx, y: ly } of patterns) { applyPattern(pattern, onto, lx, ly); } } // No fancy-pants bit-juggling here, we do a whole lotta lookups! let generation = new Array(gridSize).fill(0).map(y => new Array(gridSize).fill(0).map(x => false)); applyPatterns(patterns, generation) const cellSize = (200/gridSize); const turtle = new Turtle(); turtle.seth(0); function walk(i) { for (let y = 0; y < gridSize; y++) { for (let x = 0; x < gridSize; x++) { if (generation[y][x]) draw(x+1, y+1); } } generation = generation.map((y, yi, ys) => { return y.map((x, xi, xs) => { const n = countNeighbours(xi, yi, generation); if (x && n > 1 && n < 4) return true; else if (n === 3) return true; return false; }) }); for (const { pattern, x, dx = 0, y, every } of launchPatterns) { if (i > 0 && i%every===0) { applyPattern(pattern, generation, Math.floor(x-dx+2*dx*Math.random()), y); } } return i < steps; } const countNeighbours = (xi, yi, ys) => { const xs = ys[yi]; const li = xi === 0 ? xs.length-1 : xi-1; const l = xs[li]; const ri = xi === xs.length-1 ? 0 : xi+1; const r = xs[ri]; const ti = yi === 0 ? ys.length-1 : yi-1; const t = ys[ti][xi]; const bi = yi === ys.length-1 ? 0 : yi+1; const b = ys[bi][xi]; const tl = ys[ti][li]; const bl = ys[bi][li]; const br = ys[bi][ri]; const tr = ys[ti][ri]; return [l, r, t, b, tl, bl, br, tr].reduce((count, i) => i ? count + 1 : count, 0); } const draw = (_x, _y) => { const x = -100 + cellSize * _x; const y = -100 + cellSize * _y; for (let i = 0; i<cellSize-0.1; i+=0.25) { turtle.jump(-x, -y+i); turtle.forward(cellSize); } }