Skip to content

Instantly share code, notes, and snippets.

@samaaron
Created March 5, 2010 15:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save samaaron/322802 to your computer and use it in GitHub Desktop.
Save samaaron/322802 to your computer and use it in GitHub Desktop.
GameOfLife = Origin mimic do(
initialize = method(rows:, columns:,
@grid = Grid withDimensions(rows, columns))
evolve = method(
nextGrid = @grid blankGrid
@grid seq each(cellInfo,
if(#{2,3} include?(cellInfo numLiveNeighbours), nextGrid spawnCell(cellInfo coords first, cellInfo coords second)))
@grid = nextGrid
)
spawn = method(row, col,
@grid spawn(row, col)
@grid)
)
GameOfLife Grid = Origin mimic do(
Cell = Origin mimic
withDimensions = method(rows, columns,
self with(
state: Dict withDefault(0),
numCols: columns,
maxRowIdx: rows - 1,
maxColIdx: columns - 1
)
)
blankGrid = method(self with(state: Dict withDefault(0)))
spawnCell = method(row, col, @state[[row, col]] = 1)
seq = macro(allCells seq)
;internal methods
permutations = method(a, b, a flatMap(i, b map(j, (i,j))))
countLiveNeighbours = method("Count the number of live neighbours for a given set of cell coordinates",
row, col,
neighbourCoords = permutations((-1..1), (-1..1)) - [(0,0)]
neighbourCoords inject(0, sum, (r_mod,c_mod), @state[[row + r_mod, col + c_mod]] + sum))
allCellCoords = method("Generate a list tuples representing all the coordinates of the cells in the Grid",
permutations(0..@maxRowIdx, 0..@maxColIdx))
allCells = method("Generate a list of all the cells in the Grid consisting of coordinates and number of live neighbours",
allCellCoords map((row, col), Cell with(coords: (row, col), numLiveNeighbours: countLiveNeighbours(row, col))))
;for output purposes
asList = method("Returns the list of cells as a list of 0s and 1s, with 1 representing a live cell",
rowsOfCoords = allCellCoords seq sliced(@numCols)
cellList = []
while(rowsOfCoords next?, cellList << (rowsOfCoords next map((row, col), @state[[row,col]]))))
asText = method("Returns the list of cells in a pretty ascii art representation",
"\n+-#{"--" * (@numCols)}+\n| #{asList map(map(i, if(i == 0, " ", "* ")) join) join("|\n| ")}|\n+-#{"--" * (@numCols)}+")
)
System ifMain(
life = GameOfLife mimic(rows: 5, columns: 6)
life grid spawnCell(1,0)
life grid spawnCell(1,1)
life grid spawnCell(1,2)
life grid spawnCell(1,3)
life grid spawnCell(1,4)
life grid spawnCell(1,5)
life grid asText println
10 times(life evolve asText println)
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment