64 lines
1.4 KiB
Go
64 lines
1.4 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
|
||
|
h "git.bullercodeworks.com/brian/adventofcode/helpers"
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
inp := h.StdinToStringSlice()
|
||
|
part1(inp)
|
||
|
fmt.Println()
|
||
|
part2(inp)
|
||
|
}
|
||
|
|
||
|
func part1(input []string) {
|
||
|
dirMap := map[byte]h.Coordinate{
|
||
|
'U': h.Coordinate{X: 0, Y: -1},
|
||
|
'R': h.Coordinate{X: 1, Y: 0},
|
||
|
'D': h.Coordinate{X: 0, Y: 1},
|
||
|
'L': h.Coordinate{X: -1, Y: 0},
|
||
|
}
|
||
|
|
||
|
curr, area := h.Coordinate{X: 0, Y: 0}, 0
|
||
|
for i := range input {
|
||
|
pts := strings.Fields(input[i])
|
||
|
dir, length, _ := pts[0][0], h.Atoi(pts[1]), strings.Trim(pts[1], "()")
|
||
|
n := curr.Add(dirMap[dir].Mul(length))
|
||
|
area += curr.X*n.Y - curr.Y*n.X + length
|
||
|
curr = n
|
||
|
}
|
||
|
fmt.Println("# Part 1")
|
||
|
fmt.Println(area/2 + 1)
|
||
|
}
|
||
|
|
||
|
func part2(input []string) {
|
||
|
dirMap := map[byte]h.Coordinate{
|
||
|
'3': h.Coordinate{X: 0, Y: -1},
|
||
|
'0': h.Coordinate{X: 1, Y: 0},
|
||
|
'1': h.Coordinate{X: 0, Y: 1},
|
||
|
'2': h.Coordinate{X: -1, Y: 0},
|
||
|
}
|
||
|
|
||
|
hexToDec := func(hex string) int {
|
||
|
v, _ := strconv.ParseInt(hex, 16, strconv.IntSize)
|
||
|
return int(v)
|
||
|
}
|
||
|
curr, area := h.Coordinate{X: 0, Y: 0}, 0
|
||
|
for i := range input {
|
||
|
pts := strings.Fields(input[i])
|
||
|
pts[2] = strings.Trim(pts[2], "#()")
|
||
|
length := hexToDec(pts[2][:len(pts[2])-1])
|
||
|
dir := pts[2][len(pts[2])-1:][0]
|
||
|
|
||
|
n := curr.Add(dirMap[dir].Mul(length))
|
||
|
area += curr.X*n.Y - curr.Y*n.X + length
|
||
|
curr = n
|
||
|
}
|
||
|
fmt.Println("# Part 2")
|
||
|
fmt.Println(area/2 + 1)
|
||
|
}
|