Day 12 solution.
This commit is contained in:
parent
ded23b8e78
commit
2804abb674
148
2020/day12.go
Normal file
148
2020/day12.go
Normal 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))
|
||||
}
|
|
@ -57,7 +57,8 @@ func InputParserStrings(filename string) []string {
|
|||
if err != nil {
|
||||
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 {
|
||||
|
|
Loading…
Reference in New Issue
Block a user