require_relative "cell" class Grid attr_reader :rows, :columns def initialize(input) @rows = [] (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 @rows << row end @columns = @rows.transpose # Link neighbours (0...@rows.size).each do |row_index| (0...@columns.size).each do |column_index| cell = @rows[row_index][column_index] cell.n = @rows[row_index - 1][column_index] if row_index - 1 >= 0 cell.ne = @rows[row_index - 1][column_index + 1] if row_index - 1 >= 0 && column_index + 1 < @columns.size cell.e = @rows[row_index][column_index + 1] if column_index + 1 < @columns.size cell.se = @rows[row_index + 1][column_index + 1] if row_index + 1 < @rows.size && column_index + 1 < @columns.size cell.s = @rows[row_index + 1][column_index] if row_index + 1 < @rows.size cell.sw = @rows[row_index + 1][column_index - 1] if row_index + 1 < @rows.size && column_index - 1 >= 0 cell.w = @rows[row_index][column_index - 1] if column_index - 1 >= 0 cell.nw = @rows[row_index - 1][column_index - 1] if row_index - 1 >= 0 && column_index - 1 >= 0 end end end def cell_at(row, column) @rows[row][column] end end