From cc79d23152447362279bdcf5400675ee6c47fbcc Mon Sep 17 00:00:00 2001 From: nadegepepin Date: Wed, 2 Apr 2014 02:12:59 +0000 Subject: [PATCH 1/2] Sudoku validator complete tested version --- loader.rb | 23 ++++++++++++++ sudoku.rb | 76 +++++++++++++++++++++++++++++++++++++++++++++ sudoku_validator.rb | 16 ++++++++++ 3 files changed, 115 insertions(+) create mode 100644 loader.rb create mode 100644 sudoku.rb create mode 100644 sudoku_validator.rb diff --git a/loader.rb b/loader.rb new file mode 100644 index 0000000..7263eba --- /dev/null +++ b/loader.rb @@ -0,0 +1,23 @@ + +require_relative 'sudoku' + +class Loader + + def self.load(path) + grid = Array.new(9){Array.new(9)} + File.open(path) do |f| + i = 0 + f.each_line do |line| + # removes the vertical separator | and replaces it with a space + line = line.gsub('|', ' ') + # the lines containing a + are horizontal separators, they are skipped + if !line.include? '+' + grid[i] = line.split(" ") + i += 1 + end + end + end + return Sudoku.new(grid) + end + +end \ No newline at end of file diff --git a/sudoku.rb b/sudoku.rb new file mode 100644 index 0000000..90a9b9c --- /dev/null +++ b/sudoku.rb @@ -0,0 +1,76 @@ +class Sudoku + + attr_reader :valid, :complete + + def initialize(grid) + @grid = grid + @complete = nil + @valid = nil + validate_grid + end + + protected + def validate_row(line_number) + line = @grid[line_number] + validate(line) + end + + def validate_column(column_number) + # we are arranging all elements of the column in a single array fot the validation + line = Array.new() + @grid.each do |l| + line << l[column_number] + end + validate(line) + end + + def validate_subgrid(subgrid_number) + # Each sudoku subgrid was assigned a subgrid_number as follow + # 0 | 1 | 2 + # 3 | 4 | 5 + # 6 | 7 | 8 + # (i,j) is the upper left element of the subgrid + i = (subgrid_number / 3) * 3 + j = (subgrid_number - i) * 3 + + # we are arranging all elements of the sub grid in a single array for the validation + line = Array.new() + for k in 0..2 + line += @grid[i+k][j..j+2] + end + validate(line) + end + + # validates wether a given array of 9 elements contains a distinct sublist of numbers from 1 to 9 + def validate(line) + check = Array.new(9) + line.each do |element| + element = element.to_i + # Any non numerical element will return 0 + if element == 0 + @complete = false + else + if check[element - 1] != nil + @valid = false + else + check[element - 1] = 1 + end + end + end + end + + def validate_grid + for i in 0..8 + validate_row(i) + validate_column(i) + validate_subgrid(i) + end + if @valid == nil + @valid = true + end + if @complete == nil + @complete = true + end + end + +end \ No newline at end of file diff --git a/sudoku_validator.rb b/sudoku_validator.rb new file mode 100644 index 0000000..82a31de --- /dev/null +++ b/sudoku_validator.rb @@ -0,0 +1,16 @@ +require_relative 'loader' +require_relative 'sudoku' + +def answer(sudoku) + answer = "This Sudoku is " + ( sudoku.valid ? "valid" : "invalid") + " and " + (sudoku.complete ? "complete" : "incomplete") + "." + puts answer +end + +ARGV.each do|a| + sudoku = Loader.load(a) + answer(sudoku) +end + + + + From 12d6111045907af21791c536a14ff740b29499a9 Mon Sep 17 00:00:00 2001 From: nadegepepin Date: Wed, 2 Apr 2014 03:32:56 +0000 Subject: [PATCH 2/2] added << to simplify the grid creation --- loader.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/loader.rb b/loader.rb index 7263eba..b17b0f4 100644 --- a/loader.rb +++ b/loader.rb @@ -4,16 +4,14 @@ class Loader def self.load(path) - grid = Array.new(9){Array.new(9)} + grid = Array.new() File.open(path) do |f| - i = 0 f.each_line do |line| # removes the vertical separator | and replaces it with a space line = line.gsub('|', ' ') # the lines containing a + are horizontal separators, they are skipped if !line.include? '+' - grid[i] = line.split(" ") - i += 1 + grid << line.split(" ") end end end