Day 3: spiral
This commit is contained in:
parent
c7191b0d91
commit
a3b2c6603e
94
03dec/main.go
Normal file
94
03dec/main.go
Normal file
@ -0,0 +1,94 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const (
|
||||
// directions
|
||||
W = iota
|
||||
N
|
||||
E
|
||||
S
|
||||
)
|
||||
|
||||
var (
|
||||
// current value
|
||||
cur int
|
||||
// current position
|
||||
x, y int
|
||||
// current direction
|
||||
dir int
|
||||
// grid bounds
|
||||
xmax, xmin, ymax, ymin int
|
||||
)
|
||||
|
||||
func main() {
|
||||
n, err := strconv.Atoi(os.Args[1])
|
||||
if err != nil {
|
||||
os.Exit(1)
|
||||
}
|
||||
// move current position in grid and compute change direction, expand grid
|
||||
for cur < n {
|
||||
nextMove()
|
||||
// fmt.Println(cur, x, y)
|
||||
}
|
||||
// distance to position
|
||||
fmt.Println(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
|
||||
}
|
Loading…
Reference in New Issue
Block a user