diff --git a/loader.rb b/loader.rb new file mode 100644 index 0000000..b17b0f4 --- /dev/null +++ b/loader.rb @@ -0,0 +1,21 @@ + +require_relative 'sudoku' + +class Loader + + def self.load(path) + grid = Array.new() + File.open(path) do |f| + 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 << line.split(" ") + 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 + + + +