-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsolver.rb
67 lines (50 loc) · 1.31 KB
/
solver.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
require 'grid'
require 'fill_single_empty'
require 'fill_from_exclusions'
require 'fill_possible_place'
class Solver
def initialize(grid)
@grid = grid
@single_empties = FillSingleEmpty.new(@grid.size)
@from_exclusions = FillFromExclusions.new(@grid)
@possible_places = FillPossiblePlace.new(@grid)
end
def solve
loop do
empty_count = @grid.empty_cells.count
@grid.each_row do |row|
@single_empties.fillup(row)
end
@grid.each_column do |col|
@single_empties.fillup(col)
end
@grid.each_quadrant do |quad|
@single_empties.fillup(quad)
end
@from_exclusions.fill_grid
@possible_places.fill_grid
new_count = @grid.empty_cells.count
break if new_count >= empty_count
end
@grid
end
def most_present_value
cells_by_val.max_by{|k,v| v.count}[0]
end
def cells_by_val
ret = {}
1.upto(@grid.size) do | val |
ret[val] = []
end
@grid.each_cell do | cell |
ret[cell.value] << cell if cell.value != 0
end
ret
end
def can_hold(row, column, value)
row_count = @grid.row(row).count {|x| x.value == value}
col_count = @grid.column(column).count {|x| x.value == value}
quad_count = @grid.quadrant(row, column).count {|x| x.value == value}
@grid[row, column].value == value || (row_count == 0 && col_count == 0 && quad_count == 0)
end
end