diff --git a/days/src/main/kotlin/Day12.kt b/days/src/main/kotlin/Day12.kt new file mode 100644 index 0000000..2c9e346 --- /dev/null +++ b/days/src/main/kotlin/Day12.kt @@ -0,0 +1,88 @@ +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>) { + + 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 + } + } + when (dir) { + "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()) { + println(part1()) + println(part2()) +} diff --git a/days/src/main/resources/day12.txt b/days/src/main/resources/day12.txt new file mode 100644 index 0000000..e5acc44 --- /dev/null +++ b/days/src/main/resources/day12.txt @@ -0,0 +1,770 @@ +F47 +W2 +S5 +R180 +R90 +N3 +F44 +W1 +N3 +F77 +S5 +L270 +F39 +N3 +L90 +F83 +W4 +R270 +E2 +F98 +N3 +R180 +N3 +F54 +N1 +W4 +R90 +N1 +L90 +S2 +E4 +N4 +W2 +R90 +F42 +W3 +S4 +L90 +E5 +F6 +R180 +N4 +E5 +R180 +E3 +N3 +F27 +L90 +S4 +L180 +E4 +F52 +E2 +N1 +R90 +E3 +S4 +F76 +R270 +W2 +R90 +S2 +R90 +F79 +S1 +L180 +F81 +E3 +F79 +L90 +S3 +L180 +F52 +S5 +L90 +N4 +W2 +F65 +N2 +W1 +R90 +F25 +W4 +L90 +S2 +R90 +N1 +F13 +W1 +N1 +F71 +N3 +L90 +W4 +R90 +F91 +W5 +N3 +W3 +S3 +F58 +W4 +N5 +W3 +F42 +S4 +E5 +N3 +F14 +L180 +E5 +L270 +F55 +N3 +R90 +R90 +S4 +F55 +W2 +N1 +W5 +R180 +F8 +E3 +L270 +N2 +F12 +N2 +R90 +W1 +R90 +W2 +L90 +S2 +F75 +L90 +S4 +E3 +F82 +L90 +L90 +F42 +N4 +E5 +F67 +R90 +E3 +F64 +E4 +R90 +F42 +S4 +F85 +W5 +S5 +R90 +F35 +R270 +W5 +F67 +R90 +S5 +R180 +S1 +F13 +N4 +W5 +S2 +F31 +L90 +E2 +F39 +R90 +F3 +W4 +N2 +F14 +E2 +F80 +L180 +F52 +N3 +E2 +F98 +W2 +F29 +R180 +E2 +L90 +W4 +N3 +W1 +S2 +W1 +N5 +F6 +E5 +E1 +W2 +R90 +S3 +F92 +L90 +E5 +F55 +L90 +S3 +R90 +S2 +L90 +N1 +E5 +F50 +L90 +N4 +F9 +L90 +N4 +L90 +R90 +R180 +E3 +F57 +L90 +S5 +R180 +S3 +E4 +F41 +W5 +N4 +W2 +N2 +R90 +S2 +W1 +F83 +R180 +W1 +R90 +W1 +F17 +F20 +S1 +E5 +F13 +N5 +F8 +F81 +E2 +S4 +F7 +W2 +F86 +N2 +L90 +N5 +L180 +E2 +R90 +E3 +S3 +N4 +W2 +F64 +L90 +F81 +L90 +E4 +F1 +E3 +L90 +W5 +L90 +N3 +F28 +F3 +F100 +E5 +N5 +F32 +R90 +W1 +R90 +S3 +W1 +W5 +N3 +F27 +R90 +W2 +R180 +W3 +W2 +N2 +E2 +S1 +R90 +W3 +F51 +E5 +N4 +W3 +S5 +R90 +F91 +S3 +W1 +S4 +R270 +N5 +W4 +F94 +R90 +N4 +L90 +N4 +R90 +F35 +E3 +F6 +S4 +F98 +E2 +L180 +W4 +N5 +F42 +S3 +W3 +N1 +R90 +S5 +E3 +S3 +F47 +S1 +F19 +W5 +R90 +F17 +R90 +N4 +R90 +F57 +E2 +F73 +W3 +F52 +F98 +R90 +N1 +F88 +N2 +E4 +S4 +R90 +E2 +R90 +N5 +F75 +L180 +F61 +E2 +S4 +N4 +W1 +N3 +E2 +N3 +F44 +E3 +L180 +N4 +F16 +E2 +S1 +L180 +R90 +W5 +F65 +S5 +F31 +E3 +L90 +N5 +E4 +S5 +E4 +S4 +R90 +F70 +R90 +W4 +L90 +N3 +W1 +L90 +S3 +L90 +F91 +L180 +S3 +R90 +N5 +L90 +S5 +W2 +F18 +E3 +F19 +N1 +F70 +R90 +E3 +S4 +F46 +N2 +S3 +W2 +S4 +F7 +L90 +E4 +R90 +F78 +S1 +F4 +L90 +W3 +F78 +E5 +L270 +F86 +E3 +F82 +L90 +F32 +R90 +E4 +L90 +E4 +L90 +E3 +F63 +N4 +E4 +L90 +F70 +R180 +F30 +R180 +F40 +N5 +R90 +W4 +F16 +L180 +S1 +W1 +R180 +F12 +W3 +L90 +F93 +S2 +L270 +F36 +L90 +W2 +N2 +F3 +W2 +L180 +L90 +F24 +S1 +W5 +R90 +E4 +L180 +E1 +S1 +L90 +F94 +L90 +F55 +N2 +E5 +F33 +E3 +L90 +N2 +L90 +S2 +R90 +F67 +W4 +F79 +E1 +E5 +F5 +S5 +R180 +F5 +E2 +E5 +N4 +W5 +N4 +W5 +E2 +L90 +F2 +L90 +N4 +E3 +N3 +R90 +F92 +N5 +F83 +L90 +F85 +R90 +W5 +S2 +L90 +E1 +F34 +E3 +L180 +W3 +R90 +F29 +W4 +L90 +F34 +W1 +S4 +E2 +S1 +W2 +W5 +L90 +E5 +N4 +R180 +N2 +W5 +R90 +F42 +W3 +N2 +L90 +F79 +W2 +F16 +N5 +E3 +F52 +F55 +L90 +F42 +L90 +W4 +S2 +E5 +L90 +S4 +F34 +N5 +N1 +L180 +L90 +E2 +L90 +W3 +L90 +F16 +E2 +F96 +N3 +E1 +F34 +R180 +S2 +F17 +W1 +L270 +F7 +W2 +N1 +F33 +N4 +F2 +N5 +R180 +F10 +W3 +L90 +S3 +E2 +S1 +F85 +N2 +F1 +R180 +F10 +N4 +W3 +S2 +R180 +N4 +W3 +S2 +S4 +L90 +E5 +N1 +F34 +S4 +W2 +W5 +F62 +S5 +E5 +S4 +F100 +L90 +W2 +F20 +S2 +E1 +R180 +F88 +N5 +F85 +N2 +R90 +N1 +E5 +F83 +R90 +W1 +R90 +E1 +F11 +E3 +F54 +N5 +L180 +F54 +R90 +S2 +E3 +L90 +E3 +N5 +R90 +W1 +S5 +R270 +F91 +E3 +F52 +W1 +F36 +W1 +N5 +F53 +E1 +R180 +N3 +F12 +L90 +S5 +F99 +S1 +R90 +S4 +R90 +S1 +W1 +N2 +L270 +W5 +F78 +S2 +R90 +F37 +W5 +R90 +E3 +S2 +E4 +L90 +S3 +W4 +F83 +L180 +S3 +R90 +F57 +W1 +S1 +L180 +W2 +N1 +R180 +N1 +L180 +W3 +S3 +R180 +E4 +F77 +N5 +S3 +W1 +N4 +F4 +N5 +F64 +W1 +R90 +N2 +W5 +L90 +N3 +L90 +F8 +L90 +F3 +S5 +F95 +R90 +W2 +F15 +L270 +F49 +R180 +S3 +F15 +N5 +L180 +S2 +F71 +S5 +F56 +W1 +F22 +F90 +E5 +F68 +N4 +R180 +N5 +E4 +F52 +E5 +L90 +E3 +F69 +W4 +S3 +L90 +N4 +R90 +F19