require "forwardable" require_relative "cell" class Grid attr_reader :columns extend Forwardable def_delegators :@data, :size, :[] def initialize(input) @data = [] (0...input.size).each do |row_index| row = [] (0...input[row_index].size).each do |column_index| cell = Cell.new(row_index, column_index) cell.value = input[row_index][column_index] row << cell end @data << row end # Link neighbours (0...@data.size).each do |row_index| (0...@data[row_index].size).each do |column_index| cell = @data[row_index][column_index] cell.n = @data[row_index - 1][column_index] if row_index - 1 >= 0 cell.ne = @data[row_index - 1][column_index + 1] if row_index - 1 >= 0 && column_index + 1 < @data[row_index - 1].size cell.e = @data[row_index][column_index + 1] if column_index + 1 < @data[row_index].size cell.se = @data[row_index + 1][column_index + 1] if row_index + 1 < @data.size && column_index + 1 < @data[row_index + 1].size cell.s = @data[row_index + 1][column_index] if row_index + 1 < @data.size cell.sw = @data[row_index + 1][column_index - 1] if row_index + 1 < @data.size && column_index - 1 >= 0 cell.w = @data[row_index][column_index - 1] if column_index - 1 >= 0 cell.nw = @data[row_index - 1][column_index - 1] if row_index - 1 >= 0 && column_index - 1 >= 0 end end end def cell_at(row, column) @data[row][column] end end