63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
# File 'lib/sudokude.rb', line 63
def solve
unsolved = {}
@keysizes = []
@sudoku.each do |key, value|
if value.nil?
unsolved[key] = [1,2,3,4,5,6,7,8,9]
end
end
until solved
unsolved.each do |key, value|
value.reject! do |number|
(@sudoku.sudoku_row(key[1].to_i) + @sudoku.sudoku_column(key[0].to_i) + @sudoku.sudoku_box(key[2].to_i)).include?(number)
end
@sudoku[key] = value[0] if value.size == 1
unsolved.delete_if { |key, value| value.empty? }
end
unsolved.each do |key, value|
if unsolved.sudoku_row(key[1].to_i).has_naked_multiple?(value)
unsolved.each do |nkey, nvalue|
nvalue.reject! { |n| value.include?(n) } if (!(nvalue-value).empty? && key[1] == nkey[1])
end
end
if unsolved.sudoku_column(key[0].to_i).has_naked_multiple?(value)
unsolved.each do |nkey, nvalue|
nvalue.reject! { |n| value.include?(n) } if (!(nvalue-value).empty? && key[0] == nkey[0])
end
end
if unsolved.sudoku_box(key[2].to_i).has_naked_multiple?(value)
unsolved.each do |nkey, nvalue|
nvalue.reject! { |n| value.include?(n) } if (!(nvalue-value).empty? && key[2] == nkey[2])
end
end
@sudoku[key] = value[0] if value.size == 1
unsolved.delete_if { |key, value| value.empty? }
end
if unsolvable
puts "Impossible to solve. Best solution (n if no solution):"
sudoku.to_s
break
end
end
return @sudoku.values.each_slice(9).to_a
end
|