Skip to content

Commit 3fd01cb

Browse files
committed
Solution 2018-13, part 1 (Mine Cart Madness)
1 parent c52650f commit 3fd01cb

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package de.ronny_h.aoc.year2018.day13
2+
3+
import de.ronny_h.aoc.AdventOfCode
4+
import de.ronny_h.aoc.extensions.collections.firstDuplicate
5+
import de.ronny_h.aoc.extensions.grids.Coordinates
6+
import de.ronny_h.aoc.extensions.grids.Direction
7+
import de.ronny_h.aoc.extensions.grids.Direction.*
8+
import de.ronny_h.aoc.extensions.grids.SimpleCharGrid
9+
import de.ronny_h.aoc.extensions.grids.Turn
10+
import de.ronny_h.aoc.extensions.grids.Turn.*
11+
12+
fun main() = MineCartMadness().run("33,69", "")
13+
14+
class MineCartMadness : AdventOfCode<String>(2018, 13) {
15+
override fun part1(input: List<String>): String {
16+
val collision = Track(input).moveCartsUntilFirstCrash()
17+
return "${collision.col},${collision.row}"
18+
}
19+
20+
override fun part2(input: List<String>): String {
21+
return ""
22+
}
23+
}
24+
25+
class Track(input: List<String>) : SimpleCharGrid(input, ' ') {
26+
private val carts: List<Cart> = buildList {
27+
forEachCoordinates { position, element ->
28+
when (element) {
29+
'<' -> {
30+
add(Cart(position, WEST))
31+
setAt(position, '-')
32+
}
33+
34+
'>' -> {
35+
add(Cart(position, EAST))
36+
setAt(position, '-')
37+
}
38+
39+
'^' -> {
40+
add(Cart(position, NORTH))
41+
setAt(position, '|')
42+
}
43+
44+
'v' -> {
45+
add(Cart(position, SOUTH))
46+
setAt(position, '|')
47+
}
48+
}
49+
}.last()
50+
}
51+
52+
fun moveCartsUntilFirstCrash(): Coordinates {
53+
var collision: Coordinates? = null
54+
while (collision == null) {
55+
collision = tick()
56+
}
57+
return collision
58+
}
59+
60+
private fun tick(): Coordinates? {
61+
for (cart in carts.sortedBy { it.position }) {
62+
cart.move()
63+
carts.firstDuplicate(Cart::position)?.also { return it }
64+
}
65+
return null
66+
}
67+
68+
private fun Cart.move() {
69+
position += direction
70+
direction = when (getAt(position)) {
71+
'+' -> direction.turn(nextTurn())
72+
'/' -> if (direction == NORTH || direction == SOUTH) direction.turnRight() else direction.turnLeft()
73+
'\\' -> if (direction == NORTH || direction == SOUTH) direction.turnLeft() else direction.turnRight()
74+
else -> direction
75+
}
76+
}
77+
}
78+
79+
data class Cart(var position: Coordinates, var direction: Direction, private var lastTurn: Turn = RIGHT) {
80+
fun nextTurn(): Turn {
81+
lastTurn = when (lastTurn) {
82+
LEFT -> STRAIGHT
83+
STRAIGHT -> RIGHT
84+
RIGHT -> LEFT
85+
}
86+
return lastTurn
87+
}
88+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package de.ronny_h.aoc.year2018.day13
2+
3+
import de.ronny_h.aoc.extensions.asList
4+
import io.kotest.core.spec.style.StringSpec
5+
import io.kotest.matchers.shouldBe
6+
7+
class MineCartMadnessTest : StringSpec({
8+
9+
val input = """
10+
/->-\
11+
| | /----\
12+
| /-+--+-\ |
13+
| | | | v |
14+
\-+-/ \-+--/
15+
\------/
16+
""".asList()
17+
18+
"part 1: the location of the first crash" {
19+
MineCartMadness().part1(input) shouldBe "7,3"
20+
}
21+
22+
"part 2" {
23+
val input = listOf("")
24+
MineCartMadness().part2(input) shouldBe ""
25+
}
26+
})

0 commit comments

Comments
 (0)