Solve day 10 of AoC 2024
This commit is contained in:
parent
7cad6a842c
commit
2c9b5c943e
5 changed files with 330 additions and 0 deletions
184
advent-of-code/2024/day_10/README.md
Normal file
184
advent-of-code/2024/day_10/README.md
Normal file
|
@ -0,0 +1,184 @@
|
|||
# Advent of Code 2024 day 10 solution in Ruby
|
||||
|
||||
[Task page](https://adventofcode.com/2024/day/10)
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
Run tests:
|
||||
|
||||
```bash
|
||||
ruby test.rb
|
||||
```
|
||||
|
||||
Run solution:
|
||||
|
||||
```bash
|
||||
ruby main.rb
|
||||
```
|
||||
|
||||
|
||||
## Hoof It
|
||||
|
||||
You all arrive at a Lava Production Facility on a floating island in the sky.
|
||||
As the others begin to search the massive industrial complex,
|
||||
you feel a small nose boop your leg and look down to discover a reindeer wearing a hard hat.
|
||||
|
||||
The reindeer is holding a book titled "Lava Island Hiking Guide". However, when you open the book,
|
||||
you discover that most of it seems to have been scorched by lava! As you're about to ask how you can help,
|
||||
the reindeer brings you a blank topographic map of the surrounding area (your puzzle input) and looks up at you excitedly.
|
||||
|
||||
Perhaps you can help fill in the missing hiking trails?
|
||||
|
||||
The topographic map indicates the height at each position using a scale from 0 (lowest) to 9 (highest). For example:
|
||||
|
||||
```
|
||||
0123
|
||||
1234
|
||||
8765
|
||||
9876
|
||||
```
|
||||
|
||||
Based on un-scorched scraps of the book, you determine that a good hiking trail is as long as possible and has an even, gradual, uphill slope.
|
||||
For all practical purposes, this means that a hiking trail is any path that starts at height 0, ends at height 9,
|
||||
and always increases by a height of exactly 1 at each step. Hiking trails never include diagonal steps - only up, down, left, or right
|
||||
(from the perspective of the map).
|
||||
|
||||
You look up from the map and notice that the reindeer has helpfully begun to construct a small pile of pencils, markers, rulers,
|
||||
compasses, stickers, and other equipment you might need to update the map with hiking trails.
|
||||
|
||||
A trailhead is any position that starts one or more hiking trails - here, these positions will always have height 0.
|
||||
Assembling more fragments of pages, you establish that a trailhead's score is the number of 9-height positions reachable
|
||||
from that trailhead via a hiking trail. In the above example, the single trailhead in the top left corner has a score of 1
|
||||
because it can reach a single 9 (the one in the bottom left).
|
||||
|
||||
This trailhead has a score of 2:
|
||||
|
||||
```
|
||||
...0...
|
||||
...1...
|
||||
...2...
|
||||
6543456
|
||||
7.....7
|
||||
8.....8
|
||||
9.....9
|
||||
```
|
||||
|
||||
(The positions marked . are impassable tiles to simplify these examples; they do not appear on your actual topographic map.)
|
||||
|
||||
This trailhead has a score of 4 because every 9 is reachable via a hiking trail except the one immediately to the left of the trailhead:
|
||||
|
||||
```
|
||||
..90..9
|
||||
...1.98
|
||||
...2..7
|
||||
6543456
|
||||
765.987
|
||||
876....
|
||||
987....
|
||||
```
|
||||
|
||||
This topographic map contains two trailheads; the trailhead at the top has a score of 1, while the trailhead at the bottom has a score of 2:
|
||||
|
||||
```
|
||||
10..9..
|
||||
2...8..
|
||||
3...7..
|
||||
4567654
|
||||
...8..3
|
||||
...9..2
|
||||
.....01
|
||||
```
|
||||
|
||||
Here's a larger example:
|
||||
|
||||
```
|
||||
89010123
|
||||
78121874
|
||||
87430965
|
||||
96549874
|
||||
45678903
|
||||
32019012
|
||||
01329801
|
||||
10456732
|
||||
```
|
||||
|
||||
This larger example has 9 trailheads. Considering the trailheads in reading order, they have scores of 5, 6, 5, 3, 1, 3, 5, 3, and 5.
|
||||
Adding these scores together, the sum of the scores of all trailheads is 36.
|
||||
|
||||
The reindeer gleefully carries over a protractor and adds it to the pile.
|
||||
What is the sum of the scores of all trailheads on your topographic map?
|
||||
|
||||
|
||||
## Part Two
|
||||
|
||||
The reindeer spends a few minutes reviewing your hiking trail map before realizing something, disappearing for a few minutes,
|
||||
and finally returning with yet another slightly-charred piece of paper.
|
||||
|
||||
The paper describes a second way to measure a trailhead called its rating.
|
||||
A trailhead's rating is the number of distinct hiking trails which begin at that trailhead. For example:
|
||||
|
||||
```
|
||||
.....0.
|
||||
..4321.
|
||||
..5..2.
|
||||
..6543.
|
||||
..7..4.
|
||||
..8765.
|
||||
..9....
|
||||
```
|
||||
|
||||
The above map has a single trailhead; its rating is 3 because there are exactly three distinct hiking trails which begin at that position:
|
||||
|
||||
```
|
||||
.....0. .....0. .....0.
|
||||
..4321. .....1. .....1.
|
||||
..5.... .....2. .....2.
|
||||
..6.... ..6543. .....3.
|
||||
..7.... ..7.... .....4.
|
||||
..8.... ..8.... ..8765.
|
||||
..9.... ..9.... ..9....
|
||||
```
|
||||
|
||||
Here is a map containing a single trailhead with rating 13:
|
||||
|
||||
```
|
||||
..90..9
|
||||
...1.98
|
||||
...2..7
|
||||
6543456
|
||||
765.987
|
||||
876....
|
||||
987....
|
||||
```
|
||||
|
||||
This map contains a single trailhead with rating 227 (because there are 121 distinct hiking trails that lead
|
||||
to the 9 on the right edge and 106 that lead to the 9 on the bottom edge):
|
||||
|
||||
```
|
||||
012345
|
||||
123456
|
||||
234567
|
||||
345678
|
||||
4.6789
|
||||
56789.
|
||||
```
|
||||
|
||||
Here's the larger example from before:
|
||||
|
||||
```
|
||||
89010123
|
||||
78121874
|
||||
87430965
|
||||
96549874
|
||||
45678903
|
||||
32019012
|
||||
01329801
|
||||
10456732
|
||||
```
|
||||
|
||||
Considering its trailheads in reading order, they have ratings of 20, 24, 10, 4, 1, 4, 5, 8, and 5.
|
||||
The sum of all trailhead ratings in this larger example topographic map is 81.
|
||||
|
||||
You're not sure how, but the reindeer seems to have crafted some tiny flags out of toothpicks and bits of paper and is using them
|
||||
to mark trailheads on your topographic map. What is the sum of the ratings of all trailheads?
|
57
advent-of-code/2024/day_10/input.txt
Normal file
57
advent-of-code/2024/day_10/input.txt
Normal file
|
@ -0,0 +1,57 @@
|
|||
543213210349876210129890176034034565966563210587109092121
|
||||
656104101236762121456761789125120677877432101498218187030
|
||||
787215678945643012369852652196541986778943452387367256541
|
||||
898764101223454921058943543087632345657654363456456349654
|
||||
234459814312367838901012634678983954108932276545234438743
|
||||
105308765101298987632108768901017873217841189034105698894
|
||||
076218965290345676543289457632124561678750025121236787101
|
||||
987987874387654989123498398543401410589867014240901223218
|
||||
128876210260123478004567212898532323475678923457816314509
|
||||
019564320178874565213216500187645654129854503966765405678
|
||||
323469834569982104304307431234578765036763212875896876989
|
||||
767878706521676235425498120110569834545678923214387932376
|
||||
876967017430501543216326013223432728901298012103098541205
|
||||
985054328941432652107817154370121112854347543892107670314
|
||||
834123217632965469234908965987430004761256556701256789323
|
||||
729654306541874678945699874876548123450236789210345430110
|
||||
618783210930123012876789103765659874210101654345014521221
|
||||
105690129850019823498632212014567865321256789765623012434
|
||||
104941010761236710567541003423438978762349809854789923455
|
||||
203832123450145623456410212789829569451056012343210854396
|
||||
312745898567876514589321345657810438342347898901345765987
|
||||
405656776343998105679430103456910123239897687432216705476
|
||||
512346785434867234578345612765878762101798576521009812345
|
||||
694567698123452105507656709894349656123603401098967826565
|
||||
783878981030143245412349814763234341014512032367654983456
|
||||
012969976543201236093218923452123210012432145456543452187
|
||||
121001876124210187187108765421005391143465434505412341093
|
||||
321232565035303298296089012321016789834874328212303433282
|
||||
210543458749456334345676521056525470765966019301601214101
|
||||
109851239658765478034785435437434321014987458456732105010
|
||||
238760548789678969123699876348945610523456367234845256723
|
||||
321017656698767056782176501267876525676789210105996367894
|
||||
438998765589850145891089437678801234989654101986087458965
|
||||
567321996434743234106543228769960145676543243877124349896
|
||||
675490887525612103257890119454877658983450112568233210787
|
||||
587586716014101678965432001323768943232162103499545012345
|
||||
896675105003234567876721017012057890123078213487636776596
|
||||
745564234123098656989830398701146321265459812345629889487
|
||||
932213047894187765216541235610235430876343501676712012376
|
||||
871302120765276894307890344320145210901265430989800193401
|
||||
560456961294345653210787653410236389810178125476543287632
|
||||
410367854386543464678876544567107458103269076398389326543
|
||||
321298765677812104589965433218998567234387681267276410014
|
||||
123457654308903243218760129809889234985898790354105569123
|
||||
016534567210211038909678978321010125676787063203234678874
|
||||
105673898323302347874541065410981589094543154112356787965
|
||||
234982765432423456743232456723873672187612267053543298874
|
||||
122801894541510161250101365834712543870101348765632107985
|
||||
021289843690678870367010212945603434983289659054901001276
|
||||
130126732784569965478101204988914301874378778123892104345
|
||||
245035011098430156789678345677765210165134589104743077656
|
||||
356544324567821025898569101056879321051021678201654988745
|
||||
987676543056932110185430202346978432896120214312345679034
|
||||
678989432108945523679021312567566543787034305478943456123
|
||||
549034549087876654578110453498754694986545456967012987101
|
||||
432123678896521783063234569787103785675676567852173985432
|
||||
101210510123430192154345478776212656548989656743089876501
|
45
advent-of-code/2024/day_10/lib.rb
Normal file
45
advent-of-code/2024/day_10/lib.rb
Normal file
|
@ -0,0 +1,45 @@
|
|||
def count_reachable_positions(matrix)
|
||||
get_score_sum(matrix, true)
|
||||
end
|
||||
|
||||
def count_hiking_trails(matrix)
|
||||
get_score_sum(matrix, false)
|
||||
end
|
||||
|
||||
def get_score_sum(matrix, skip_visited_cells)
|
||||
count = 0
|
||||
|
||||
for i in 0..matrix.length - 1 do
|
||||
for j in 0..matrix[0].length - 1 do
|
||||
next if matrix[i][j] != 0
|
||||
|
||||
count += bfs(matrix, i, j, skip_visited_cells)
|
||||
end
|
||||
end
|
||||
|
||||
count
|
||||
end
|
||||
|
||||
def bfs(matrix, i, j, skip_visited_cells)
|
||||
visits = Array.new(matrix.length) { Array.new(matrix[0].length, false) }
|
||||
queue = [[i, j]]
|
||||
matches = 0
|
||||
|
||||
until queue.empty?
|
||||
i, j = queue.pop
|
||||
next if skip_visited_cells && visits[i][j]
|
||||
|
||||
visits[i][j] = true
|
||||
if matrix[i][j] == 9
|
||||
matches += 1
|
||||
next
|
||||
end
|
||||
|
||||
queue.unshift([i - 1, j]) if i > 0 && matrix[i - 1][j] == matrix[i][j] + 1
|
||||
queue.unshift([i + 1, j]) if i < matrix.length - 1 && matrix[i + 1][j] == matrix[i][j] + 1
|
||||
queue.unshift([i, j - 1]) if j > 0 && matrix[i][j - 1] == matrix[i][j] + 1
|
||||
queue.unshift([i, j + 1]) if j < matrix[0].length - 1 && matrix[i][j + 1] == matrix[i][j] + 1
|
||||
end
|
||||
|
||||
matches
|
||||
end
|
12
advent-of-code/2024/day_10/main.rb
Normal file
12
advent-of-code/2024/day_10/main.rb
Normal file
|
@ -0,0 +1,12 @@
|
|||
require_relative 'lib'
|
||||
|
||||
input = File.readlines('input.txt', chomp: true)
|
||||
matrix = input.map do |row|
|
||||
row.split('').map { |n| Integer(n) }
|
||||
end
|
||||
|
||||
res1 = count_reachable_positions(matrix)
|
||||
puts("Part 1: #{res1}")
|
||||
|
||||
res2 = count_hiking_trails(matrix)
|
||||
puts("Part 2: #{res2}")
|
32
advent-of-code/2024/day_10/test.rb
Normal file
32
advent-of-code/2024/day_10/test.rb
Normal file
|
@ -0,0 +1,32 @@
|
|||
require_relative 'lib'
|
||||
require 'test/unit'
|
||||
|
||||
class TestLib < Test::Unit::TestCase
|
||||
def test_count_reachable_positions
|
||||
input = [
|
||||
[8, 9, 0, 1, 0, 1, 2, 3],
|
||||
[7, 8, 1, 2, 1, 8, 7, 4],
|
||||
[8, 7, 4, 3, 0, 9, 6, 5],
|
||||
[9, 6, 5, 4, 9, 8, 7, 4],
|
||||
[4, 5, 6, 7, 8, 9, 0, 3],
|
||||
[3, 2, 0, 1, 9, 0, 1, 2],
|
||||
[0, 1, 3, 2, 9, 8, 0, 1],
|
||||
[1, 0, 4, 5, 6, 7, 3, 2]
|
||||
]
|
||||
assert_equal(36, count_reachable_positions(input))
|
||||
end
|
||||
|
||||
def test_count_hiking_trails
|
||||
input = [
|
||||
[8, 9, 0, 1, 0, 1, 2, 3],
|
||||
[7, 8, 1, 2, 1, 8, 7, 4],
|
||||
[8, 7, 4, 3, 0, 9, 6, 5],
|
||||
[9, 6, 5, 4, 9, 8, 7, 4],
|
||||
[4, 5, 6, 7, 8, 9, 0, 3],
|
||||
[3, 2, 0, 1, 9, 0, 1, 2],
|
||||
[0, 1, 3, 2, 9, 8, 0, 1],
|
||||
[1, 0, 4, 5, 6, 7, 3, 2]
|
||||
]
|
||||
assert_equal(81, count_hiking_trails(input))
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue