1
0
Files
Advent-of-Code/days/src/main/kotlin/Day12.kt
T
2020-12-12 07:23:40 +01:00

87 lines
2.2 KiB
Kotlin

package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
import kotlin.math.abs
@Day(12)
class Day12(@Lines val input: Input<List<String>>) {
fun part1(): Int {
var x = 0
var y = 0
var facing = "E"
val dirs = listOf("N", "E", "S", "W")
input.value.forEach {
val dir = it.take(1)
val steps = it.drop(1).toInt()
when (dir) {
"L" -> repeat(steps / 90) {
val i = (dirs.indexOf(facing) + 4 - 1) % 4
facing = dirs[i]
}
"R" -> repeat(steps / 90) {
val i = (dirs.indexOf(facing) + 1) % 4
facing = dirs[i]
}
}
when (if (dir == "F") facing else dir) {
"N" -> y -= steps
"S" -> y += steps
"W" -> x -= steps
"E" -> x += steps
}
}
return abs(x) + abs(y)
}
fun part2(): Int {
var x = 0
var y = 0
var waypointX = 10
var waypointY = -1
input.value.forEach {
val dir = it.take(1)
val steps = it.drop(1).toInt()
when (dir) {
"L" -> repeat(steps / 90) {
val oldY = waypointY
waypointY = -waypointX
waypointX = oldY
}
"R" -> repeat(steps / 90) {
val oldY = waypointY
waypointY = waypointX
waypointX = -oldY
}
"F" -> {
x += waypointX * steps
y += waypointY * steps
}
"N" -> waypointY -= steps
"S" -> waypointY += steps
"W" -> waypointX -= steps
"E" -> waypointX += steps
}
}
return abs(x) + abs(y)
}
}
fun main() = with(createDay<Day12>()) {
println(part1())
println(part2())
}