1package main23import (4 "fmt"5 "go/format"6 "os"7 "strings"8)910func generate() (string, error) {11 w := &strings.Builder{}1213 fmt.Fprintln(w, "package solver")14 fmt.Fprintln(w)15 fmt.Fprintln(w, "var neighbors = [81][20]int {")16 for i := 0; i < 81; i++ {1718 row := i / 919 col := i % 92021 box := (row/3)*3 + (col/3)%322 rowBase := (box / 3) * 323 colBase := (box % 3) * 32425 neighbors := [81]int{}26 for j := 0; j < 9; j++ {27 neighbors[row*9+j] = 128 neighbors[j*9+col] = 129 }3031 for row := rowBase; row < rowBase+3; row++ {32 for col := colBase; col < colBase+3; col++ {33 neighbors[row*9+col] = 134 }35 }3637 fmt.Fprint(w, "{ ")38 for j := 0; j < 81; j++ {39 if neighbors[j] > 0 && j != i {40 fmt.Fprintf(w, "%d, ", j)41 }42 }43 fmt.Fprintln(w, "},")44 }45 fmt.Fprintln(w, "}")46 fmt.Fprintln(w)4748 units := [][9]int{}49 affectedUnits := [81][]int{}50 for row := 0; row < 9; row++ {51 unit := [9]int{}52 for col := 0; col < 9; col++ {53 idx := row*9 + col54 affectedUnits[idx] = append(affectedUnits[idx], len(units))55 unit[col] = idx56 }57 units = append(units, unit)58 }5960 for col := 0; col < 9; col++ {61 unit := [9]int{}62 for row := 0; row < 9; row++ {63 idx := row*9 + col64 unit[row] = idx65 affectedUnits[idx] = append(affectedUnits[idx], len(units))66 }67 units = append(units, unit)68 }6970 for box := 0; box < 9; box++ {71 rowBase := (box / 3) * 372 colBase := (box % 3) * 373 unit := [9]int{}74 i := 075 for row := rowBase; row < rowBase+3; row++ {76 for col := colBase; col < colBase+3; col++ {77 idx := row*9 + col78 affectedUnits[idx] = append(affectedUnits[idx], len(units))7980 unit[i] = idx81 i++82 }83 }84 units = append(units, unit)85 }8687 fmt.Fprintln(w, "var units = [27][9]int {")88 for _, unit := range units {89 fmt.Fprint(w, "\t{")90 for _, idx := range unit {91 fmt.Fprintf(w, "%d, ", idx)92 }93 fmt.Fprint(w, "},\n")94 }95 fmt.Fprintln(w, "}")9697 fmt.Fprintln(w, "var affectedUnits = [81][3]int {")98 for _, unit := range affectedUnits {99 fmt.Fprint(w, "\t{")100 for _, idx := range unit {101 fmt.Fprintf(w, "%d, ", idx)102 }103 fmt.Fprint(w, "},\n")104 }105 fmt.Fprintln(w, "}")106107 b, err := format.Source([]byte(w.String()))108 if err != nil {109 return "", err110 }111112 return string(b), nil113}114115func main() {116 f, err := os.Create("neighbors.go")117 if err != nil {118 panic(err)119 }120 defer f.Close()121122 s, err := generate()123 if err != nil {124 panic(err)125 }126127 _, err = f.WriteString(s)128 if err != nil {129 panic(err)130 }131}