diff --git a/uckf.go b/uckf.go index f25e6ac..9479c4b 100644 --- a/uckf.go +++ b/uckf.go @@ -6,10 +6,10 @@ import ( "flag" "fmt" "log" - "math.rand" + "math/rand" ) -var edgeSize = flag.Int("n", 8, "Cells per side") +var edgeSize = flag.Int("n", 4, "Cells per side") type scanState int const ( @@ -29,32 +29,34 @@ func main() { for i := 0; i < *edgeSize; i++ { fuckingRow := make([]byte, *edgeSize) for j := 0; j < *edgeSize; j++ { - fuckingRow[j] = (i+j)%4 + fuckingRow[j] = byte((i+j)%4) } board=append(board, fuckingRow) } dump(board, "Starting position") - evals := [][]fuckness + var evals [][]fuckness for i := 0; i < *edgeSize; i++ { evals = append(evals, make([]fuckness, *edgeSize)) } iterations := uint64(0) + scream := uint64(1) for(isStillFucked(board, evals)) { fuckUp(board, evals) iterations++ - if isPow2(iterations) { + if iterations >= scream { dump(board, fmt.Sprint("Iteration", iterations)) + scream = iterations << 1 } } dump(board, "Not a single fuck") } -func onBoard(i, j) { - return i > 0 && j > 0 && i < *edgeSize && j < &edgeSize +func onBoard(i, j int) bool { + return i > 0 && j > 0 && i < *edgeSize && j < *edgeSize } func charAt(board [][]byte, i, j int) byte { if !onBoard(i, j) { @@ -63,7 +65,7 @@ func charAt(board [][]byte, i, j int) byte { return board[i][j] } -func isStillFucked(board [][]byte, evals[][]fuckness) { +func isStillFucked(board [][]byte, evals[][]fuckness) bool { isFucked := false for i, row := range board { for j, c := range row { @@ -72,15 +74,19 @@ func isStillFucked(board [][]byte, evals[][]fuckness) { if dr == 0 && dc == 0 { continue } + if evals[i][j][dr+1][dc+1] == Fucked { + isFucked = true + 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 + fRow, fCol := i + int(c)*-dr, j + int(c)*-dc // evaluate fuckness locallyFucked := true for w := 0; w < 4; w++ { - if charAt(board, i+w*dr, j+w*dc) != byte(w) { + if charAt(board, fRow+w*dr, fCol+w*dc) != byte(w) { locallyFucked = false break } @@ -154,8 +160,8 @@ func fuckUp(board [][]byte, evals [][]fuckness) { continue } i2, j2 := -1, -1 - for(head++; head < len(todo); head++) { - item2 := todo(head) + for head++; head < len(todo); head++ { + item2 := todo[head] itmp, jtmp := item2[0], item2[1] if(isFucked(evals[itmp][jtmp])) { i2, j2 = itmp, jtmp @@ -175,7 +181,7 @@ func fuckUp(board [][]byte, evals [][]fuckness) { } } -func unevaluate(evals [][]fuckness, i, j) { +func unevaluate(evals [][]fuckness, i, j int) { for dr := -1; dr <= 1; dr++ { for dc := -1; dc <= 1; dc++ { for x := -3; x < 4; x++ {