2020-day12: 243 on part 1, then confused the heck out of myself for part 2 w/ x/y vs row/col vs x,y coordinates and rotating around the origin..

This commit is contained in:
alexchao26
2020-12-12 01:14:53 -05:00
parent 94aaf24b9d
commit 975bc3346d
2 changed files with 111 additions and 17 deletions
+96 -12
View File
@@ -5,6 +5,7 @@ import (
"fmt"
"strings"
"github.com/alexchao26/advent-of-code-go/mathutil"
"github.com/alexchao26/advent-of-code-go/util"
)
@@ -16,35 +17,118 @@ func main() {
if part == 1 {
ans := part1(util.ReadFile("./input.txt"))
util.CopyToClipboard(fmt.Sprintf("%v", ans))
fmt.Println("Output:", ans)
} else {
ans := part2(util.ReadFile("./input.txt"))
util.CopyToClipboard(fmt.Sprintf("%v", ans))
fmt.Println("Output:", ans)
}
}
func part1(input string) int {
parsed := parseInput(input)
_ = parsed
// globals for part 1
var directions = []string{"N", "E", "S", "W"}
var directionsToDiff = map[string][2]int{
// !! X and Y like a coordinate system! Not typical 2D matrices in algos
"N": [2]int{0, 1},
"E": [2]int{1, 0},
"S": [2]int{0, -1},
"W": [2]int{-1, 0},
}
return 0
func part1(input string) int {
instructions := parseInput(input)
// X and Y like a coordinate system
var shipX, shipY int
dirIndex := 1 // index in directions slice
for _, inst := range instructions {
switch inst.action {
case "N":
shipY += inst.value
case "S":
shipY -= inst.value
case "E":
shipX += inst.value
case "W":
shipX -= inst.value
case "L":
// rotate ship left, this is equivalent
// -1 + 4 to keeping dirIndex positive for the modding
dirIndex += (-1 + 4) * inst.value / 90
dirIndex %= 4
case "R":
dirIndex += inst.value / 90
dirIndex %= 4
case "F":
d := directionsToDiff[directions[dirIndex]]
shipX += d[0] * inst.value
shipY += d[1] * inst.value
default:
panic("unexpected action")
}
}
return mathutil.ManhattanDistance(0, 0, shipX, shipY)
}
func part2(input string) int {
parsed := parseInput(input)
_ = parsed
instructions := parseInput(input)
return 0
// X and Y like a coordinate system
waypointX := 10
waypointY := 1
var shipX, shipY int
for _, inst := range instructions {
switch inst.action {
case "N":
waypointY += inst.value
case "S":
waypointY -= inst.value
case "E":
waypointX += inst.value
case "W":
waypointX -= inst.value
case "L":
// rotate waypoint left around ship (origin)
turns := inst.value / 90
for turns > 0 {
// this simple bit is all it needs to rotate around the origin
// I had a 20 line if/else block...
waypointX, waypointY = -waypointY, waypointX
turns--
}
case "R":
turns := inst.value / 90
for turns > 0 {
waypointX, waypointY = waypointY, -waypointX
turns--
}
case "F":
shipX += inst.value * waypointX
shipY += inst.value * waypointY
default:
panic("unexpected action")
}
}
return mathutil.ManhattanDistance(0, 0, shipX, shipY)
}
func parseInput(input string) []int {
var ans []int
type instruction struct {
action string
value int
}
func parseInput(input string) []instruction {
var ans []instruction
lines := strings.Split(input, "\n")
for _, l := range lines {
ans = append(ans, mathutil.StrToInt(l))
inst := instruction{
action: l[:1],
value: mathutil.StrToInt(l[1:]),
}
ans = append(ans, inst)
}
return ans
+15 -5
View File
@@ -1,14 +1,24 @@
package main
import "testing"
import (
"testing"
"github.com/alexchao26/advent-of-code-go/util"
)
var exampleInput = `F10
N3
F7
R90
F11`
var tests1 = []struct {
name string
want int
input string
// add extra args if needed
}{
// {"actual", ACTUAL_ANSWER, util.ReadFile("input.txt")},
{"example", 25, exampleInput},
{"actual", 820, util.ReadFile("input.txt")},
}
func TestPart1(t *testing.T) {
@@ -25,9 +35,9 @@ var tests2 = []struct {
name string
want int
input string
// add extra args if needed
}{
// {"actual", ACTUAL_ANSWER, util.ReadFile("input.txt")},
{"example", 286, exampleInput},
{"actual", 66614, util.ReadFile("input.txt")},
}
func TestPart2(t *testing.T) {