Skip to content

Commit 5e9e652

Browse files
committed
2022/Day 12
1 parent 90b33f4 commit 5e9e652

File tree

5 files changed

+79
-1
lines changed

5 files changed

+79
-1
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@
5050
🎄 ---- Day 11: Monkey in the Middle ---
5151
🌟 Part 1: 76728 (30.8ms)
5252
🌟 Part 2: 21553910156 (100.1ms)
53+
54+
🎄 ---- Day 12: Hill Climbing Algorithm ---
55+
🌟 Part 1: 391 (21.16ms)
56+
🌟 Part 2: 386 (237.14ms)
5357
```
5458

5559
## Visualizations

src/main/kotlin/me/grison/aoc/Graphs.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ fun <T> Graph<T>.shortestPath(a: T, b: T): Pair<Int, List<T>> {
4141
val (node, distance, path) = queue.shift()
4242
if (b == node) return p(distance, path)
4343

44-
for (neighbor in this[node]!!) {
44+
for (neighbor in (this[node] ?: listOf())) {
4545
if (neighbor !in visited) {
4646
visited.add(neighbor)
4747
val newPath = path.toMutableList() + neighbor
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package me.grison.aoc.y2022
2+
3+
import me.grison.aoc.*
4+
5+
class Day12 : Day(12, 2022) {
6+
override fun title() = "Hill Climbing Algorithm"
7+
8+
private fun cellValue(x: String) =
9+
x.replace("S", "a").replace("E", "z").first().code
10+
11+
override fun partOne() = solve("S")
12+
13+
override fun partTwo() = solve("a")
14+
15+
private fun solve(start: String): Int {
16+
val grid = inputList.stringGrid("z")
17+
val starts = grid.allPositions().filter { grid.at(it) == start }
18+
val end = grid.allPositions().find { grid.at(it) == "E" }!!
19+
20+
val edges = mutableListOf<Pair<Position, Position>>()
21+
grid.allPositions().forEach { p ->
22+
for (dir in p.directions()) {
23+
if (cellValue(grid.at(dir)) <= cellValue(grid.at(p)) + 1) {
24+
edges.add(p(p, dir))
25+
}
26+
}
27+
}
28+
29+
val graph = edges.toDirectedGraph()
30+
return starts.map { graph.shortestPath(it, end).first }.filter { it > -1 }.minOrNull()!!
31+
}
32+
}

src/main/resources/2022/12.txt

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
abaccccccccccccccaaaccccaaaaaaaaaaaaaccccccaacccccccccccccccccccccccccccccaaaaaa
2+
abaaccaacccccccccaaaaaccccaaaaaaaaaaaaaccccaaacccccccccccccccccccccccccccccaaaaa
3+
abaaccaaacccccccaaaaaacccaaaaaaaaaaaaaacaaaaaaaaccccccccaacccccccccccccccccccaaa
4+
abcaaaaaaaacccccaaaaaacccaaaaaaaaaaaaaacaaaaaaaacccccccaaaacccccccccccccccccaaaa
5+
abcaaaaaaaaccccccaaaaaccaaaaaaaaccaaaaaccaaaaaaccccccccaaaaccaaaccccccccccccaaac
6+
abccaaaaaacccccccaaaaccaaaaaaaaaacaaaacccaaaaaacccccccccakkaaaaaacccccccccccaacc
7+
abccaaaaaacccccccccccccaaaaaaaaaaccccccccaaaaaaccccccckkkkkkkaaacccccccccccccccc
8+
abccaaaaaaccccccccccccccccaaaaaaaaaccccccaacaaacccccckkkkkkkkkaccccccaccaaaccccc
9+
abccaacaaacccccaaccccccccaaacacaaaacaaccccccccccccccakkkoppkkkkicccccaaaaaaccccc
10+
abccccccccccccaaaccccccccaacccccaaaaaaccccccccccccccjkkooppppkiicccccccaaaaccccc
11+
abccccccccccaaaaaaaaccccccccccaaaaaaaccccccccccccccjjjooopppppiiiicccccccaaacccc
12+
abaaacccccccaaaaaaaacccccccaacaaaaaaccccccccccccccjjjjooouuppppiiiiiicccccaacccc
13+
abaaaccccccccaaaaaaccccccccaaaccaaaaacccccccccccjjjjjooouuuupppiiiiiiiiccccacccc
14+
abaaaaaacccccaaaaaacccccaaaaaaaaaacaaaccccccccjjjjjjooouuuuuupppppiiiiiicccccccc
15+
abaaaaaacccccaaaaaacccccaaaaaaaaaacccccccccccjjjjjooooouuxxuupppppqqqijjjccccccc
16+
abaaaacccccaaaaccaaccccccaaaaaaccccccccccccciijjnooooouuuxxxuuupqqqqqqjjjdddcccc
17+
abaaaaaccaaaaaaccacccccccaaaaaaccccccccccaaiiiinnootttuuxxxxuuvvvvvqqqjjjdddcccc
18+
abaaaaaccaaaaaacaaaccaaccaaaaaaccccccccccaaiiinnnntttttuxxxxxvvvvvvqqqjjjdddcccc
19+
abaaccacccaaaaacaaaaaaaccaaccaaccccccccccaaiiinnnttttxxxxxxxyyyyyvvqqqjjjdddcccc
20+
abcccccccaaaaacccaaaaaaccccccaaaaacccccccaaiiinnntttxxxxxxxyyyyyvvvqqqjjjddccccc
21+
SbcccccccaaaaacaaaaaaaaccccccaaaaaccccccccciiinnntttxxxEzzzzyyyyvvqqqjjjdddccccc
22+
abcccccccccccccaaaaaaaaaccccaaaaaaccccccccciiinnnntttxxxxyyyyyvvvvqqjjjdddcccccc
23+
abcccccccccccccaaaaaaaaaacccaaaaaacccccccccciiinnnttttxxxyyyyyvvvqqqjjjdddcccccc
24+
abccccccccccccccccaaaaaaacccaaaaaaccccccccccciiinnnntttwyyywyyyvvrrrkkjdddcccccc
25+
abcccccccccccccccaaaaaaaaccccaaaccccccccccccciiihnnnttwwwywwyyywvrrrkkkeeccccccc
26+
abcccccccccccccccaaaaaaaaccccccccccccccccccccchhhmmmsswwwwwwwwwwwvrrkkkeeccccccc
27+
abcccccccaacccccccacaaacccccccccccccccccccaacchhhhmmsswwwwwswwwwwrrrkkkeeccccccc
28+
abcccccccaaaccacccccaaacccccccccccccccaaccaaccchhhmmssswwwssrrwwwrrrkkkeeccccccc
29+
abcccccccaaaaaaacccccccccccaaaccccccccaaaaaaccchhhmmssssssssrrrrrrrrkkkeeaaacccc
30+
abcccccaaaaaaaaccccccccccccaaaaccccccccaaaaaaachhhmmmssssssllrrrrrrkkkeeeaaacccc
31+
abccccaaaaaaaaaccccccccccccaaaacccccccccaaaaacchhhmmmmsssllllllllkkkkkeeeaaacccc
32+
abccccaaaaaaaaaccccccccccccaaacccccccccaaaaacccchhhmmmmmlllllllllkkkkeeeeaaccccc
33+
abcccccccaaaaaaccccccccccaacccccccaaccaaacaacccchhhmmmmmlllgfflllkkffeeeaaaacccc
34+
abccccccaaaaaaaccccccccccaaaaaaaaaaaaaccccaacccchhhggmmmggggffffffffffeaaaaacccc
35+
abccaacccaacccaaaaccaccccaaaaaaaaaaaaacccccccccccgggggggggggffffffffffaacccccccc
36+
abaaaaccaaaccccaaaaaaccccaaaaaacaaaaaaccccccccccccgggggggggaaaaccffccccccccccccc
37+
abaaaacccccccccaaaaaaccaaaaaaaaaaaaaacccccccccccccccgggaaaaaaaacccccccccccccccca
38+
abaaaaacccccccaaaaaaaccaaaaaaaaaaaaaacccccccccccccccccaaacccaaaaccccccccccccccaa
39+
abaaaaacaaaaccaaaaaaaacaaaaaaaaaaaccccccccccccccccccccaaaccccaaaccccccccccaaacaa
40+
abaaaaacaaaaccaaaaaaaaaaaaaaaaaaacccccccccccccccccccccccccccccccccccccccccaaaaaa
41+
abaaacccaaaaccccaaaccccaaaaaaaaaaacccccccccccccccccccccccccccccccccccccccccaaaaa

src/test/kotlin/me/grison/aoc/y2022/AllDaysTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class AllDaysTest {
2222
Answer({ Day09() }, 6026, 2273),
2323
Answer({ Day10() }, 12980, "BRJLFULP"),
2424
Answer({ Day11() }, 76728, 21553910156),
25+
Answer({ Day12() }, 391, 386),
2526
).map {
2627
val day = it.inst.invoke()
2728
DynamicTest.dynamicTest("Day ${day.year}/${day.dayNumber} - Part 1 - expecting ${it.part1}") {

0 commit comments

Comments
 (0)