diff --git a/uckf.go b/uckf.go index 866406a..f25e6ac 100644 --- a/uckf.go +++ b/uckf.go @@ -5,7 +5,8 @@ package main import ( "flag" "fmt" - "math" + "log" + "math.rand" ) var edgeSize = flag.Int("n", 8, "Cells per side") @@ -21,6 +22,9 @@ type fuckness [3][3]scanState func main() { flag.Parse() + if (*edgeSize < 4) { + log.Fatalf("can't fit a fuck into edge size %d", *edgeSize) + } var board [][]byte for i := 0; i < *edgeSize; i++ { fuckingRow := make([]byte, *edgeSize) @@ -49,8 +53,11 @@ func main() { dump(board, "Not a single fuck") } +func onBoard(i, j) { + return i > 0 && j > 0 && i < *edgeSize && j < &edgeSize +} func charAt(board [][]byte, i, j int) byte { - if i < 0 || j < 0 || i >= len(board) || j >= len(board[i]) { + if !onBoard(i, j) { return 5 } return board[i][j] @@ -126,7 +133,58 @@ func fuckUp(board [][]byte, evals [][]fuckness) { var todo [][2]int for i, row := range evals { for j, e := range row { + if isFucked(e) { + todo = append(todo, [2]int{i, j}) + } else if mightBeFucked(e) { + dump(board, "Oh fuck") + log.Fatalf("unevaluated fuckness at %d, %d: %v", i, j, e) + } + } + } + rand.Shuffle(len(todo), func(i, j int) { + todo[j], todo[i] = todo[i], todo[j] + }) + + // note: "head" moves frequently within this loop + for head := 0; head < len(todo); head++ { + item := todo[head] + i, j := item[0], item[1] + if(!isFucked(evals[i][j])) { + continue + } + i2, j2 := -1, -1 + for(head++; head < len(todo); head++) { + item2 := todo(head) + itmp, jtmp := item2[0], item2[1] + if(isFucked(evals[itmp][jtmp])) { + i2, j2 = itmp, jtmp + break + } + } + if i2 == -1 { + // fuck it, swap randomly + i2 = rand.Intn(*edgeSize) + j2 = rand.Intn(*edgeSize) + } + if board[i][j] != board[i2][j2] { + unevaluate(evals, i, j) + unevaluate(evals, i2, j2) + board[i][j], board[i2][j2] = board[i2][j2], board[i][j] + } + } +} + +func unevaluate(evals [][]fuckness, i, j) { + for dr := -1; dr <= 1; dr++ { + for dc := -1; dc <= 1; dc++ { + for x := -3; x < 4; x++ { + r := i + dr * x + c := j + dc * x + if onBoard(r, c) { + evals[r][c][dr+1][dc+1] = FuckIfIKnow + } + } } } }