uckf/uckf.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()
}
}