From 1ce2edc8852922a06c7d0302bc0315535446e18e Mon Sep 17 00:00:00 2001 From: ankur kothari Date: Sun, 22 Dec 2013 15:46:48 +0530 Subject: [PATCH 1/5] Added SudokuParser for taking in the sudoku file and converting it into a proper data structure --- .rspec | 3 ++ .swp | Bin 0 -> 4096 bytes Gemfile | 6 ++++ Gemfile.lock | 55 ++++++++++++++++++++++++++++++++++ Guardfile | 14 +++++++++ lib/sudoku_parser.rb | 26 ++++++++++++++++ lib/sudoku_validator.rb | 53 ++++++++++++++++++++++++++++++++ one_row.sudoku | 2 ++ spec/spec_helper.rb | 15 ++++++++++ spec/sudoku_parser_spec.rb | 17 +++++++++++ spec/sudoku_validator_spec.rb | 14 +++++++++ two_row.sudoku | 1 + 12 files changed, 206 insertions(+) create mode 100644 .rspec create mode 100644 .swp create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 Guardfile create mode 100644 lib/sudoku_parser.rb create mode 100644 lib/sudoku_validator.rb create mode 100644 one_row.sudoku create mode 100644 spec/spec_helper.rb create mode 100644 spec/sudoku_parser_spec.rb create mode 100644 spec/sudoku_validator_spec.rb create mode 100644 two_row.sudoku diff --git a/.rspec b/.rspec new file mode 100644 index 0000000..094498c --- /dev/null +++ b/.rspec @@ -0,0 +1,3 @@ +--color +--drb +--format documentation diff --git a/.swp b/.swp new file mode 100644 index 0000000000000000000000000000000000000000..1e37e18c9340ddb662a20f4eeede907a94343dfc GIT binary patch literal 4096 zcmYc?2=nw+FxN9?00IFJ0Ra`fj0}kd1v#lO0X(!LNL{h6Z(_1jetx!YKvBM4PJVJ? z4jwI|QllX-8Ul0=0nSikBSQm_waQA03c^C6ba%n1g`*)b8UmvsFd71*Aut*OqaiRF N0;3@?8Uh0s0sscz56A!j literal 0 HcmV?d00001 diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..87f5932 --- /dev/null +++ b/Gemfile @@ -0,0 +1,6 @@ +source 'https://rubygems.org' +ruby '2.0.0' + +gem "rspec", "~> 2.14.1" +gem 'guard-spork' +gem 'terminal-notifier-guard' diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..5429edb --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,55 @@ +GEM + remote: https://rubygems.org/ + specs: + celluloid (0.15.2) + timers (~> 1.1.0) + childprocess (0.3.9) + ffi (~> 1.0, >= 1.0.11) + coderay (1.1.0) + diff-lcs (1.2.5) + ffi (1.9.3) + formatador (0.2.4) + guard (2.2.5) + formatador (>= 0.2.4) + listen (~> 2.1) + lumberjack (~> 1.0) + pry (>= 0.9.12) + thor (>= 0.18.1) + guard-spork (1.5.0) + childprocess (>= 0.2.3) + guard (>= 1.1) + spork (>= 0.8.4) + listen (2.4.0) + celluloid (>= 0.15.2) + rb-fsevent (>= 0.9.3) + rb-inotify (>= 0.9) + lumberjack (1.0.4) + method_source (0.8.2) + pry (0.9.12.4) + coderay (~> 1.0) + method_source (~> 0.8) + slop (~> 3.4) + rb-fsevent (0.9.3) + rb-inotify (0.9.3) + ffi (>= 0.5.0) + rspec (2.14.1) + rspec-core (~> 2.14.0) + rspec-expectations (~> 2.14.0) + rspec-mocks (~> 2.14.0) + rspec-core (2.14.7) + rspec-expectations (2.14.4) + diff-lcs (>= 1.1.3, < 2.0) + rspec-mocks (2.14.4) + slop (3.4.7) + spork (1.0.0rc4) + terminal-notifier-guard (1.5.3) + thor (0.18.1) + timers (1.1.0) + +PLATFORMS + ruby + +DEPENDENCIES + guard-spork + rspec (~> 2.14.1) + terminal-notifier-guard diff --git a/Guardfile b/Guardfile new file mode 100644 index 0000000..f3ab131 --- /dev/null +++ b/Guardfile @@ -0,0 +1,14 @@ +# A sample Guardfile +# More info at https://github.com/guard/guard#readme + +guard 'spork', :cucumber_env => { 'RAILS_ENV' => 'test' }, :rspec_env => { 'RAILS_ENV' => 'test' } do + watch('Gemfile') + watch('lib/sudoku_validator.rb') + watch('spec/sudoku_validator_spec.rb') + watch('spec/spec_helper.rb') { :rspec } + +end + +guard 'rspec', all_after_pass: false do +end + diff --git a/lib/sudoku_parser.rb b/lib/sudoku_parser.rb new file mode 100644 index 0000000..4f53fde --- /dev/null +++ b/lib/sudoku_parser.rb @@ -0,0 +1,26 @@ +class SudokuParser + def initialize(file) + @file = File.new(file, "r") + @sudoku_array = [] + end + + def parse + sudoku_string = "" + counter = 1 + while (line = @file.gets) + line = remove_bars(line) + sudoku_string += line + end + @sudoku_array = convert_string_to_array(sudoku_string) + @sudoku_array = @sudoku_array.collect{|i| i.to_i} + @file.close + @sudoku_array + end + + def remove_bars(line) + line.gsub('|', '') + end + def convert_string_to_array(string) + string.split(' ') + end +end \ No newline at end of file diff --git a/lib/sudoku_validator.rb b/lib/sudoku_validator.rb new file mode 100644 index 0000000..7b73e51 --- /dev/null +++ b/lib/sudoku_validator.rb @@ -0,0 +1,53 @@ +class SudokuValidator + def initialize(sudoku = [][]) + @sudoku = sudoku + @rows = get_rows + @columns = get_columns + @grids = get_grids + end + + def get_rows + end + + def get_columns + end + + def get_grids + end + + def validate_rows + @rows.each do |row| + validate_row(row) + end + end + + def validate_row(row) + + end + + def validate_column(column) + end + + def validate_grid(grid) + end + + def validate_columns + @columns.each do |column| + validate_column(column) + end + end + + def validate_grids + @grids.each do |grid| + validate_grid(grid) + end + end + + def validate + if validate_rows && validate_columns && validate_grids + "This sudoku is valid." + else + "This sudoku is invalid." + end + end +end \ No newline at end of file diff --git a/one_row.sudoku b/one_row.sudoku new file mode 100644 index 0000000..879a438 --- /dev/null +++ b/one_row.sudoku @@ -0,0 +1,2 @@ +8 5 9 |6 1 2 |4 3 7 +7 2 3 |8 5 4 |1 6 9 \ No newline at end of file diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 0000000..2eb5722 --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,15 @@ +require 'rubygems' +require 'spork' + +Spork.prefork do + ENV["RAILS_ENV"] ||= 'test' + require 'rspec/autorun' + + RSpec.configure do |config| + end +end + +Spork.each_run do + # This code will be run each time you run your specs. + +end diff --git a/spec/sudoku_parser_spec.rb b/spec/sudoku_parser_spec.rb new file mode 100644 index 0000000..0e35694 --- /dev/null +++ b/spec/sudoku_parser_spec.rb @@ -0,0 +1,17 @@ +require 'spec_helper' +require_relative '../lib/sudoku_parser' +describe SudokuParser do + context "#parse" do + it "returns the sudoku in an array" do + parser = SudokuParser.new('one_row.sudoku') + result = parser.parse + result.should eq([8,5, 9, 6, 1, 2, 4, 3, 7 ]) + end + + it "returns the sudoku in an array" do + parser = SudokuParser.new('one_row.sudoku') + result = parser.parse + result.should eq([[8,5, 9, 6, 1, 2, 4, 3, 7 ],[7 ,2, 3 ,8, 5, 4, 1, 6, 9]]) + end + end +end \ No newline at end of file diff --git a/spec/sudoku_validator_spec.rb b/spec/sudoku_validator_spec.rb new file mode 100644 index 0000000..dcf1360 --- /dev/null +++ b/spec/sudoku_validator_spec.rb @@ -0,0 +1,14 @@ +require 'spec_helper' +require_relative '../lib/sudoku_validator' +require_relative '../lib/sudoku_parser' +describe SudokuValidator do + context "#validate" do + it "validates sudoku" do + parser = SudokuParser.new('../valid_incomplete.sudoku') + sudoku_in_multidimensional_array = parser.parse + validator = SudokuValidator.new(sudoku_in_multidimensional_array) + result = validator.validate + result.should eq("This sudoku is valid.") + end + end +end \ No newline at end of file diff --git a/two_row.sudoku b/two_row.sudoku new file mode 100644 index 0000000..16af82c --- /dev/null +++ b/two_row.sudoku @@ -0,0 +1 @@ +8 5 9 |6 1 2 |4 3 7 \ No newline at end of file From 17bb8e47f82ebc5274314774169def34551c95fb Mon Sep 17 00:00:00 2001 From: ankur kothari Date: Sun, 22 Dec 2013 16:10:05 +0530 Subject: [PATCH 2/5] Wrote the specs for sudoku_parser.rb --- lib/sudoku_parser.rb | 5 ++--- one_row.sudoku | 1 - spec/sudoku_parser_spec.rb | 28 ++++++++++++++++++++++++---- three_row.sudoku | 4 ++++ two_row.sudoku | 3 ++- 5 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 three_row.sudoku diff --git a/lib/sudoku_parser.rb b/lib/sudoku_parser.rb index 4f53fde..0f4c07c 100644 --- a/lib/sudoku_parser.rb +++ b/lib/sudoku_parser.rb @@ -8,11 +8,10 @@ def parse sudoku_string = "" counter = 1 while (line = @file.gets) + next if line.index('-') line = remove_bars(line) - sudoku_string += line + @sudoku_array << convert_string_to_array(line).collect{|i| i.to_i} end - @sudoku_array = convert_string_to_array(sudoku_string) - @sudoku_array = @sudoku_array.collect{|i| i.to_i} @file.close @sudoku_array end diff --git a/one_row.sudoku b/one_row.sudoku index 879a438..b512a45 100644 --- a/one_row.sudoku +++ b/one_row.sudoku @@ -1,2 +1 @@ 8 5 9 |6 1 2 |4 3 7 -7 2 3 |8 5 4 |1 6 9 \ No newline at end of file diff --git a/spec/sudoku_parser_spec.rb b/spec/sudoku_parser_spec.rb index 0e35694..bd8750d 100644 --- a/spec/sudoku_parser_spec.rb +++ b/spec/sudoku_parser_spec.rb @@ -2,16 +2,36 @@ require_relative '../lib/sudoku_parser' describe SudokuParser do context "#parse" do - it "returns the sudoku in an array" do + it "returns the one row sudoku in an array" do parser = SudokuParser.new('one_row.sudoku') result = parser.parse - result.should eq([8,5, 9, 6, 1, 2, 4, 3, 7 ]) + result.should eq([[8,5, 9, 6, 1, 2, 4, 3, 7 ]]) end - it "returns the sudoku in an array" do - parser = SudokuParser.new('one_row.sudoku') + it "returns the two sudoku in an array" do + parser = SudokuParser.new('two_row.sudoku') result = parser.parse result.should eq([[8,5, 9, 6, 1, 2, 4, 3, 7 ],[7 ,2, 3 ,8, 5, 4, 1, 6, 9]]) end + + it "returns the three sudoku in an array" do + parser = SudokuParser.new('three_row.sudoku') + result = parser.parse + result.should eq([[8,5, 9, 6, 1, 2, 4, 3, 7 ],[7 ,2, 3 ,8, 5, 4, 1, 6, 9],[1, 6, 4, 3, 7, 9, 5, 2, 8 ]]) + end + + it "returns the full sudoku in an array" do + parser = SudokuParser.new('valid_complete.sudoku') + result = parser.parse + result.should eq([[8, 5, 9, 6, 1, 2, 4, 3, 7], + [7, 2, 3, 8, 5, 4, 1, 6, 9], + [1, 6, 4, 3, 7, 9, 5, 2, 8], + [9, 8, 6, 1, 4, 7, 3, 5, 2], + [3, 7, 5, 2, 6, 8, 9, 1, 4], + [2, 4, 1, 5, 9, 3, 7, 8, 6], + [4, 3, 2, 9, 8, 1, 6, 7, 5], + [6, 1, 7, 4, 2, 5, 8, 9, 3], + [5, 9, 8, 7, 3, 6, 2, 4, 1]]) + end end end \ No newline at end of file diff --git a/three_row.sudoku b/three_row.sudoku new file mode 100644 index 0000000..d6b5207 --- /dev/null +++ b/three_row.sudoku @@ -0,0 +1,4 @@ +8 5 9 |6 1 2 |4 3 7 +7 2 3 |8 5 4 |1 6 9 +1 6 4 |3 7 9 |5 2 8 +------+------+------ \ No newline at end of file diff --git a/two_row.sudoku b/two_row.sudoku index 16af82c..879a438 100644 --- a/two_row.sudoku +++ b/two_row.sudoku @@ -1 +1,2 @@ -8 5 9 |6 1 2 |4 3 7 \ No newline at end of file +8 5 9 |6 1 2 |4 3 7 +7 2 3 |8 5 4 |1 6 9 \ No newline at end of file From f466c1b68e1b0fb5fe5ced15bf0743f4217c56d4 Mon Sep 17 00:00:00 2001 From: ankur kothari Date: Sun, 22 Dec 2013 16:36:44 +0530 Subject: [PATCH 3/5] Completed the validatiof compelete rows --- examples/one_row.sudoku | 1 + examples/three_row.sudoku | 4 ++++ examples/two_row.sudoku | 2 ++ lib/sudoku_parser.rb | 7 +++---- lib/sudoku_validator.rb | 30 +++++++++++++++++++++++++----- spec/sudoku_parser_spec.rb | 8 ++++---- spec/sudoku_validator_spec.rb | 28 ++++++++++++++++++++++++++-- 7 files changed, 65 insertions(+), 15 deletions(-) create mode 100644 examples/one_row.sudoku create mode 100644 examples/three_row.sudoku create mode 100644 examples/two_row.sudoku diff --git a/examples/one_row.sudoku b/examples/one_row.sudoku new file mode 100644 index 0000000..b512a45 --- /dev/null +++ b/examples/one_row.sudoku @@ -0,0 +1 @@ +8 5 9 |6 1 2 |4 3 7 diff --git a/examples/three_row.sudoku b/examples/three_row.sudoku new file mode 100644 index 0000000..d6b5207 --- /dev/null +++ b/examples/three_row.sudoku @@ -0,0 +1,4 @@ +8 5 9 |6 1 2 |4 3 7 +7 2 3 |8 5 4 |1 6 9 +1 6 4 |3 7 9 |5 2 8 +------+------+------ \ No newline at end of file diff --git a/examples/two_row.sudoku b/examples/two_row.sudoku new file mode 100644 index 0000000..879a438 --- /dev/null +++ b/examples/two_row.sudoku @@ -0,0 +1,2 @@ +8 5 9 |6 1 2 |4 3 7 +7 2 3 |8 5 4 |1 6 9 \ No newline at end of file diff --git a/lib/sudoku_parser.rb b/lib/sudoku_parser.rb index 0f4c07c..248be95 100644 --- a/lib/sudoku_parser.rb +++ b/lib/sudoku_parser.rb @@ -1,19 +1,18 @@ class SudokuParser def initialize(file) @file = File.new(file, "r") - @sudoku_array = [] end def parse - sudoku_string = "" + sudoku_array = [] counter = 1 while (line = @file.gets) next if line.index('-') line = remove_bars(line) - @sudoku_array << convert_string_to_array(line).collect{|i| i.to_i} + sudoku_array << convert_string_to_array(line).collect{|i| i.to_i} end @file.close - @sudoku_array + sudoku_array end def remove_bars(line) diff --git a/lib/sudoku_validator.rb b/lib/sudoku_validator.rb index 7b73e51..f28f618 100644 --- a/lib/sudoku_validator.rb +++ b/lib/sudoku_validator.rb @@ -1,5 +1,5 @@ class SudokuValidator - def initialize(sudoku = [][]) + def initialize(sudoku = []) @sudoku = sudoku @rows = get_rows @columns = get_columns @@ -7,39 +7,59 @@ def initialize(sudoku = [][]) end def get_rows + @sudoku end def get_columns + [] end def get_grids + [] end def validate_rows @rows.each do |row| - validate_row(row) + if validate_row(row) + next + else + return false + end + return true end end def validate_row(row) - + row.collect{|i| i.to_i}.sort.join == "123456789" end def validate_column(column) + column.collect{|i| i.to_i}.sort.join == "" end def validate_grid(grid) + grid.collect{|i| i.to_i}.sort.join == "" end def validate_columns @columns.each do |column| - validate_column(column) + if validate_column(column) + next + else + return false + end + return true end end def validate_grids @grids.each do |grid| - validate_grid(grid) + if validate_grid(grid) + next + else + return false + end + return true end end diff --git a/spec/sudoku_parser_spec.rb b/spec/sudoku_parser_spec.rb index bd8750d..2b2105e 100644 --- a/spec/sudoku_parser_spec.rb +++ b/spec/sudoku_parser_spec.rb @@ -3,19 +3,19 @@ describe SudokuParser do context "#parse" do it "returns the one row sudoku in an array" do - parser = SudokuParser.new('one_row.sudoku') + parser = SudokuParser.new('examples/one_row.sudoku') result = parser.parse result.should eq([[8,5, 9, 6, 1, 2, 4, 3, 7 ]]) end it "returns the two sudoku in an array" do - parser = SudokuParser.new('two_row.sudoku') + parser = SudokuParser.new('examples/two_row.sudoku') result = parser.parse - result.should eq([[8,5, 9, 6, 1, 2, 4, 3, 7 ],[7 ,2, 3 ,8, 5, 4, 1, 6, 9]]) + result.should eq([[8, 5, 9, 6, 1, 2, 4, 3, 7 ],[7 ,2, 3 ,8, 5, 4, 1, 6, 9]]) end it "returns the three sudoku in an array" do - parser = SudokuParser.new('three_row.sudoku') + parser = SudokuParser.new('examples/three_row.sudoku') result = parser.parse result.should eq([[8,5, 9, 6, 1, 2, 4, 3, 7 ],[7 ,2, 3 ,8, 5, 4, 1, 6, 9],[1, 6, 4, 3, 7, 9, 5, 2, 8 ]]) end diff --git a/spec/sudoku_validator_spec.rb b/spec/sudoku_validator_spec.rb index dcf1360..de9b9fe 100644 --- a/spec/sudoku_validator_spec.rb +++ b/spec/sudoku_validator_spec.rb @@ -3,8 +3,32 @@ require_relative '../lib/sudoku_parser' describe SudokuValidator do context "#validate" do - it "validates sudoku" do - parser = SudokuParser.new('../valid_incomplete.sudoku') + it "validates one row" do + parser = SudokuParser.new('examples/one_row.sudoku') + sudoku_in_multidimensional_array = parser.parse + validator = SudokuValidator.new(sudoku_in_multidimensional_array) + result = validator.validate + result.should eq("This sudoku is valid.") + end + + it "validates two row" do + parser = SudokuParser.new('examples/two_row.sudoku') + sudoku_in_multidimensional_array = parser.parse + validator = SudokuValidator.new(sudoku_in_multidimensional_array) + result = validator.validate + result.should eq("This sudoku is valid.") + end + + it "validates three row" do + parser = SudokuParser.new('examples/two_row.sudoku') + sudoku_in_multidimensional_array = parser.parse + validator = SudokuValidator.new(sudoku_in_multidimensional_array) + result = validator.validate + result.should eq("This sudoku is valid.") + end + + it "validates complete sudoku rows" do + parser = SudokuParser.new('valid_complete.sudoku') sudoku_in_multidimensional_array = parser.parse validator = SudokuValidator.new(sudoku_in_multidimensional_array) result = validator.validate From b5c274b933b8f9c9e7c0584a88e0d4c4d75dec39 Mon Sep 17 00:00:00 2001 From: ankur kothari Date: Sun, 22 Dec 2013 16:51:59 +0530 Subject: [PATCH 4/5] replacing the empty values in the sudoku with zeros --- examples/one_row_invalid.sudoku | 1 + examples/three_row_incomplete.sudoku | 4 ++++ examples/three_row_invalid.sudoku | 4 ++++ lib/sudoku_validator.rb | 4 ++-- spec/sudoku_parser_spec.rb | 20 ++++++++++++++++ spec/sudoku_validator_spec.rb | 34 ++++++++++++++++++++++++---- 6 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 examples/one_row_invalid.sudoku create mode 100644 examples/three_row_incomplete.sudoku create mode 100644 examples/three_row_invalid.sudoku diff --git a/examples/one_row_invalid.sudoku b/examples/one_row_invalid.sudoku new file mode 100644 index 0000000..d38254d --- /dev/null +++ b/examples/one_row_invalid.sudoku @@ -0,0 +1 @@ +8 5 9 |6 1 2 |4 3 3 diff --git a/examples/three_row_incomplete.sudoku b/examples/three_row_incomplete.sudoku new file mode 100644 index 0000000..b650a03 --- /dev/null +++ b/examples/three_row_incomplete.sudoku @@ -0,0 +1,4 @@ +8 5 . |. . 2 |4 . . +7 2 3 |8 5 4 |1 6 9 +1 6 4 |3 7 9 |5 2 8 +------+------+------ \ No newline at end of file diff --git a/examples/three_row_invalid.sudoku b/examples/three_row_invalid.sudoku new file mode 100644 index 0000000..000b836 --- /dev/null +++ b/examples/three_row_invalid.sudoku @@ -0,0 +1,4 @@ +8 5 9 |6 1 2 |4 3 7 +7 2 3 |8 5 4 |1 6 9 +1 6 4 |3 7 9 |5 2 2 +------+------+------ \ No newline at end of file diff --git a/lib/sudoku_validator.rb b/lib/sudoku_validator.rb index f28f618..290bb19 100644 --- a/lib/sudoku_validator.rb +++ b/lib/sudoku_validator.rb @@ -30,7 +30,7 @@ def validate_rows end def validate_row(row) - row.collect{|i| i.to_i}.sort.join == "123456789" + row.collect{|i| i.to_i}.sort.join == "123456789" end def validate_column(column) @@ -46,7 +46,7 @@ def validate_columns if validate_column(column) next else - return false + return false end return true end diff --git a/spec/sudoku_parser_spec.rb b/spec/sudoku_parser_spec.rb index 2b2105e..0c55c47 100644 --- a/spec/sudoku_parser_spec.rb +++ b/spec/sudoku_parser_spec.rb @@ -20,6 +20,12 @@ result.should eq([[8,5, 9, 6, 1, 2, 4, 3, 7 ],[7 ,2, 3 ,8, 5, 4, 1, 6, 9],[1, 6, 4, 3, 7, 9, 5, 2, 8 ]]) end + it "returns the three incomplete row sudoku in an array by replacing empty values with zero" do + parser = SudokuParser.new('examples/three_row_incomplete.sudoku') + result = parser.parse + result.should eq([[8, 5, 0, 0, 0, 2, 4, 0, 0], [7, 2, 3, 8, 5, 4, 1, 6, 9], [1, 6, 4, 3, 7, 9, 5, 2, 8]]) + end + it "returns the full sudoku in an array" do parser = SudokuParser.new('valid_complete.sudoku') result = parser.parse @@ -33,5 +39,19 @@ [6, 1, 7, 4, 2, 5, 8, 9, 3], [5, 9, 8, 7, 3, 6, 2, 4, 1]]) end + + it "returns the full incomplete sudoku in an array" do + parser = SudokuParser.new('valid_incomplete.sudoku') + result = parser.parse + result.should eq([[8, 5, 0, 0, 0, 2, 4, 0, 0], + [7, 2, 0, 0, 0, 0, 0, 0, 9], + [0, 0, 4, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 1, 0, 7, 0, 0, 2], + [3, 0, 5, 0, 0, 0, 9, 0, 0], + [0, 4, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 8, 0, 0, 7, 0], + [0, 1, 7, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 3, 6, 0, 4, 0]]) + end end end \ No newline at end of file diff --git a/spec/sudoku_validator_spec.rb b/spec/sudoku_validator_spec.rb index de9b9fe..45ed44c 100644 --- a/spec/sudoku_validator_spec.rb +++ b/spec/sudoku_validator_spec.rb @@ -3,7 +3,7 @@ require_relative '../lib/sudoku_parser' describe SudokuValidator do context "#validate" do - it "validates one row" do + it "validates one row valid" do parser = SudokuParser.new('examples/one_row.sudoku') sudoku_in_multidimensional_array = parser.parse validator = SudokuValidator.new(sudoku_in_multidimensional_array) @@ -11,7 +11,7 @@ result.should eq("This sudoku is valid.") end - it "validates two row" do + it "validates two row valid" do parser = SudokuParser.new('examples/two_row.sudoku') sudoku_in_multidimensional_array = parser.parse validator = SudokuValidator.new(sudoku_in_multidimensional_array) @@ -19,20 +19,44 @@ result.should eq("This sudoku is valid.") end - it "validates three row" do - parser = SudokuParser.new('examples/two_row.sudoku') + it "validates three row valid" do + parser = SudokuParser.new('examples/three_row.sudoku') sudoku_in_multidimensional_array = parser.parse validator = SudokuValidator.new(sudoku_in_multidimensional_array) result = validator.validate result.should eq("This sudoku is valid.") end - it "validates complete sudoku rows" do + it "validates one row invalid" do + parser = SudokuParser.new('examples/one_row_invalid.sudoku') + sudoku_in_multidimensional_array = parser.parse + validator = SudokuValidator.new(sudoku_in_multidimensional_array) + result = validator.validate + result.should eq("This sudoku is invalid.") + end + + it "validates one three invalid" do + parser = SudokuParser.new('examples/three_row_invalid.sudoku') + sudoku_in_multidimensional_array = parser.parse + validator = SudokuValidator.new(sudoku_in_multidimensional_array) + result = validator.validate + result.should eq("This sudoku is invalid.") + end + + it "validates complete valid sudoku rows" do parser = SudokuParser.new('valid_complete.sudoku') sudoku_in_multidimensional_array = parser.parse validator = SudokuValidator.new(sudoku_in_multidimensional_array) result = validator.validate result.should eq("This sudoku is valid.") end + + # it "validates complete invalid sudoku rows" do + # parser = SudokuParser.new('invalid_complete.sudoku') + # sudoku_in_multidimensional_array = parser.parse + # validator = SudokuValidator.new(sudoku_in_multidimensional_array) + # result = validator.validate + # result.should eq("This sudoku is valid.") + # end end end \ No newline at end of file From 984a329d339e4b31fec879395d6328a5cf10bbbd Mon Sep 17 00:00:00 2001 From: ankur kothari Date: Sun, 22 Dec 2013 18:18:06 +0530 Subject: [PATCH 5/5] Completedmy solution to this problem. --- lib/sudoku_validator.rb | 115 +++++++++++++++++++++++++++++----- spec/sudoku_parser_spec.rb | 10 +-- spec/sudoku_validator_spec.rb | 43 +++---------- sudoku-validator.rb | 7 +++ test.rb | 94 +++++++++++++++++++++++++++ 5 files changed, 214 insertions(+), 55 deletions(-) create mode 100644 sudoku-validator.rb create mode 100644 test.rb diff --git a/lib/sudoku_validator.rb b/lib/sudoku_validator.rb index 290bb19..f3687ac 100644 --- a/lib/sudoku_validator.rb +++ b/lib/sudoku_validator.rb @@ -11,13 +11,106 @@ def get_rows end def get_columns - [] + @sudoku.transpose end def get_grids - [] + a = @sudoku + grids = [] + sub_grid = [] + + (0..2).each do |j| + (0..2).each do |i| + sub_grid << a[j][i] + end + end + + grids << sub_grid + sub_grid = [] +(0..2).each do |j| + (3..5).each do |i| + sub_grid << a[j][i] + end + + end + + grids << sub_grid + sub_grid = [] + (0..2).each do |j| + (6..8).each do |i| + sub_grid << a[j][i] + end + end + + grids << sub_grid + sub_grid = [] + + (3..5).each do |j| + (0..2).each do |i| + sub_grid << a[j][i] + end + end + + grids << sub_grid + sub_grid = [] +(3..5).each do |j| + (3..5).each do |i| + sub_grid << a[j][i] + end + + end + + grids << sub_grid + sub_grid = [] + (3..5).each do |j| + (6..8).each do |i| + sub_grid << a[j][i] + end + end + + + sub_grid = [] + + (6..8).each do |j| + (0..2).each do |i| + sub_grid << a[j][i] + end + end + + grids << sub_grid + sub_grid = [] +(6..8).each do |j| + (3..5).each do |i| + sub_grid << a[j][i] + end + + end + + grids << sub_grid + sub_grid = [] + (6..8).each do |j| + (6..8).each do |i| + sub_grid << a[j][i] + end + end + +grids << sub_grid + grids end + def validate_row(row) + row.collect{|i| i.to_i}.sort.join == "123456789" + end + + def validate_column(column) + column.collect{|i| i.to_i}.sort.join == "123456789" + end + + def validate_grid(grid) + grid.collect{|i| i.to_i}.sort.join == "123456789" + end + + def validate_rows @rows.each do |row| if validate_row(row) @@ -29,24 +122,12 @@ def validate_rows end end - def validate_row(row) - row.collect{|i| i.to_i}.sort.join == "123456789" - end - - def validate_column(column) - column.collect{|i| i.to_i}.sort.join == "" - end - - def validate_grid(grid) - grid.collect{|i| i.to_i}.sort.join == "" - end - def validate_columns @columns.each do |column| if validate_column(column) next else - return false + return false end return true end @@ -54,10 +135,10 @@ def validate_columns def validate_grids @grids.each do |grid| - if validate_grid(grid) + if validate_grid(grid) next else - return false + return false end return true end diff --git a/spec/sudoku_parser_spec.rb b/spec/sudoku_parser_spec.rb index 0c55c47..57d9045 100644 --- a/spec/sudoku_parser_spec.rb +++ b/spec/sudoku_parser_spec.rb @@ -5,7 +5,7 @@ it "returns the one row sudoku in an array" do parser = SudokuParser.new('examples/one_row.sudoku') result = parser.parse - result.should eq([[8,5, 9, 6, 1, 2, 4, 3, 7 ]]) + result.should eq([[8, 5, 9, 6, 1, 2, 4, 3, 7 ]]) end it "returns the two sudoku in an array" do @@ -48,10 +48,10 @@ [0, 0, 4, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 7, 0, 0, 2], [3, 0, 5, 0, 0, 0, 9, 0, 0], - [0, 4, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 8, 0, 0, 7, 0], - [0, 1, 7, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 3, 6, 0, 4, 0]]) + [0, 4, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 8, 0, 0, 7, 0], + [0, 1, 7, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 3, 6, 0, 4, 0]]) end end end \ No newline at end of file diff --git a/spec/sudoku_validator_spec.rb b/spec/sudoku_validator_spec.rb index 45ed44c..35903a3 100644 --- a/spec/sudoku_validator_spec.rb +++ b/spec/sudoku_validator_spec.rb @@ -3,60 +3,37 @@ require_relative '../lib/sudoku_parser' describe SudokuValidator do context "#validate" do - it "validates one row valid" do - parser = SudokuParser.new('examples/one_row.sudoku') - sudoku_in_multidimensional_array = parser.parse - validator = SudokuValidator.new(sudoku_in_multidimensional_array) - result = validator.validate - result.should eq("This sudoku is valid.") - end - - it "validates two row valid" do - parser = SudokuParser.new('examples/two_row.sudoku') - sudoku_in_multidimensional_array = parser.parse - validator = SudokuValidator.new(sudoku_in_multidimensional_array) - result = validator.validate - result.should eq("This sudoku is valid.") - end - - it "validates three row valid" do - parser = SudokuParser.new('examples/three_row.sudoku') + it "validates complete valid sudoku" do + parser = SudokuParser.new('valid_complete.sudoku') sudoku_in_multidimensional_array = parser.parse validator = SudokuValidator.new(sudoku_in_multidimensional_array) result = validator.validate result.should eq("This sudoku is valid.") end - - it "validates one row invalid" do - parser = SudokuParser.new('examples/one_row_invalid.sudoku') + + it "validates incomplete valid sudoku" do + parser = SudokuParser.new('valid_incomplete.sudoku') sudoku_in_multidimensional_array = parser.parse validator = SudokuValidator.new(sudoku_in_multidimensional_array) result = validator.validate result.should eq("This sudoku is invalid.") end - it "validates one three invalid" do - parser = SudokuParser.new('examples/three_row_invalid.sudoku') + it "validates complete invalid sudoku" do + parser = SudokuParser.new('invalid_complete.sudoku') sudoku_in_multidimensional_array = parser.parse validator = SudokuValidator.new(sudoku_in_multidimensional_array) result = validator.validate result.should eq("This sudoku is invalid.") end - it "validates complete valid sudoku rows" do - parser = SudokuParser.new('valid_complete.sudoku') + it "validates incomplete invalid sudoku" do + parser = SudokuParser.new('invalid_incomplete.sudoku') sudoku_in_multidimensional_array = parser.parse validator = SudokuValidator.new(sudoku_in_multidimensional_array) result = validator.validate - result.should eq("This sudoku is valid.") + result.should eq("This sudoku is invalid.") end - # it "validates complete invalid sudoku rows" do - # parser = SudokuParser.new('invalid_complete.sudoku') - # sudoku_in_multidimensional_array = parser.parse - # validator = SudokuValidator.new(sudoku_in_multidimensional_array) - # result = validator.validate - # result.should eq("This sudoku is valid.") - # 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..62a468c --- /dev/null +++ b/sudoku-validator.rb @@ -0,0 +1,7 @@ +require_relative 'lib/sudoku_validator' +require_relative 'lib/sudoku_parser' +parser = SudokuParser.new(ARGV[0]) +sudoku_in_multidimensional_array = parser.parse +validator = SudokuValidator.new(sudoku_in_multidimensional_array) +result = validator.validate +puts result \ No newline at end of file diff --git a/test.rb b/test.rb new file mode 100644 index 0000000..403de3b --- /dev/null +++ b/test.rb @@ -0,0 +1,94 @@ +a = [[8, 5, 9, 6, 1, 2, 4, 3, 7], + [7, 2, 3, 8, 5, 4, 1, 6, 9], + [1, 6, 4, 3, 7, 9, 5, 2, 8], + [9, 8, 6, 1, 4, 7, 3, 5, 2], + [3, 7, 5, 2, 6, 8, 9, 1, 4], + [2, 4, 1, 5, 9, 3, 7, 8, 6], + [4, 3, 2, 9, 8, 1, 6, 7, 5], + [6, 1, 7, 4, 2, 5, 8, 9, 3], + [5, 9, 8, 7, 3, 6, 2, 4, 1]] +grids = [] + sub_grid = [] + + (0..2).each do |j| + (0..2).each do |i| + sub_grid << a[j][i] + end + end + + grids << sub_grid + sub_grid = [] +(0..2).each do |j| + (3..5).each do |i| + sub_grid << a[j][i] + end + + end + + grids << sub_grid + sub_grid = [] + (0..2).each do |j| + (6..8).each do |i| + sub_grid << a[j][i] + end + end + + grids << sub_grid + sub_grid = [] + + (3..5).each do |j| + (0..2).each do |i| + sub_grid << a[j][i] + end + end + + grids << sub_grid + sub_grid = [] +(3..5).each do |j| + (3..5).each do |i| + sub_grid << a[j][i] + end + + end + + grids << sub_grid + sub_grid = [] + (3..5).each do |j| + (6..8).each do |i| + sub_grid << a[j][i] + end + end + + + sub_grid = [] + + (6..8).each do |j| + (0..2).each do |i| + sub_grid << a[j][i] + end + end + + grids << sub_grid + sub_grid = [] +(6..8).each do |j| + (3..5).each do |i| + sub_grid << a[j][i] + end + + end + + grids << sub_grid + sub_grid = [] + (6..8).each do |j| + (6..8).each do |i| + sub_grid << a[j][i] + end + end + + + + + + + grids << sub_grid +p grids \ No newline at end of file