1package takuzu23import (4 "strings"5)67const (8 emptyCell rune = '.'9 zeroCell rune = '0'10 oneCell rune = '1'11)1213const (14 EmptyCell = emptyCell15 ZeroCell = zeroCell16 OneCell = oneCell17)1819type (20 grid [][]rune21 state string22)2324func newGrid(s state) grid {25 rows := strings.Split(string(s), "\n")26 g := make(grid, len(rows))27 for i, row := range rows {28 g[i] = []rune(row)29 }30 return g31}3233func (g grid) String() string {34 rows := make([]string, len(g))35 for i, row := range g {36 rows[i] = string(row)37 }38 return strings.Join(rows, "\n")39}4041func createEmptyState(size int) state {42 var b strings.Builder43 b.Grow((size + 1) * size)44 for y := range size {45 for range size {46 b.WriteRune(emptyCell)47 }48 if y < size-1 {49 b.WriteRune('\n')50 }51 }52 return state(b.String())53}5455func (g grid) clone() grid {56 c := make(grid, len(g))57 for i, row := range g {58 c[i] = make([]rune, len(row))59 copy(c[i], row)60 }61 return c62}6364func CloneGrid(g [][]rune) [][]rune {65 return grid(g).clone()66}6768func CreateEmptyGrid(size int) [][]rune {69 return newGrid(createEmptyState(size)).clone()70}