Steffen Burkowitz 4 년 전
부모
커밋
99095d85b4
1개의 변경된 파일32개의 추가작업 그리고 4개의 파일을 삭제
  1. 32 4
      src/main/kotlin/de/doriansnowball/adventofcode/Day12.kt

+ 32 - 4
src/main/kotlin/de/doriansnowball/adventofcode/Day12.kt

@@ -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
 }