puzzle-solvers

Assorted solvers for various puzzles

git clone https://code.pdelong.com/puzzle-solvers.git

  1package main
  2
  3import (
  4	"fmt"
  5	"go/format"
  6	"os"
  7	"strings"
  8)
  9
 10func generate() (string, error) {
 11	w := &strings.Builder{}
 12
 13	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++ {
 17
 18		row := i / 9
 19		col := i % 9
 20
 21		box := (row/3)*3 + (col/3)%3
 22		rowBase := (box / 3) * 3
 23		colBase := (box % 3) * 3
 24
 25		neighbors := [81]int{}
 26		for j := 0; j < 9; j++ {
 27			neighbors[row*9+j] = 1
 28			neighbors[j*9+col] = 1
 29		}
 30
 31		for row := rowBase; row < rowBase+3; row++ {
 32			for col := colBase; col < colBase+3; col++ {
 33				neighbors[row*9+col] = 1
 34			}
 35		}
 36
 37		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)
 47
 48	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 + col
 54			affectedUnits[idx] = append(affectedUnits[idx], len(units))
 55			unit[col] = idx
 56		}
 57		units = append(units, unit)
 58	}
 59
 60	for col := 0; col < 9; col++ {
 61		unit := [9]int{}
 62		for row := 0; row < 9; row++ {
 63			idx := row*9 + col
 64			unit[row] = idx
 65			affectedUnits[idx] = append(affectedUnits[idx], len(units))
 66		}
 67		units = append(units, unit)
 68	}
 69
 70	for box := 0; box < 9; box++ {
 71		rowBase := (box / 3) * 3
 72		colBase := (box % 3) * 3
 73		unit := [9]int{}
 74		i := 0
 75		for row := rowBase; row < rowBase+3; row++ {
 76			for col := colBase; col < colBase+3; col++ {
 77				idx := row*9 + col
 78				affectedUnits[idx] = append(affectedUnits[idx], len(units))
 79
 80				unit[i] = idx
 81				i++
 82			}
 83		}
 84		units = append(units, unit)
 85	}
 86
 87	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, "}")
 96
 97	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, "}")
106
107	b, err := format.Source([]byte(w.String()))
108	if err != nil {
109		return "", err
110	}
111
112	return string(b), nil
113}
114
115func main() {
116	f, err := os.Create("neighbors.go")
117	if err != nil {
118		panic(err)
119	}
120	defer f.Close()
121
122	s, err := generate()
123	if err != nil {
124		panic(err)
125	}
126
127	_, err = f.WriteString(s)
128	if err != nil {
129		panic(err)
130	}
131}