Slide 46
Slide 46 text
RUBYCONF 2020 • ARIEL CAPLAN • @AMCAPLAN •
Conway’s Game of Life
life_hash = Hash.new do |h, (x, y, step)|
h[[x, y, step]] =
if step == 0
INITIAL_STATES[[x, y]] || 0
else
neighbor_diffs = [[-1, -1], [-1, 0], [-1, 1],
[ 0, -1], [ 0, 1],
[ 1, -1], [ 1, 0], [ 1, 1]]
live_neighbors = neighbor_diffs.sum { |x_diff, y_diff|
h[[(x + x_diff) % WIDTH, (y + y_diff) % HEIGHT, step - 1]]
}
if h[[x, y, step - 1]] == 1
[2, 3].include?(live_neighbors) ? 1 : 0
else
live_neighbors == 3 ? 1 : 0
end
end
end
def life_func(x, y, step)
if step == 0
INITIAL_STATES[[x, y]] || 0
else
neighbor_diffs = [[-1, -1], [-1, 0], [-1, 1],
[ 0, -1], [ 0, 1],
[ 1, -1], [ 1, 0], [ 1, 1]]
live_neighbors = neighbor_diffs.sum { |x_diff, y_diff|
life_func((x + x_diff) % WIDTH, (y + y_diff) % HEIGHT, step - 1)
}
if life_func(x, y, step - 1) == 1
[2, 3].include?(live_neighbors) ? 1 : 0
else
live_neighbors == 3 ? 1 : 0
end
end
end