From 302e593f0f7b29f56a057652ec0fc3e17d2d1997 Mon Sep 17 00:00:00 2001
From: Ben Charlton <ben@spod.cx>
Date: Mon, 11 Dec 2017 13:44:13 +0000
Subject: [PATCH] day 11

---
 11/11.go | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 84 insertions(+)
 create mode 100644 11/11.go

diff --git a/11/11.go b/11/11.go
new file mode 100644
index 0000000..8bcec4d
--- /dev/null
+++ b/11/11.go
@@ -0,0 +1,84 @@
+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(), ",")
+
+		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
+			}
+
+		}
+
+		fmt.Println(getDistance(x, ne), 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))))
+}