/
thermoRule.go
91 lines (78 loc) · 1.97 KB
/
thermoRule.go
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package sudoku
import (
"errors"
"fmt"
"image/color"
)
type ThermoRule struct {
cells []Cell
increasing bool
strict bool
backgroundColor color.Color
thermoColor color.Color
}
// NewThermoRule : Create a new ThermoRule
func NewThermoRule(cells []Cell, increasing, strict bool, backgroundColor color.Color, thermoColor color.Color) (*ThermoRule, error) {
rule := new(ThermoRule)
rule.increasing = increasing
rule.strict = strict
var lastCell *Cell
for index, cell := range cells {
if lastCell != nil {
// Check that cells are consecutive
if absInt(cell.Row-lastCell.Row) >= 1 || absInt(cell.Column-lastCell.Column) >= 1 {
return nil, errors.New(fmt.Sprintf("Cells must be consecutive : cell %d", index+1))
}
}
lastCell = &cell
}
rule.cells = cells
rule.backgroundColor = backgroundColor
rule.thermoColor = thermoColor
return rule, nil
}
func (t *ThermoRule) GetCells() []Cell {
return t.cells
}
func (t *ThermoRule) GetIncreasing() bool {
return t.increasing
}
func (t *ThermoRule) GetStrict() bool {
return t.strict
}
func (t *ThermoRule) GetBackgroundColor() color.Color {
return t.backgroundColor
}
func (t *ThermoRule) GetThermoColor() color.Color {
return t.thermoColor
}
func (t *ThermoRule) Check(sudoku *Sudoku) (bool, error) {
var lastValue int = -1
for _, cell := range t.cells {
value, err := sudoku.GetValue(cell.Row, cell.Column)
if lastValue > 0 {
if err != nil {
return false, err
}
dValue := value - lastValue
if t.increasing && t.strict && dValue <= 0 {
return false, nil
} else if t.increasing && t.strict == false && dValue < 0 {
return false, nil
} else if t.increasing==false && t.strict && dValue >= 0 {
return false, nil
} else if t.increasing==false && t.strict == false && dValue > 0 {
return false, nil
}
}
lastValue = value
}
return true, nil
}
// absInt returns the absolute value of x.
func absInt(x int) int {
if x < 0 {
return -x
}
return x
}