class ILoveSudoku::Grid

Attributes

cell_matrix[R]
columns[R]
rows[R]
subgroups[R]

Public Class Methods

new(cell_matrix:, rows:, columns:, subgroups:) click to toggle source
# File lib/grid.rb, line 4
def initialize(cell_matrix:, rows:, columns:, subgroups:)
  @cell_matrix = cell_matrix
  @rows = rows
  @columns = columns
  @subgroups = subgroups
  solve!
end
new_from_matrix(matrix) click to toggle source
# File lib/grid.rb, line 12
def self.new_from_matrix(matrix)
  cell_matrix = CellMatrixCreator.new(matrix).cell_matrix
  rows = StraightLineCreator.new(cell_matrix).lines
  columns = StraightLineCreator.new(cell_matrix.transpose).lines
  subgroups = SubgroupCreator.new(cell_matrix).subgroups

  Grid.new( cell_matrix: cell_matrix,
           rows: rows,
           columns: columns,
           subgroups: subgroups )
end

Public Instance Methods

possibilities_matrix() click to toggle source
# File lib/grid.rb, line 30
def possibilities_matrix
  cell_matrix.map do |row|
    row.map { |cell| cell.possibilities }
  end
end
values_matrix() click to toggle source
# File lib/grid.rb, line 24
def values_matrix
  cell_matrix.map do |row|
    row.map { |cell| cell.value }
  end
end

Private Instance Methods

hit_all!(sym) click to toggle source
# File lib/grid.rb, line 56
def hit_all!(sym)
  send(sym).each_with_object([]) do |item, success|
    success << item.hit!
  end.any?
end
solve!() click to toggle source
# File lib/grid.rb, line 41
def solve!
  loop do

    row_progress = hit_all!(:rows)
    column_progress = hit_all!(:columns)
    subgroup_progress = hit_all!(:subgroups)

    making_progress = row_progress ||
      column_progress ||
      subgroup_progress

    break unless making_progress
  end
end