My code for Advent of Code 2020 in Go
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
1.9 KiB

package main
import (
"bufio"
"fmt"
"math"
"os"
"strconv"
)
func main() {
type command struct {
action rune
value int
}
var commands []command
file, _ := os.Open("input.txt")
defer file.Close()
for scanner := bufio.NewScanner(file); scanner.Scan(); {
text := scanner.Text()
value, _ := strconv.Atoi(text[1:])
commands = append(commands, command{
action: rune(text[0]),
value: value,
})
}
shipNorth, shipEast, shipDirection := 0, 0, 90
for _, cmd := range commands {
switch cmd.action {
case 'N':
shipNorth += cmd.value
case 'S':
shipNorth -= cmd.value
case 'E':
shipEast += cmd.value
case 'W':
shipEast -= cmd.value
case 'L':
shipDirection -= cmd.value
shipDirection %= 360
case 'R':
shipDirection += cmd.value
shipDirection %= 360
case 'F':
switch shipDirection {
case 0:
shipNorth += cmd.value
case 90, -270:
shipEast += cmd.value
case 180, -180:
shipNorth -= cmd.value
case 270, -90:
shipEast -= cmd.value
}
}
}
fmt.Println("Part 1:", math.Abs(float64(shipNorth))+math.Abs(float64(shipEast)))
wpNorth, wpEast := 1, 10
shipNorth = 0
shipEast = 0
var rotateWaypoint func(int)
rotateWaypoint = func(degree int) {
switch degree {
case 90, -270:
newWpNorth, newWpEast := -wpEast, wpNorth
wpNorth = newWpNorth
wpEast = newWpEast
case 180, -180:
rotateWaypoint(90)
rotateWaypoint(90)
case 270, -90:
rotateWaypoint(90)
rotateWaypoint(90)
rotateWaypoint(90)
}
}
for _, cmd := range commands {
switch cmd.action {
case 'N':
wpNorth += cmd.value
case 'S':
wpNorth -= cmd.value
case 'E':
wpEast += cmd.value
case 'W':
wpEast -= cmd.value
case 'L':
rotateWaypoint(-cmd.value)
case 'R':
rotateWaypoint(cmd.value)
case 'F':
shipNorth += wpNorth * cmd.value
shipEast += wpEast * cmd.value
}
}
fmt.Println("Part 2:", math.Abs(float64(shipNorth))+math.Abs(float64(shipEast)))
}