Skip to content

Instantly share code, notes, and snippets.

@erantapaa
Last active September 23, 2015 22:11
Show Gist options
  • Save erantapaa/bddc4b5b7917e9acf202 to your computer and use it in GitHub Desktop.
Save erantapaa/bddc4b5b7917e9acf202 to your computer and use it in GitHub Desktop.
<html>
<body>
<script>
function toChar(ch) {
return (ch == '' ? ' ' : ch)
}
function next(grid) {
var ncols = 0;
for (var i = 0; i < grid.length; ++i) { ncols = Math.max(ncols, grid[i].length) }
var grid1 = [ "" ]
grid1 = grid1.concat(grid)
grid1.push("")
var grid2 = []
var nrows = grid.length
for (var r = 1; r <= nrows; ++r) {
var row = ""
for (var c = 0; c < ncols; ++c) {
var ch;
var nbrs = ""
for (var dr = -1; dr <= 1; ++dr) {
for (var dc = -1; dc <= 1; ++dc) {
if (dr == 0 && dc == 0) continue;
var z = toChar( grid1[r+dr].charAt(c+dc) )
if (z != ' ') {
nbrs += z
}
}
}
var a = toChar( grid1[r].charAt(c) )
var ch = (a == ' ' ? ((nbrs.length == 3)
? nbrs.charAt( Math.floor( Math.random() * nbrs.length ) )
: ' ')
: ((nbrs.length == 2 || nbrs.length == 3)
? a
: ' '))
row += ch
}
grid2.push(row)
}
return grid2
}
function nextGeneration() {
var textarea = document.getElementById("thegrid")
var content = textarea.value
var grid = next( content.split('\n') )
var ncols = 0;
for (var i = 0; i < grid.length; ++i) { ncols = Math.max(ncols, grid[i].length) }
var nrows = grid.length
textarea.value = grid.join("\n")
}
var freeRunKey;
function step() {
clearInterval(freeRunKey)
freeRunKey = null;
nextGeneration();
}
function freeRun() {
if (!freeRunKey) {
freeRunKey = setInterval(nextGeneration, 200);
}
}
function clearGrid() {
document.getElementById("thegrid").value = ""
}
</script>
<button type="button" onclick="clearGrid()">Clear</button>
<button type="button" onclick="step()">Step</button>
<button type="button" onclick="freeRun()">Run</button>
<pre>
<textarea id="thegrid" wrap="off" cols=80 rows=24 style="font-size:14px; font-family: monospace">
The quick brown fox
jumped over the lazy
dog's back.
</textarea>
</pre>
</body>
</html>
<html>
<body>
<script>
var grid = " He\nll\n o\n".split("\n")
function toChar(ch) {
return (ch == '' ? ' ' : ch)
}
function trim(grid) {
// trim leading spaces
var m = 1024
for (var i = 0; i < grid.length; ++i) {
m = Math.min(m, (/^ */.exec(grid[i]))[0].length )
}
if (m > 0) {
for (var i = 0; i < grid.length; ++i) {
grid[i] = grid[i].slice(m)
}
}
var r0;
for (r0 = 0; r0 < grid.length; ++r0) { if (/[^ ]/.test(grid[r0])) break }
var r1 = grid.length-1;
for (r1 = grid.length-1; r1 >= 0; --r1) { if (/[^ ]/.test(grid[r1])) break }
grid = grid.slice(r0,r1+1)
// trim trailing spaces
for (var i = 0; i < grid.length; ++i) {
grid[i] = grid[i].replace(/ +$/,'')
}
return grid;
}
function next(grid) {
// return the next generation
grid = trim(grid)
var ncols = 0;
for (var i = 0; i < grid.length; ++i) { ncols = Math.max(ncols, grid[i].length) }
var grid1 = [ "", "" ]
for (var i = 0; i < grid.length; ++i) {
grid1.push(" " + grid[i])
}
grid1.push(" ")
grid1.push(" ")
var grid2 = []
var nrows = 2+grid.length
for (var r = 1; r <= nrows; ++r) {
var row = ""
for (var c = 1; c <= ncols+2; ++c) {
var ch;
var nbrs = ""
for (var dr = -1; dr <= 1; ++dr) {
for (var dc = -1; dc <= 1; ++dc) {
if (dr == 0 && dc == 0) continue;
var z = toChar( grid1[r+dr].charAt(c+dc) )
if (z != ' ') {
nbrs += z
}
}
}
var a = toChar( grid1[r].charAt(c) )
if (a != ' ') { // alive
if (nbrs.length == 2 || nbrs.length == 3) {
ch = grid1[r].charAt(c)
} else {
ch = ' '
}
} else {
if (nbrs.length == 3) {
ch = nbrs.charAt( Math.floor( Math.random() * nbrs.length ) )
} else {
ch = ' '
}
}
row += ch
}
grid2.push(row)
}
return grid2
}
function nextGeneration() {
var textarea = document.getElementById("thegrid")
var content = textarea.value
var grid = next( content.split('\n') )
var ncols = 0;
for (var i = 0; i < grid.length; ++i) { ncols = Math.max(ncols, grid[i].length) }
var nrows = grid.length
textarea.value = grid.join("\n")
}
var freeRunKey;
function step() {
clearInterval(freeRunKey)
nextGeneration();
}
function freeRun() {
freeRunKey = setInterval(nextGeneration, 200);
}
</script>
<button type="button" onclick="step()">Step</button>
<button type="button" onclick="freeRun()">Run</button>
<pre>
<textarea id="thegrid" wrap="off" cols=40 rows=20 style="font-size:14px; font-family: monospace">
The quick brown fox
jumped over the lazy
dog's back.
</textarea>
</pre>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment