Day 18 part 1
This commit is contained in:
parent
598e8bd639
commit
e0547c2309
4 changed files with 3507 additions and 31 deletions
32
2024/src/main/kotlin/Dijkstra.kt
Normal file
32
2024/src/main/kotlin/Dijkstra.kt
Normal file
|
@ -0,0 +1,32 @@
|
|||
import java.util.*
|
||||
|
||||
fun <T> dijkstra(start: T, goal: (T) -> Boolean, neighbors: (T) -> Sequence<Pair<T, Int>>): Int? {
|
||||
val distanceFromStart = mutableMapOf(start to 0)
|
||||
val visited = mutableSetOf<T>()
|
||||
val queue = PriorityQueue<Pair<T, Int>> { a, b -> a.second.compareTo(b.second) }
|
||||
|
||||
queue.add(start to 0)
|
||||
|
||||
while (true) {
|
||||
val (current, totalDistance) = queue.poll() ?: break
|
||||
if (goal(current)) {
|
||||
return totalDistance
|
||||
}
|
||||
|
||||
visited.add(start)
|
||||
|
||||
for ((neighbor, distance) in neighbors(current)) {
|
||||
if (neighbor in visited) continue;
|
||||
|
||||
val newDistance = totalDistance + distance
|
||||
|
||||
val currentDistance = distanceFromStart[neighbor]
|
||||
if (currentDistance == null || newDistance < currentDistance) {
|
||||
distanceFromStart[neighbor] = newDistance
|
||||
queue.add(neighbor to newDistance)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
|
@ -31,34 +31,3 @@ fun Direction.turns(to: Direction): Int = when {
|
|||
this == Direction.West && to == Direction.East -> 2
|
||||
else -> error("Missing directions")
|
||||
}
|
||||
|
||||
fun <T> dijkstra(start: T, goal: (T) -> Boolean, neighbors: (T) -> Sequence<Pair<T, Int>>): Int? {
|
||||
val distanceFromStart = mutableMapOf(start to 0)
|
||||
val visited = mutableSetOf<T>()
|
||||
val queue = PriorityQueue<Pair<T, Int>> { a, b -> a.second.compareTo(b.second) }
|
||||
|
||||
queue.add(start to 0)
|
||||
|
||||
while (true) {
|
||||
val (current, totalDistance) = queue.poll() ?: break
|
||||
if (goal(current)) {
|
||||
return totalDistance
|
||||
}
|
||||
|
||||
visited.add(start)
|
||||
|
||||
for ((neighbor, distance) in neighbors(current)) {
|
||||
if (neighbor in visited) continue;
|
||||
|
||||
val newDistance = totalDistance + distance
|
||||
|
||||
val currentDistance = distanceFromStart[neighbor]
|
||||
if (currentDistance == null || newDistance < currentDistance) {
|
||||
distanceFromStart[neighbor] = newDistance
|
||||
queue.add(neighbor to newDistance)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
25
2024/src/main/kotlin/day18.kt
Normal file
25
2024/src/main/kotlin/day18.kt
Normal file
|
@ -0,0 +1,25 @@
|
|||
fun main() {
|
||||
val size = 71
|
||||
|
||||
val memory = readInput("day18.txt")
|
||||
.map {
|
||||
val (a, b) = it.split(',', limit = 2)
|
||||
Grid.Coordinate(a.toInt(), b.toInt())
|
||||
}
|
||||
.take(1024)
|
||||
.fold(CharGrid(size, size, '.')) { acc, coordinate ->
|
||||
acc[coordinate] = '#'
|
||||
acc
|
||||
}
|
||||
|
||||
val start = Grid.Coordinate(0, 0)
|
||||
val goal = Grid.Coordinate(size - 1, size - 1)
|
||||
|
||||
val distance = dijkstra(start, goal = { it == goal }, neighbors = { pos ->
|
||||
Direction.entries.asSequence()
|
||||
.map { pos.step(it) }
|
||||
.filter { it in memory && memory[it] == '.' }
|
||||
.map { it to 1 }
|
||||
})
|
||||
println("Part 1: $distance")
|
||||
}
|
3450
2024/src/main/resources/day18.txt
Normal file
3450
2024/src/main/resources/day18.txt
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Reference in a new issue