adventofcode/03dec/main.go
2017-12-03 18:20:57 +01:00

96 lines
1.1 KiB
Go

package main
import (
"fmt"
"os"
"strconv"
)
const (
W = iota
N
E
S
)
var (
cur int
x int
y int
dir int
xmax int
xmin int
ymax int
ymin int
)
func main() {
n, err := strconv.Atoi(os.Args[1])
if err != nil {
os.Exit(1)
}
fmt.Println(n)
// create cell and compute change direction, expand grid
for cur < n {
nextMove()
fmt.Println(cur, x, y)
}
fmt.Println("\n", Abs(x)+Abs(y))
}
func nextMove() {
if cur == 0 {
dir = S
} else {
x1, y1 := dirMove()
if outOfBound(x1, y1) {
changeDir()
x1, y1 = dirMove()
}
x, y = x1, y1
}
cur++
}
func dirMove() (int, int) {
switch dir {
case W:
return x - 1, y
case N:
return x, y + 1
case E:
return x + 1, y
case S:
return x, y - 1
default:
return x, y
}
}
func outOfBound(x1 int, y1 int) bool {
return x1 > xmax || x1 < xmin || y1 > ymax || y1 < ymin
}
func changeDir() {
switch dir {
case W:
dir = S
ymin--
case N:
dir = W
xmin--
case E:
dir = N
ymax++
case S:
dir = E
xmax++
}
}
func Abs(n int) int {
if n < 0 {
return -n
}
return n
}