nsudoku 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rvmrc ADDED
@@ -0,0 +1,6 @@
1
+ # create the gemset if it does not exist
2
+ rvm_gemset_create_on_use_flag=1
3
+ # switch to default ruby version when exiting directory
4
+ rvm_project_rvmrc_default=1
5
+ # use ruby 1.8.7 with a specific gemset
6
+ rvm ruby-1.9.3-p194@sudoku2
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in sudoku.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Michał Szyma
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # Sudoku
2
+
3
+ This gem solve puzzle game sudoku 9x9
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ > gem 'nsudoku'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install nsudoku
18
+
19
+ ## Usage
20
+
21
+ > require 'nsudoku'
22
+ > EXAMPLE = [
23
+ > "012000000",
24
+ > "304052000",
25
+ > "605170000",
26
+ > "070208090",
27
+ > "920700084",
28
+ > "050906010",
29
+ > "000320908",
30
+ > "000580107",
31
+ > "000000240"].join
32
+
33
+ > NSudoku.new(EXAMPLE) #=> "712460850394852671685170420070208596926715384050906712540320968269584137030690245"
34
+
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,3 @@
1
+ class NSudoku
2
+ VERSION = "0.1.0"
3
+ end
data/lib/nsudoku.rb ADDED
@@ -0,0 +1,193 @@
1
+ require "nsudoku/version"
2
+
3
+ class NSudoku
4
+
5
+ def initialize(data)
6
+ @revers_table = create_revers_table(data.split(""))
7
+ end
8
+
9
+ def solve
10
+ revers_table = nil
11
+ while not revers_table == @revers_table
12
+ revers_table = Marshal.load(Marshal.dump(@revers_table))
13
+
14
+ 9.times do |index|
15
+ cells_with_two_elements_for('row', index)
16
+ cells_with_two_elements_for('column', index)
17
+ cells_with_two_elements_for('block', index)
18
+ erase_in_horizontal_three(index)
19
+ erase_in_vertical_three(index)
20
+ end
21
+
22
+ 9.times do |row_index|
23
+ 9.times do |column_index|
24
+ erase_in_vertical_one(row_index, column_index)
25
+ erase_in_horizontal_one(row_index, column_index)
26
+ erase_in_block_one(row_index, column_index)
27
+ end
28
+ end
29
+ end
30
+ revers_table_to_result
31
+ end
32
+
33
+ def show_table_pretty
34
+ @revers_table.each do |cell|
35
+ puts cell.inspect
36
+ end
37
+ end
38
+ private
39
+
40
+ # table = [[[1, 2, 3, 4, 5], [], ..., []],
41
+ # [[], ..., []],
42
+ # ...
43
+ # [[], ..., []]
44
+ # ]
45
+ def create_revers_table(data)
46
+ result = 9.times.map{|row_element| 9.times.map{|col_element| []}}
47
+ data.each_with_index do |cell, index|
48
+ column = index % 9
49
+ row = (index - column)/9 % 9
50
+ cell = cell.to_i
51
+ result[row][column] = [cell]
52
+ result[row][column] = 9.times.map{|element| element + 1} if cell == 0
53
+ end
54
+ return result
55
+ end
56
+
57
+ # revers table @revers_table into string where cell [n] return n and [a1, a2, ..., ak] return 0
58
+ def revers_table_to_result
59
+ result = ""
60
+ @revers_table.flatten(1).each do |element|
61
+ result << (element.size == 1 ? element.first.to_s : "0")
62
+ end
63
+ result
64
+ end
65
+
66
+
67
+ def positions_for(type, index0, index1)
68
+ case type
69
+ when 'column'
70
+ return {
71
+ row: index0,
72
+ column: index1
73
+ }
74
+ when 'row'
75
+ return {
76
+ row: index0,
77
+ column: index1
78
+ }
79
+ when 'block'
80
+ return {
81
+ row: (index0/3)*3 + index1/3,
82
+ column: (index0%3)*3 + index1%3
83
+ }
84
+ end
85
+ end
86
+
87
+ def positions_of_values(kind, value)
88
+ result = {}
89
+ row, column = nil, nil
90
+ 9.times do |index|
91
+ case kind
92
+ when 'column'
93
+ row = index
94
+ column = value
95
+ when 'row'
96
+ row = value
97
+ column = index
98
+ when 'block'
99
+ row = (value/3)*3 + index/3
100
+ column = (value%3)*3 + index%3
101
+ end
102
+ next if row.nil? or column.nil?
103
+ @revers_table[row][column].each do |value|
104
+ result[value] ||= []
105
+ result[value] << index
106
+ end
107
+ end
108
+ result
109
+ end
110
+
111
+ # erase values in vertical, which are that same like value from positnio row, column
112
+ # type: "block", "row","column"
113
+ def cells_with_two_elements_for(type, index)
114
+ only_two_positions = positions_of_values(type, index).select {|k,v| v.length == 2}
115
+ result = {}
116
+ only_two_positions.each do |value, positions|
117
+ result[positions] ||= []
118
+ result[positions] << value
119
+ end
120
+ result.each do |key, value|
121
+ if value.size == 2
122
+ if type == 'block'
123
+ positions = positions_for('block', index, key[0])
124
+ @revers_table[positions[:row]][positions[:column]] = value.clone
125
+ positions = positions_for('block', index, key[1])
126
+ @revers_table[positions[:row]][positions[:column]] = value.clone
127
+ end
128
+ if type == 'row'
129
+ @revers_table[index][key[0]] = value.clone
130
+ @revers_table[index][key[1]] = value.clone
131
+ end
132
+ if type == 'column'
133
+ @revers_table[key[0]][index] = value.clone
134
+ @revers_table[key[1]][index] = value.clone
135
+ end
136
+ end
137
+ end
138
+ end
139
+
140
+
141
+ # erase values in vertical, which are that same like value from positnio row, column
142
+ def erase_in_vertical_one(row, column)
143
+ return unless @revers_table[row][column].size == 1
144
+ cell = @revers_table[row][column][0]
145
+ 9.times do |index|
146
+ @revers_table[index][column].delete(cell) unless index == row
147
+ end
148
+ end
149
+
150
+ # erase values in hozizontal, which are that same like value from positnio row, column
151
+ def erase_in_horizontal_one(row, column)
152
+ return unless @revers_table[row][column].size == 1
153
+ cell = @revers_table[row][column][0]
154
+ 9.times do |index|
155
+ @revers_table[row][index].delete(cell) unless index == column
156
+ end
157
+ end
158
+
159
+ # erase values in block, which are that same like value from positnio row, column
160
+ def erase_in_block_one(row, column)
161
+ return unless @revers_table[row][column].size == 1
162
+ cell = @revers_table[row][column][0]
163
+ first_row_block = (row/3)*3
164
+ first_column_block = (column/3)*3
165
+ 3.times do |row_index|
166
+ row_block = first_row_block + row_index
167
+ 3.times do |column_index|
168
+ column_block = first_column_block + column_index
169
+ @revers_table[row_block][column_block].delete(cell) unless row_block == row and column_block == column
170
+ end
171
+ end
172
+ end
173
+
174
+ # erase values in vertical, which are that same like value from positnio row, column
175
+ def erase_in_vertical_three(column)
176
+ positions_of_values('column', column).each do |value, positions|
177
+ @revers_table[positions.first][column] = [value] if positions.size == 1
178
+ end
179
+ end
180
+
181
+ # erase values in horizontal, which are that same like value from positnio row, column
182
+ def erase_in_horizontal_three(row)
183
+ positions_of_values('row', row).each do |value, positions|
184
+ @revers_table[row][positions.first] = [value] if positions.size == 1
185
+ end
186
+ end
187
+
188
+ def cell_revers_table(row, column, value = nil)
189
+ @revers_table[row][column] = value unless value.nil?
190
+ @revers_table[row][column]
191
+ end
192
+
193
+ end
data/lib/sudoku.rb~ ADDED
@@ -0,0 +1,161 @@
1
+ require "sudoku/version"
2
+
3
+ class Sudoku
4
+
5
+ def initialize(data)
6
+ @revers_table = create_revers_table(data)
7
+ end
8
+
9
+ def solve
10
+ revers_table = nil
11
+ while not revers_table == @revers_table
12
+ revers_table = Marshal.load(Marshal.dump(@revers_table))
13
+
14
+ 9.times do |row_index|
15
+ # erase_in_vertical_two(row_index)
16
+ # erase_in_horizontal_two(row_index)
17
+ # erase_in_block_two(row_index)
18
+ 9.times do |column_index|
19
+ erase_in_vertical_one(row_index, column_index)
20
+ erase_in_horizontal_one(row_index, column_index)
21
+ erase_in_block_one(row_index, column_index)
22
+ puts "row_index : #{row_index} column_index: #{column_index}"
23
+ end
24
+ end
25
+ end
26
+ puts revers_table_to_result
27
+ end
28
+
29
+ private
30
+
31
+ # table = [[[1, 2, 3, 4, 5], [], ..., []],
32
+ # [[], ..., []],
33
+ # ...
34
+ # [[], ..., []]
35
+ # ]
36
+ def create_revers_table(data)
37
+ result = 9.times.map{|row_element| 9.times.map{|col_element| []}}
38
+ data.each_with_index do |cell, index|
39
+ column = index % 9
40
+ row = (index - column)/9 % 9
41
+ cell = cell.to_i
42
+ result[row][column] = [cell]
43
+ result[row][column] = 9.times.map{|element| element+1} if cell == 0
44
+ end
45
+ return result
46
+ end
47
+
48
+ def revers_table_to_result
49
+ revers_table = Marshal.load(Marshal.dump(@revers_table))
50
+ 9.times.map do |row|
51
+ 9.times.map do |columnt|
52
+ if revers_table[row][columnt].size == 1
53
+ revers_table[row][columnt] = revers_table[row][columnt].first
54
+ else
55
+ revers_table[row][columnt] = 0
56
+ end
57
+ end
58
+ end
59
+ revers_table.join.split("")
60
+ end
61
+
62
+ # erase values in vertical, which are that same like value from positnio row, column
63
+ def erase_in_block_two(number)
64
+ start_row = (number/3)*3
65
+ start_column = (number%3)*3
66
+
67
+ # zamieniamy na tablicę z pozycjami dla poszczególnych wartośći w pionie
68
+ reverse = ([[]]*9).map{|each| []}
69
+ 9.times do |index|
70
+ block_row = index/3 + start_row
71
+ block_column = index%3 + start_column
72
+ @revers_table[block_row][block_column].each { |value| reverse[value-1] << index }
73
+ end
74
+ reverse.map!{|value| value.sort}
75
+
76
+ result = []
77
+ reverse.each do |positions|
78
+ next unless reverse.count(positions) == 2
79
+ reverse.each_with_index { |value, index| result << index+1 if value == positions }
80
+ positions.each do |position|
81
+ block_row = position/3 + start_row
82
+ block_column = position%3 + start_column
83
+ @revers_table[block_row][block_column] = result.uniq
84
+ end
85
+ end
86
+ end
87
+
88
+
89
+ # erase values in vertical, which are that same like value from positnio row, column
90
+ def erase_in_vertical_two(column)
91
+ # zamieniamy na tablicę z pozycjami dla poszczególnych wartośći w pionie
92
+ reverse = ([[]]*9).map{|each| []}
93
+ 9.times do |index|
94
+ @revers_table[index][column].each { |value| reverse[value-1] << index }
95
+ end
96
+ reverse.map!{|value| value.sort}
97
+
98
+ result = []
99
+ reverse.each do |positions|
100
+ next unless reverse.count(positions) == 2
101
+ reverse.each_with_index { |value, index| result << index+1 if value == positions }
102
+ positions.each { |position| @revers_table[position][column] = result.uniq }
103
+ end
104
+ end
105
+
106
+ # erase values in vertical, which are that same like value from positnio row, column
107
+ def erase_in_horizontal_two(row)
108
+ # zamieniamy na tablicę z pozycjami dla poszczególnych wartośći w pionie
109
+ reverse = ([[]]*9).map{|each| []}
110
+ 9.times do |index|
111
+ @revers_table[row][index].each { |value| reverse[value-1] << index }
112
+ end
113
+ reverse.map!{|value| value.sort}
114
+
115
+ result = []
116
+ reverse.each do |positions|
117
+ next unless reverse.count(positions) == 2
118
+ reverse.each_with_index { |value, index| result << index+1 if value == positions }
119
+ positions.each { |position| @revers_table[row][position] = result.uniq }
120
+ end
121
+ end
122
+
123
+ # erase values in vertical, which are that same like value from positnio row, column
124
+ def erase_in_vertical_one(row, column)
125
+ return unless @revers_table[row][column].size == 1
126
+ cell = @revers_table[row][column][0]
127
+ 9.times do |index|
128
+ @revers_table[index][column].delete(cell) unless index == row
129
+ end
130
+ end
131
+
132
+ # erase values in hozizontal, which are that same like value from positnio row, column
133
+ def erase_in_horizontal_one(row, column)
134
+ return unless @revers_table[row][column].size == 1
135
+ cell = @revers_table[row][column][0]
136
+ 9.times do |index|
137
+ @revers_table[row][index].delete(cell) unless index == column
138
+ end
139
+ end
140
+
141
+ # erase values in block, which are that same like value from positnio row, column
142
+ def erase_in_block_one(row, column)
143
+ return unless @revers_table[row][column].size == 1
144
+ cell = @revers_table[row][column][0]
145
+ first_row_block = (row/3)*3
146
+ first_column_block = (column/3)*3
147
+ 3.times do |row_index|
148
+ row_block = first_row_block + row_index
149
+ 3.times do |column_index|
150
+ column_block = first_column_block + column_index
151
+ @revers_table[row_block][column_block].delete(cell) unless row_block == row and column_block == column
152
+ end
153
+ end
154
+ end
155
+
156
+ def cell_revers_table(row, column, value = nil)
157
+ @revers_table[row][column] = value unless value.nil?
158
+ @revers_table[row][column]
159
+ end
160
+
161
+ end
data/nsudoku.gemspec ADDED
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/nsudoku/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.platform = Gem::Platform::RUBY
6
+ gem.authors = ["Michał Szyma"]
7
+ gem.email = ["raglub.ruby@gmail.com"]
8
+ gem.date = "2012-06-21"
9
+ gem.description = %q{This gem solve puzzle game sudoku 9x9}
10
+ gem.summary = %q{This gem solve puzzle game sudoku}
11
+ gem.homepage = "http://github.com/raglub/nsudoku"
12
+
13
+ gem.files = `git ls-files`.split($\)
14
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
15
+ gem.name = "nsudoku"
16
+ gem.require_paths = ["lib"]
17
+ gem.version = NSudoku::VERSION
18
+
19
+ gem.add_development_dependency "rspec", ">= 2.10.0"
20
+ end
@@ -0,0 +1,148 @@
1
+ # encoding: utf-8
2
+
3
+ require 'nsudoku'
4
+
5
+ EXAMPLE = [
6
+ "012000000",
7
+ "304052000",
8
+ "605170000",
9
+ "070208090",
10
+ "920700084",
11
+ "050906010",
12
+ "000320908",
13
+ "000580107",
14
+ "000000240"].join
15
+
16
+ TABLE_EMPTY = [
17
+ "000000000",
18
+ "000000000",
19
+ "000000000",
20
+ "000000000",
21
+ "000000000",
22
+ "000000000",
23
+ "000000000",
24
+ "000000000",
25
+ "000000000"].join
26
+
27
+ describe NSudoku do
28
+
29
+ it "should properly reverse base namber of table" do
30
+ sudoku = NSudoku.new(TABLE_EMPTY)
31
+ sudoku.send(:cell_revers_table, 1, 1, [1])
32
+ sudoku.send(:cell_revers_table, 8, 8, [3])
33
+ sudoku.send(:cell_revers_table, 1, 1).should eql([1])
34
+ sudoku.send(:cell_revers_table, 1 ,0).should eql([1, 2, 3, 4, 5, 6, 7, 8, 9])
35
+ end
36
+
37
+ context "should properly erase values which are that same like in cell with single element" do
38
+ it "in column (exist cell with single element)" do
39
+ sudoku = NSudoku.new(TABLE_EMPTY)
40
+ sudoku.send(:cell_revers_table, 3, 4, [5])
41
+ sudoku.send(:erase_in_vertical_one, 3, 4)
42
+ sudoku.send(:cell_revers_table, 0, 4).should eql([1, 2, 3, 4, 6, 7, 8, 9])
43
+ sudoku.send(:cell_revers_table, 5, 4).should eql([1, 2, 3, 4, 6, 7, 8, 9])
44
+ sudoku.send(:cell_revers_table, 8, 4).should eql([1, 2, 3, 4, 6, 7, 8, 9])
45
+ sudoku.send(:cell_revers_table, 3, 4).should eql([5])
46
+ end
47
+
48
+ it "in column (don't exist cell with single element)" do
49
+ sudoku = NSudoku.new(TABLE_EMPTY)
50
+ sudoku.send(:erase_in_vertical_one, 3, 4)
51
+ sudoku.send(:cell_revers_table, 5, 4).should eql([1, 2, 3, 4,5 , 6, 7, 8, 9])
52
+ sudoku.send(:cell_revers_table, 3, 4).should eql([1, 2, 3, 4,5 , 6, 7, 8, 9])
53
+ end
54
+
55
+ it "in row (exist cell with single element)" do
56
+ sudoku = NSudoku.new(TABLE_EMPTY)
57
+ sudoku.send(:cell_revers_table, 3, 4, [5])
58
+ sudoku.send(:erase_in_horizontal_one, 3, 4)
59
+ sudoku.send(:cell_revers_table, 3, 2).should eql([1, 2, 3, 4, 6, 7, 8, 9])
60
+ sudoku.send(:cell_revers_table, 3, 4).should eql([5])
61
+ end
62
+
63
+ it "in column (don't exist cell with single element)" do
64
+ sudoku = NSudoku.new(TABLE_EMPTY)
65
+ sudoku.send(:erase_in_horizontal_one, 3, 4)
66
+ sudoku.send(:cell_revers_table, 3, 2).should eql([1, 2, 3, 4, 5, 6, 7, 8, 9])
67
+ sudoku.send(:cell_revers_table, 3, 4).should eql([1, 2, 3, 4 ,5, 6, 7, 8, 9])
68
+ end
69
+
70
+ it "in block (exist cell with single element)" do
71
+ sudoku = NSudoku.new(TABLE_EMPTY)
72
+ sudoku.send(:cell_revers_table, 7, 3, [8])
73
+ sudoku.send(:erase_in_block_one, 7, 3)
74
+ sudoku.send(:cell_revers_table, 6, 2).should eql([1, 2, 3, 4 ,5, 6, 7, 8, 9])
75
+ sudoku.send(:cell_revers_table, 5, 6).should eql([1, 2, 3, 4 ,5, 6, 7, 8, 9])
76
+ sudoku.send(:cell_revers_table, 5, 3).should eql([1, 2, 3, 4 ,5, 6, 7, 8, 9])
77
+ sudoku.send(:cell_revers_table, 7, 6).should eql([1, 2, 3, 4 ,5, 6, 7, 8, 9])
78
+
79
+ sudoku.send(:cell_revers_table, 6, 4).should eql([1, 2, 3, 4 ,5, 6, 7, 9])
80
+ sudoku.send(:cell_revers_table, 8, 3).should eql([1, 2, 3, 4 ,5, 6, 7, 9])
81
+ sudoku.send(:cell_revers_table, 8, 5).should eql([1, 2, 3, 4 ,5, 6, 7, 9])
82
+ sudoku.send(:cell_revers_table, 7, 3).should eql([8])
83
+ end
84
+
85
+ it "in block (don't exist cell with single element)" do
86
+ sudoku = NSudoku.new(TABLE_EMPTY)
87
+ sudoku.send(:erase_in_block_one, 7, 3)
88
+ sudoku.send(:cell_revers_table, 6, 2).should eql([1, 2, 3, 4 ,5, 6, 7, 8, 9])
89
+ sudoku.send(:cell_revers_table, 5, 6).should eql([1, 2, 3, 4 ,5, 6, 7, 8, 9])
90
+
91
+ sudoku.send(:cell_revers_table, 6, 4).should eql([1, 2, 3, 4 ,5, 6, 7, 8, 9])
92
+ sudoku.send(:cell_revers_table, 8, 3).should eql([1, 2, 3, 4 ,5, 6, 7, 8, 9])
93
+ end
94
+ end
95
+
96
+ context "select cells with two elements (rest erase)" do
97
+
98
+ it "in block" do
99
+ sudoku = NSudoku.new(TABLE_EMPTY)
100
+ 3.times do |row|
101
+ 3.times do |column|
102
+ sudoku.send(:cell_revers_table, row, column, [2, 3, 4, 5, 6, 7, 9])
103
+ end
104
+ end
105
+
106
+ sudoku.send(:cell_revers_table, 0, 0, [1, 5, 8])
107
+ sudoku.send(:cell_revers_table, 2, 2, [1, 3, 8])
108
+
109
+ sudoku.send(:cells_with_two_elements_for, "block", 0)
110
+ sudoku.send(:cell_revers_table, 0, 0).should eql([1, 8])
111
+ sudoku.send(:cell_revers_table, 2, 2).should eql([1, 8])
112
+ sudoku.send(:cell_revers_table, 1, 2).should eql([2, 3, 4, 5, 6, 7, 9])
113
+ end
114
+
115
+ it "in column" do
116
+ sudoku = NSudoku.new(TABLE_EMPTY)
117
+ sudoku.send(:cell_revers_table, 0, 4, [1, 5, 8])
118
+ sudoku.send(:cell_revers_table, 1, 4, [1, 3, 8])
119
+ (2..8).each do |index|
120
+ sudoku.send(:cell_revers_table, index, 4, [2, 3, 4, 5, 6, 7, 9])
121
+ end
122
+
123
+ sudoku.send(:cells_with_two_elements_for, "column", 4)
124
+ sudoku.send(:cell_revers_table, 0, 4).should eql([1, 8])
125
+ sudoku.send(:cell_revers_table, 1, 4).should eql([1, 8])
126
+ sudoku.send(:cell_revers_table, 2, 4).should eql([2, 3, 4, 5, 6, 7, 9])
127
+ end
128
+
129
+ it "in row" do
130
+ sudoku = NSudoku.new(TABLE_EMPTY)
131
+ sudoku.send(:cell_revers_table, 4, 0, [1, 5, 8])
132
+ sudoku.send(:cell_revers_table, 4, 1, [1, 3, 8])
133
+ (2..8).each do |index|
134
+ sudoku.send(:cell_revers_table, 4, index, [2, 3, 4, 5, 6, 7, 9])
135
+ end
136
+
137
+ sudoku.send(:cells_with_two_elements_for, "row", 4)
138
+ sudoku.send(:cell_revers_table, 4, 0).should eql([1, 8])
139
+ sudoku.send(:cell_revers_table, 4, 1).should eql([1, 8])
140
+ sudoku.send(:cell_revers_table, 4, 2).should eql([2, 3, 4, 5, 6, 7, 9])
141
+ end
142
+
143
+ end
144
+
145
+ it "solve whole sudoku" do
146
+ NSudoku.new(EXAMPLE).solve.should eql("712460850394852671685170420070208596926715384050906712540320968269584137030690245")
147
+ end
148
+ end
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nsudoku
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Michał Szyma
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-06-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 2.10.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 2.10.0
30
+ description: This gem solve puzzle game sudoku 9x9
31
+ email:
32
+ - raglub.ruby@gmail.com
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - .gitignore
38
+ - .rvmrc
39
+ - Gemfile
40
+ - LICENSE
41
+ - README.md
42
+ - Rakefile
43
+ - lib/nsudoku.rb
44
+ - lib/nsudoku/version.rb
45
+ - lib/sudoku.rb~
46
+ - nsudoku.gemspec
47
+ - spec/nsudoku_spec.rb
48
+ homepage: http://github.com/raglub/nsudoku
49
+ licenses: []
50
+ post_install_message:
51
+ rdoc_options: []
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ requirements: []
67
+ rubyforge_project:
68
+ rubygems_version: 1.8.24
69
+ signing_key:
70
+ specification_version: 3
71
+ summary: This gem solve puzzle game sudoku
72
+ test_files:
73
+ - spec/nsudoku_spec.rb