98 lines
1.5 KiB
Go
98 lines
1.5 KiB
Go
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
|
|
|
|
}
|