class RubyTerminalGames::Sudoku::Puzzle
Attributes
locked_positions[R]
state[R]
Public Class Methods
new()
click to toggle source
# File lib/ruby_terminal_games/sudoku/puzzle.rb, line 5 def initialize @locked_positions = [] @state = build_puzzle end
Public Instance Methods
add_input(input, user_input_index)
click to toggle source
# File lib/ruby_terminal_games/sudoku/puzzle.rb, line 10 def add_input(input, user_input_index) return if locked_position?(user_input_index) input = nil if input.zero? previous = state[user_input_index] @state[user_input_index] = input return true if valid? @state[user_input_index] = previous false end
locked_position?(user_input_index)
click to toggle source
# File lib/ruby_terminal_games/sudoku/puzzle.rb, line 20 def locked_position?(user_input_index) locked_positions.include?(user_input_index) end
Private Instance Methods
build_puzzle()
click to toggle source
# File lib/ruby_terminal_games/sudoku/puzzle.rb, line 36 def build_puzzle puzzle_string.chars.each_with_index.map do |char, index| number = char.to_i @locked_positions << index unless number.zero? number.zero? ? nil : number end end
columns()
click to toggle source
# File lib/ruby_terminal_games/sudoku/puzzle.rb, line 76 def columns (0..8).map do |i| (0..9).map do |n| state[n*9 + i] end end end
puzzle_string()
click to toggle source
# File lib/ruby_terminal_games/sudoku/puzzle.rb, line 26 def puzzle_string path = File.expand_path( File.join(File.dirname(__FILE__), "puzzles.txt")) File.readlines(path) .map { |line| line.strip }.reject { |w| w.empty? }.sample end
rows()
click to toggle source
# File lib/ruby_terminal_games/sudoku/puzzle.rb, line 69 def rows (0..8).map do |i| start = i * 9 (start..start+8).map { |j| state[j] } end end
squares()
click to toggle source
# File lib/ruby_terminal_games/sudoku/puzzle.rb, line 84 def squares [ [0, 1, 2], [3, 4, 5], [6, 7, 8], [27, 28, 29], [30, 31, 32], [33, 34, 35], [54, 55, 56], [57, 58, 59], [60, 61, 62] ].map do |group| group.map { |i| [0, 9, 18].map { |j| state[i + j] }.flatten }.flatten end end
valid?()
click to toggle source
# File lib/ruby_terminal_games/sudoku/puzzle.rb, line 44 def valid? valid_rows? && valid_columns? && valid_squares? end
valid_columns?()
click to toggle source
# File lib/ruby_terminal_games/sudoku/puzzle.rb, line 55 def valid_columns? columns.each do |col| return false if col.compact.size != col.compact.uniq.size end true end
valid_rows?()
click to toggle source
# File lib/ruby_terminal_games/sudoku/puzzle.rb, line 48 def valid_rows? rows.each do |row| return false if row.compact.size != row.compact.uniq.size end true end
valid_squares?()
click to toggle source
# File lib/ruby_terminal_games/sudoku/puzzle.rb, line 62 def valid_squares? squares.each do |square| return false if square.compact.size != square.compact.uniq.size end true end