class Kudosu::Board

Attributes

cells[RW]

Public Class Methods

new(ary) click to toggle source
# File lib/kudosu/board.rb, line 5
def initialize(ary)
  self.cells = ary.flatten.map { |val| Cell.new(val) }
end

Public Instance Methods

boxes() click to toggle source
# File lib/kudosu/board.rb, line 31
def boxes
  sliced_cols = rows.map { |row| row.each_slice(3).to_a }.transpose
  sliced_cols.flatten.each_slice(9).to_a
end
columns() click to toggle source
# File lib/kudosu/board.rb, line 27
def columns
  rows.transpose
end
print() click to toggle source
rows() click to toggle source
# File lib/kudosu/board.rb, line 23
def rows
  cells.each_slice(9).to_a
end
shuffle() click to toggle source
# File lib/kudosu/board.rb, line 36
def shuffle
  boxes.each { |box| box.shuffle.take(rand(5..7)).each(&:reset) }
  self
end
solve() click to toggle source
# File lib/kudosu/board.rb, line 9
def solve
  board = attempt_solution || fork_board(values) until board
  self.cells = board.cells
  self
end
solved?() click to toggle source
# File lib/kudosu/board.rb, line 41
def solved?
  cells.all?(&:solved?)
end
valid?() click to toggle source
# File lib/kudosu/board.rb, line 45
def valid?
  MarkupRangeUtils.ranges_valid?(markup_ranges)
end
values() click to toggle source
# File lib/kudosu/board.rb, line 15
def values
  cells.map(&:value)
end

Protected Instance Methods

attempt_solution() click to toggle source
# File lib/kudosu/board.rb, line 55
def attempt_solution
  cells.each(&:reset_markup)

  until solved?
    MarkupRangeUtils.update_ranges_markup(markup_ranges)
    return if cells.none?(&:solve)
  end

  self
end
unsolved_cells() click to toggle source
# File lib/kudosu/board.rb, line 51
def unsolved_cells
  cells.reject(&:solved?)
end

Private Instance Methods

fork_board(values) click to toggle source
# File lib/kudosu/board.rb, line 72
def fork_board(values)
  board = Board.new(values)

  board.unsolved_cells.each do |cell|
    return board if board.attempt_solution
    cell.pick_random
    break unless board.valid?
  end

  fork_board(values)
end
markup_ranges() click to toggle source
# File lib/kudosu/board.rb, line 68
def markup_ranges
  @ranges ||= rows + columns + boxes
end