115 lines
2.2 KiB
Go
115 lines
2.2 KiB
Go
|
// uckf creates a deeply unsatisfying word search.
|
||
|
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"flag"
|
||
|
"fmt"
|
||
|
"math"
|
||
|
)
|
||
|
|
||
|
var edgeSize = flag.Int("n", 8, "Cells per side")
|
||
|
|
||
|
type scanState int
|
||
|
const (
|
||
|
FuckIfIKnow scanState = iota
|
||
|
Fucked
|
||
|
NotFucked
|
||
|
)
|
||
|
|
||
|
type fuckness [3][3]scanState
|
||
|
|
||
|
func main() {
|
||
|
flag.Parse()
|
||
|
var board [][]byte
|
||
|
for i := 0; i < *edgeSize; i++ {
|
||
|
fuckingRow := make([]byte, *edgeSize)
|
||
|
for j := 0; j < *edgeSize; j++ {
|
||
|
fuckingRow[j] = (i+j)%4
|
||
|
}
|
||
|
board=append(board, fuckingRow)
|
||
|
}
|
||
|
|
||
|
dump(board, "Starting position")
|
||
|
|
||
|
evals := [][]fuckness
|
||
|
for i := 0; i < *edgeSize; i++ {
|
||
|
evals = append(evals, make([]fuckness, *edgeSize))
|
||
|
}
|
||
|
|
||
|
iterations := uint64(0)
|
||
|
for(isStillFucked(board, evals)) {
|
||
|
fuckUp(board, evals)
|
||
|
iterations++
|
||
|
if isPow2(iterations) {
|
||
|
dump(board, fmt.Sprint("Iteration", iterations))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
dump(board, "Not a single fuck")
|
||
|
}
|
||
|
|
||
|
func charAt(board [][]byte, i, j int) byte {
|
||
|
if i < 0 || j < 0 || i >= len(board) || j >= len(board[i]) {
|
||
|
return 5
|
||
|
}
|
||
|
return board[i][j]
|
||
|
}
|
||
|
|
||
|
func isStillFucked(board [][]byte, evals[][]fuckness) {
|
||
|
isFucked := false
|
||
|
for i, row := range board {
|
||
|
for j, c := range row {
|
||
|
for dr := -1; dr <= 1; dr++ {
|
||
|
for dc := -1; dc <= 1; dc++ {
|
||
|
if dr == 0 && dc == 0 {
|
||
|
continue
|
||
|
}
|
||
|
if evals[i][j][dr+1][dc+1] != FuckIfIKnow {
|
||
|
continue
|
||
|
}
|
||
|
// find theoretical start of fuck
|
||
|
fRow, fCol := i + int(c)*dr, j + int(c)*dr
|
||
|
// evaluate fuckness
|
||
|
locallyFucked := true
|
||
|
for w := 0; w < 4; w++ {
|
||
|
if charAt(board, i+w*dr, j+w*dc) != byte(w) {
|
||
|
locallyFucked = false
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
if locallyFucked {
|
||
|
// mark every letter involved as fucked
|
||
|
isFucked = true
|
||
|
for w := 0; w < 4; w++ {
|
||
|
evals[i+w*dr][j+w*dc][dr+1][dc+1] = Fucked
|
||
|
}
|
||
|
} else {
|
||
|
evals[i][j][dr+1][dc+1] = NotFucked
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return isFucked
|
||
|
}
|
||
|
|
||
|
func fuckUp(board [][]byte, evals [][]fuckness) {
|
||
|
|
||
|
}
|
||
|
|
||
|
func dump(board [][]byte, title string) {
|
||
|
fmt.Println()
|
||
|
for i := 0; i < *edgeSize; i++ {
|
||
|
fmt.Print("--")
|
||
|
}
|
||
|
fmt.Println()
|
||
|
fmt.Println(title)
|
||
|
fmt.Println()
|
||
|
for _, row := range board {
|
||
|
for _, r := range row {
|
||
|
fmt.Printf("%c ", "fuck"[r])
|
||
|
}
|
||
|
fmt.Println()
|
||
|
}
|
||
|
}
|