Skip to content

Commit 9d97614

Browse files
committed
Year 2024 Day 19
1 parent 9f684be commit 9d97614

File tree

7 files changed

+110
-4
lines changed

7 files changed

+110
-4
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ Performance is reasonable even on older hardware, for example a 2011 MacBook Pro
9090
| 16 | [Reindeer Maze](https://adventofcode.com/2024/day/16) | [Source](src/year2024/day16.rs) | 390 |
9191
| 17 | [Chronospatial Computer](https://adventofcode.com/2024/day/17) | [Source](src/year2024/day17.rs) | 2 |
9292
| 18 | [RAM Run](https://adventofcode.com/2024/day/18) | [Source](src/year2024/day18.rs) | 42 |
93+
| 19 | [Linen Layout](https://adventofcode.com/2024/day/19) | [Source](src/year2024/day19.rs) | 425 |
9394

9495
## 2023
9596

benches/benchmark.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,5 +88,5 @@ benchmark!(year2023
8888

8989
benchmark!(year2024
9090
day01, day02, day03, day04, day05, day06, day07, day08, day09, day10, day11, day12, day13,
91-
day14, day15, day16, day17, day18
91+
day14, day15, day16, day17, day18, day19
9292
);

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,5 +68,5 @@ library!(year2023 "Restore global snow production."
6868

6969
library!(year2024 "Locate the Chief Historian in time for the big Christmas sleigh launch."
7070
day01, day02, day03, day04, day05, day06, day07, day08, day09, day10, day11, day12, day13,
71-
day14, day15, day16, day17, day18
71+
day14, day15, day16, day17, day18, day19
7272
);

src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,5 +138,5 @@ run!(year2023
138138

139139
run!(year2024
140140
day01, day02, day03, day04, day05, day06, day07, day08, day09, day10, day11, day12, day13,
141-
day14, day15, day16, day17, day18
141+
day14, day15, day16, day17, day18, day19
142142
);

src/year2024/day19.rs

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
//! # Linen Layout
2+
use crate::util::hash::*;
3+
4+
pub fn parse(input: &str) -> Vec<u64> {
5+
let (prefix, suffix) = input.split_once("\n\n").unwrap();
6+
7+
let mut trie = Vec::with_capacity(1_000);
8+
trie.push(Node::new());
9+
10+
for towel in prefix.split(", ") {
11+
let mut i = 0;
12+
13+
for j in towel.bytes().map(to_index) {
14+
if trie[i].next[j] == 0 {
15+
trie[i].next[j] = trie.len();
16+
i = trie.len();
17+
trie.push(Node::new());
18+
} else {
19+
i = trie[i].next[j];
20+
}
21+
}
22+
23+
trie[i].towel = true;
24+
}
25+
26+
let seen = &mut FastMap::with_capacity(20_000);
27+
suffix.lines().map(|design| helper(&trie, seen, design.as_bytes())).collect()
28+
}
29+
30+
pub fn part1(input: &[u64]) -> usize {
31+
input.iter().filter(|&&n| n > 0).count()
32+
}
33+
34+
pub fn part2(input: &[u64]) -> u64 {
35+
input.iter().sum()
36+
}
37+
38+
fn helper<'a>(trie: &[Node], seen: &mut FastMap<&'a [u8], u64>, design: &'a [u8]) -> u64 {
39+
if design.is_empty() {
40+
return 1;
41+
}
42+
if let Some(&previous) = seen.get(design) {
43+
return previous;
44+
}
45+
46+
let mut i = 0;
47+
let mut ways = 0;
48+
49+
for depth in 0..design.len() {
50+
let j = to_index(design[depth]);
51+
i = trie[i].next[j];
52+
53+
if i == 0 {
54+
break;
55+
}
56+
57+
if trie[i].towel {
58+
ways += helper(trie, seen, &design[depth + 1..]);
59+
}
60+
}
61+
62+
seen.insert(design, ways);
63+
ways
64+
}
65+
66+
#[inline]
67+
fn to_index(b: u8) -> usize {
68+
(b - b'a') as usize
69+
}
70+
71+
struct Node {
72+
towel: bool,
73+
next: [usize; 26],
74+
}
75+
76+
impl Node {
77+
fn new() -> Self {
78+
Node { towel: false, next: [0; 26] }
79+
}
80+
}

tests/test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,5 +81,5 @@ test!(year2023
8181

8282
test!(year2024
8383
day01, day02, day03, day04, day05, day06, day07, day08, day09, day10, day11, day12, day13,
84-
day14, day15, day16, day17, day18
84+
day14, day15, day16, day17, day18, day19
8585
);

tests/year2024/day19.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
use aoc::year2024::day19::*;
2+
3+
const EXAMPLE: &str = "\
4+
r, wr, b, g, bwu, rb, gb, br
5+
6+
brwrr
7+
bggr
8+
gbbr
9+
rrbgbr
10+
ubwu
11+
bwurrg
12+
brgr
13+
bbrgwb";
14+
15+
#[test]
16+
fn part1_test() {
17+
let input = parse(EXAMPLE);
18+
assert_eq!(part1(&input), 6);
19+
}
20+
21+
#[test]
22+
fn part2_test() {
23+
let input = parse(EXAMPLE);
24+
assert_eq!(part2(&input), 16);
25+
}

0 commit comments

Comments
 (0)