clone

fifteen puzzle games for the terminal, with daily puzzles, weekly ladders and xp, built on bubble tea

chore/regenerate-vhs-gifs
puzzletea / sudokurgb / cell.go
cell.go 1.8K
1package sudokurgb23import "fmt"45type cell struct {6 x, y int7 v int8}910type grid = [gridSize][gridSize]cell1112func newGrid(provided []cell) grid {13 var g grid14 for y := range gridSize {15 for x := range gridSize {16 g[y][x] = cell{x: x, y: y}17 }18 }19 for _, hint := range provided {20 g[hint.y][hint.x].v = hint.v21 }22 return g23}2425func (c cell) String() string {26 return fmt.Sprintf("r%dc%d=%d", c.y, c.x, c.v)27}2829func (m Model) isSolved() bool {30 return isSolvedWith(m.grid, m.analysis)31}3233func isSolvedWith(g grid, analysis boardAnalysis) bool {34 for y := range gridSize {35 for x := range gridSize {36 if g[y][x].v == 0 {37 return false38 }39 }40 }4142 if analysis.hasConflicts() {43 return false44 }4546 for i := range gridSize {47 if !houseHasExactQuota(rowValues(g, i)) {48 return false49 }50 if !houseHasExactQuota(colValues(g, i)) {51 return false52 }53 }5455 for box := range gridSize {56 if !houseHasExactQuota(boxValues(g, box)) {57 return false58 }59 }6061 return true62}6364func rowValues(g grid, y int) [gridSize]int {65 var values [gridSize]int66 for x := range gridSize {67 values[x] = g[y][x].v68 }69 return values70}7172func colValues(g grid, x int) [gridSize]int {73 var values [gridSize]int74 for y := range gridSize {75 values[y] = g[y][x].v76 }77 return values78}7980func boxValues(g grid, box int) [gridSize]int {81 var values [gridSize]int82 boxX, boxY := (box%3)*3, (box/3)*383 index := 084 for dy := range 3 {85 for dx := range 3 {86 values[index] = g[boxY+dy][boxX+dx].v87 index++88 }89 }90 return values91}9293func houseHasExactQuota(values [gridSize]int) bool {94 var counts [valueCount + 1]int95 for _, value := range values {96 if value < 1 || value > valueCount {97 return false98 }99 counts[value]++100 }101 for value := 1; value <= valueCount; value++ {102 if counts[value] != houseQuota {103 return false104 }105 }106 return true107}