adventofcode2017/11/11.go

89 lines
1.2 KiB
Go

package main
import (
"bufio"
"fmt"
"math"
"os"
"strings"
)
// cat input | go run 11.go
func main() {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
s := strings.Split(scanner.Text(), ",")
fmt.Println(CalcDistance(s))
}
}
func CalcDistance(s []string) []int {
x := 0
ne := 0
max := 0
// I had a crack at this with an approximation of a cube based coordinate system
// but the maths is hard and I suck. In the end I sought inspiration from
// https://www.redblobgames.com/grids/hexagons/ - and am now using axial coordinates
for dir := range s {
switch s[dir] {
case "n":
ne++
case "s":
ne--
case "se":
x++
case "sw":
x--
ne--
case "ne":
x++
ne++
case "nw":
x--
}
// Inefficient, but I'm running out of lunchtime.
cd := getDistance(x, ne)
if cd > max {
max = cd
}
}
cd := getDistance(x, ne)
return []int{cd, max}
}
func getDistance(x int, ne int) int {
steps := 0
for !(ne == 0 || x == 0) {
switch {
case ne > 0 && x > 0:
steps++
ne--
x--
case ne < 0 && x > 0:
steps++
ne++
case ne > 0 && x < 0:
steps++
x++
case ne < 0 && x < 0:
steps++
ne++
x++
}
}
return (steps + int(math.Abs(float64(x))) + int(math.Abs(float64(ne))))
}