From 859ac1635e828ba51130ddf549a654aa61f44a57 Mon Sep 17 00:00:00 2001 From: Ben Charlton Date: Tue, 19 Dec 2017 10:23:02 +0000 Subject: [PATCH] day 19 --- 19/19.go | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 19/19.go diff --git a/19/19.go b/19/19.go new file mode 100644 index 0000000..7e693be --- /dev/null +++ b/19/19.go @@ -0,0 +1,98 @@ +package main + +import ( + "bufio" + "fmt" + "os" +) + +// Coords are y,x as first grid array index = y coord. +var lookpos = [][]int{{0, 1}, {1, 0}, {-1, 0}, {0, -1}} + +// cat input | go run 19.go + +func main() { + + var grid []string + + scanner := bufio.NewScanner(os.Stdin) + + for scanner.Scan() { + grid = append(grid, scanner.Text()) + + } + + cx, cy := findStart(grid) + dx, dy := 0, 1 + + steps := 0 + for cx != -1 && cy != -1 { + + switch grid[cy][cx] { + case '|': + case '-': + case '+': + default: + fmt.Print(string(grid[cy][cx])) + } + + cx, cy, dx, dy = findNext(grid, cx, cy, dx, dy) + steps++ + } + fmt.Println(steps - 1) + +} + +func findStart(grid []string) (int, int) { + for x := range grid[0] { + if grid[0][x] != ' ' { + return x, 0 + } + } + return -1, -1 +} + +func findNext(grid []string, cx int, cy int, dx int, dy int) (int, int, int, int) { + + nextX := cx + dx + nextY := cy + dy + prevX := cx - dx + prevY := cy - dy + + current := grid[cy][cx] + + if current == '+' { + // Check for direction change + for check := range lookpos { + xp := cx + lookpos[check][1] + yp := cy + lookpos[check][0] + //fmt.Println("pos:", xp, yp) + + // Don't go backwards + if xp == prevX && yp == prevY { + continue + } + // Bounds checking + if xp < 0 || xp >= len(grid[0]) { + continue + } + if yp < 0 || yp >= len(grid) { + continue + } + + // Skip blanks. + if grid[yp][xp] == ' ' { + continue + } + // Set new direction + dx = xp - cx + dy = yp - cy + //fmt.Println("dir:", dx, dy) + return xp, yp, dx, dy + } + } + + // No direction change + return nextX, nextY, dx, dy + +}