@@ -9,7 +9,7 @@ import de.ronny_h.aoc.extensions.grids.SimpleCharGrid
99import de.ronny_h.aoc.extensions.grids.Turn
1010import de.ronny_h.aoc.extensions.grids.Turn.*
1111
12- fun main () = MineCartMadness ().run (" 33,69" , " " )
12+ fun main () = MineCartMadness ().run (" 33,69" , " 135,9 " )
1313
1414class MineCartMadness : AdventOfCode <String >(2018 , 13 ) {
1515 override fun part1 (input : List <String >): String {
@@ -18,12 +18,13 @@ class MineCartMadness : AdventOfCode<String>(2018, 13) {
1818 }
1919
2020 override fun part2 (input : List <String >): String {
21- return " "
21+ val remaining = Track (input).moveCartsUntilOnlyOneRemains()
22+ return " ${remaining.col} ,${remaining.row} "
2223 }
2324}
2425
2526class Track (input : List <String >) : SimpleCharGrid(input, ' ' ) {
26- private val carts: List <Cart > = buildList {
27+ private val carts: MutableList <Cart > = buildList {
2728 forEachCoordinates { position, element ->
2829 when (element) {
2930 ' <' -> {
@@ -47,24 +48,40 @@ class Track(input: List<String>) : SimpleCharGrid(input, ' ') {
4748 }
4849 }
4950 }.last()
50- }
51+ }.toMutableList()
5152
5253 fun moveCartsUntilFirstCrash (): Coordinates {
5354 var collision: Coordinates ? = null
5455 while (collision == null ) {
55- collision = tick ()
56+ collision = tickUntilFirstCollision ()
5657 }
5758 return collision
5859 }
5960
60- private fun tick (): Coordinates ? {
61+ fun moveCartsUntilOnlyOneRemains (): Coordinates {
62+ while (carts.size != 1 ) {
63+ tickRemovingCollidingCarts()
64+ }
65+ return carts.single().position
66+ }
67+
68+ private fun tickUntilFirstCollision (): Coordinates ? {
6169 for (cart in carts.sortedBy { it.position }) {
6270 cart.move()
6371 carts.firstDuplicate(Cart ::position)?.also { return it }
6472 }
6573 return null
6674 }
6775
76+ private fun tickRemovingCollidingCarts () {
77+ for (cart in carts.sortedBy { it.position }) {
78+ cart.move()
79+ carts.firstDuplicate(Cart ::position)?.also { crashed ->
80+ carts.removeAll { it.position == crashed }
81+ }
82+ }
83+ }
84+
6885 private fun Cart.move () {
6986 position + = direction
7087 direction = when (getAt(position)) {
0 commit comments