Day 12 solution.

This commit is contained in:
Anna Rose 2020-12-12 05:46:31 +00:00
parent ded23b8e78
commit 2804abb674
2 changed files with 150 additions and 1 deletions

148
2020/day12.go Normal file
View File

@ -0,0 +1,148 @@
package main
import (
"fmt"
"log"
"os"
"strconv"
"git.annabunch.es/annabunches/adventofcode/2020/lib/fileutils"
)
func distance(x1, y1, x2, y2 int) int {
dy := y2 - y1
dx := x2 - x1
if dy < 0 {
dy *= -1
}
if dx < 0 {
dx *= -1
}
return dx + dy
}
func rotate(x, y int, direction byte, degrees int) (int, int) {
turns := degrees / 90
newX := x
newY := y
for i := 0; i < turns; i++ {
hold := newX
newX = newY
newY = hold
switch direction {
case 'L':
newX *= -1
case 'R':
newY *= -1
}
}
return newX, newY
}
func step1(values []string) (int, int) {
facing := 90
x := 0
y := 0
for _, line := range values {
direction := line[0]
value, err := strconv.Atoi(line[1:])
if err != nil {
log.Panicf(err.Error())
}
switch direction {
case 'N':
y += value
case 'S':
y -= value
case 'E':
x += value
case 'W':
x -= value
case 'L':
facing -= value
case 'R':
facing += value
case 'F':
// the hard one
switch facing {
case 0:
y += value
case 90:
x += value
case 180:
y -= value
case 270:
x -= value
default:
log.Panicf("Oh no, ships can't face %d degrees!", facing)
}
}
if facing < 0 {
facing += 360
}
if facing >= 360 {
facing %= 360
}
}
return x, y
}
func step2(values []string) (int, int) {
x := 0
y := 0
wayX := 10
wayY := 1
for _, line := range values {
direction := line[0]
value, err := strconv.Atoi(line[1:])
if err != nil {
log.Panicf(err.Error())
}
switch direction {
case 'N':
wayY += value
case 'S':
wayY -= value
case 'E':
wayX += value
case 'W':
wayX -= value
case 'L':
wayX, wayY = rotate(wayX, wayY, direction, value)
case 'R':
wayX, wayY = rotate(wayX, wayY, direction, value)
case 'F':
for i := 0; i < value; i++ {
x += wayX
y += wayY
}
}
}
return x, y
}
func main() {
step := os.Args[1]
values := fileutils.InputParserStrings(os.Args[2])
x := 0
y := 0
switch step {
case "1":
x, y = step1(values)
case "2":
x, y = step2(values)
}
fmt.Println(distance(x, y, 0, 0))
}

View File

@ -57,7 +57,8 @@ func InputParserStrings(filename string) []string {
if err != nil { if err != nil {
log.Panicf(err.Error()) log.Panicf(err.Error())
} }
return strings.Split(string(data), "\n") output := strings.Split(string(data), "\n")
return output[:len(output)-1]
} }
func InputParserBytes(filename string) [][]byte { func InputParserBytes(filename string) [][]byte {