|
|
@@ -2,6 +2,9 @@ package de.doriansnowball.adventofcode
|
|
|
|
|
|
import java.io.File
|
|
|
import kotlin.math.abs
|
|
|
+import kotlin.math.cos
|
|
|
+import kotlin.math.roundToInt
|
|
|
+import kotlin.math.sin
|
|
|
|
|
|
fun main() {
|
|
|
solvePuzzle12()
|
|
|
@@ -9,29 +12,31 @@ fun main() {
|
|
|
|
|
|
private fun solvePuzzle12() {
|
|
|
val instructions = mutableListOf<NavOperation>()
|
|
|
- File("puzzleInput/Day12-2.txt").forEachLine {
|
|
|
+ File("puzzleInput/Day12-1.txt").forEachLine {
|
|
|
val type = NavOperationType.valueOf(it.first().toString())
|
|
|
val value = it.drop(1).toInt()
|
|
|
instructions.add(NavOperation(value, type))
|
|
|
}
|
|
|
|
|
|
- instructions.forEach { move(it) }
|
|
|
+ instructions.forEach { movePart2(it) }
|
|
|
|
|
|
println("Manhatten distance: ${abs(east) + abs(north)}")
|
|
|
}
|
|
|
|
|
|
private var east = 0
|
|
|
private var north = 0
|
|
|
+private var wpEast = 10
|
|
|
+private var wpNorth = 1
|
|
|
private var facing = 0
|
|
|
|
|
|
-private fun move(navOperation: NavOperation) {
|
|
|
+private fun movePart1(navOperation: NavOperation) {
|
|
|
when (navOperation.type) {
|
|
|
NavOperationType.N -> north += navOperation.value
|
|
|
NavOperationType.S -> north -= navOperation.value
|
|
|
NavOperationType.E -> east += navOperation.value
|
|
|
NavOperationType.W -> east -= navOperation.value
|
|
|
NavOperationType.L -> facing = Math.floorMod(facing + navOperation.value, 360)
|
|
|
- NavOperationType.R -> facing = Math.floorMod(facing - navOperation.value, 360 )
|
|
|
+ NavOperationType.R -> facing = Math.floorMod(facing - navOperation.value, 360)
|
|
|
NavOperationType.F -> {
|
|
|
when (facing) {
|
|
|
in 0 until 90 -> east += navOperation.value
|
|
|
@@ -43,6 +48,29 @@ private fun move(navOperation: NavOperation) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+private fun movePart2(navOperation: NavOperation) {
|
|
|
+ when (navOperation.type) {
|
|
|
+ NavOperationType.N -> wpNorth += navOperation.value
|
|
|
+ NavOperationType.S -> wpNorth -= navOperation.value
|
|
|
+ NavOperationType.E -> wpEast += navOperation.value
|
|
|
+ NavOperationType.W -> wpEast -= navOperation.value
|
|
|
+ NavOperationType.L -> rotate(navOperation.value.toDouble())
|
|
|
+ NavOperationType.R -> rotate(navOperation.value.toDouble() * -1)
|
|
|
+ NavOperationType.F -> {
|
|
|
+ east += wpEast * navOperation.value
|
|
|
+ north += wpNorth * navOperation.value
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+private fun rotate(angle: Double) {
|
|
|
+ val x = (wpEast * cos(Math.toRadians(angle)) - wpNorth * sin(Math.toRadians(angle))).roundToInt()
|
|
|
+ val y = (wpEast * sin(Math.toRadians(angle)) + wpNorth * cos(Math.toRadians(angle))).roundToInt()
|
|
|
+
|
|
|
+ wpEast = x
|
|
|
+ wpNorth = y
|
|
|
+}
|
|
|
+
|
|
|
private enum class NavOperationType {
|
|
|
N, S, E, W, L, R, F
|
|
|
}
|