1 package sudoku 2 3 // Sorted is a Constraint that requires the numbers to be ordered lowest to highest. 4 type Sorted []int 5 6 // Constrain implements the Constraing interface. 7 func (s Sorted) Constrain(su *Sudoku, pos int, marked []bool) bool { 8 sp := slicePos([]int(s), pos) 9 if sp == -1 { 10 return true 11 } 12 min := 1 13 nums := make([]int, len(s)) 14 for n, p := range s { 15 nums[n] = su.Pos(p) 16 } 17 f := false 18 for i := 0; i < sp; i++ { 19 if mp := su.Pos(s[i]); mp == 0 { 20 min++ 21 } else if mp+1 > min { 22 min = mp + 1 23 } else if f { 24 return false 25 } 26 f = true 27 } 28 max := su.Chars() 29 f = false 30 for i := len(s) - 1; i > sp; i-- { 31 if mp := su.Pos(s[i]); mp == 0 { 32 max-- 33 } else if mp-1 < max { 34 max = mp - 1 35 } else if f { 36 return false 37 } 38 f = true 39 } 40 if max-min < 0 { 41 return false 42 } 43 for i := 1; i < min; i++ { 44 marked[i] = true 45 } 46 for i := su.Chars(); i > max; i-- { 47 marked[i] = true 48 } 49 return true 50 }