class SudokuSolver::Table

Public Class Methods

new(rows) click to toggle source
# File lib/sudoku_solver/table.rb, line 3
def initialize(rows)
  @data = Array.new(9) { Array.new(9, nil) }
  rows.each_with_index do |row, row_index|
    row.each_with_index do |element, col_index|
      @data[row_index][col_index] = element
    end
  end
end

Public Instance Methods

apply(variable, value) click to toggle source
# File lib/sudoku_solver/table.rb, line 26
def apply(variable, value)
  @data[variable.row][variable.col] = value
end
build_brute_force_corpus() click to toggle source
# File lib/sudoku_solver/table.rb, line 12
def build_brute_force_corpus
  corpus = BruteForceCorpus.new
  (0..8).each do |row|
    (0..8).each do |col|
      if @data[row][col] == nil
        corpus.add_variable(row, col)
      else
        corpus.acquire(Variable.new(row, col, corpus), @data[row][col])
      end
    end
  end
  corpus
end
final_state?() click to toggle source
# File lib/sudoku_solver/table.rb, line 30
def final_state?
  # check if every row is valid
  (0..8).each do |row|
    elements = []
    (0..8).each do |col|
      elements << @data[row][col]
    end
    return false unless valid?(elements)
  end

  # check if every column is valid
  (0..8).each do |col|
    elements = []
    (0..8).each do |row|
      elements << @data[row][col]
    end
    return false unless valid?(elements)
  end

  # check if every square is valid
  (0..2).each do |sq_row|
    (0..2).each do |sq_col|
      elements = []
      (0..2).each do |row|
        (0..2).each do |col|
          elements << @data[sq_row * 3 + row][sq_col * 3 + col]
        end
      end
      return false unless valid?(elements)
    end
  end
  return true
end
to_a() click to toggle source
# File lib/sudoku_solver/table.rb, line 64
def to_a
  @data
end

Private Instance Methods

valid?(elements) click to toggle source
# File lib/sudoku_solver/table.rb, line 69
def valid?(elements)
  masks = Array.new(9, nil)
  elements.each do |element|
    return false if element == nil || masks[element - 1] != nil
    masks[element - 1] = 1
  end
  return true
end