Skip to content

Commit 388ba88

Browse files
committed
solve: day3
1 parent 84498af commit 388ba88

File tree

3 files changed

+83
-1
lines changed

3 files changed

+83
-1
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
resolver = "2"
33
members = [
44
"aoc_lib/aoc_derive",
5-
"aoc_lib/utils", "day1", "day2",
5+
"aoc_lib/utils", "day1", "day2", "day3",
66
]
77

88
[workspace.dependencies]

day3/Cargo.toml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[package]
2+
name = "day3"
3+
version = "0.1.0"
4+
edition = "2024"
5+
6+
[dependencies]
7+
aoc_derive.path = '../aoc_lib/aoc_derive'
8+
utils.path = '../aoc_lib/utils'
9+
derive_more.workspace = true
10+
itertools.workspace = true
11+
lazy-regex.workspace = true
12+
parse-display.workspace = true
13+
rayon.workspace = true
14+
regex.workspace = true
15+
num.workspace = true
16+
17+
[dev-dependencies]
18+
pretty_assertions.workspace = true

day3/src/main.rs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
use aoc_derive::aoc_main;
2+
use itertools::Itertools;
3+
use utils::*;
4+
5+
fn find_best(numbers: &[usize], cur: usize, depth: u32, max: usize) -> Option<usize> {
6+
if depth == 12 {
7+
return Some(cur);
8+
}
9+
10+
if numbers.is_empty() || cur + 10_usize.pow(12 - depth) < max {
11+
return None;
12+
}
13+
14+
let skip_result = find_best(&numbers[1..], cur, depth, max);
15+
16+
let no_skip_result = find_best(
17+
&numbers[1..],
18+
cur + 10_usize.pow(12 - depth - 1) * numbers[0],
19+
depth + 1,
20+
skip_result.unwrap_or(max),
21+
);
22+
23+
skip_result.max(no_skip_result)
24+
}
25+
26+
#[aoc_main]
27+
fn solve(input: Input) -> impl Into<Solution> {
28+
let banks = input
29+
.lines()
30+
.map(|line| line.chars().map(|c| c.to_digit(10).unwrap() as usize).collect_vec())
31+
.collect_vec();
32+
33+
let part1 = banks
34+
.iter()
35+
.map(|bank| {
36+
bank.iter()
37+
.enumerate()
38+
.flat_map(|(i, n1)| bank.iter().skip(i + 1).map(move |n2| 10 * n1 + n2))
39+
.max()
40+
.unwrap()
41+
})
42+
.sum_usize();
43+
44+
let part2 = banks.iter().map(|bank| find_best(bank, 0, 0, 0).unwrap()).sum_usize();
45+
46+
(part1, part2)
47+
}
48+
49+
#[cfg(test)]
50+
mod tests {
51+
use super::*;
52+
#[test]
53+
fn test_examples() {
54+
use utils::assert_example;
55+
assert_example!(
56+
r#"987654321111111
57+
811111111111119
58+
234234234234278
59+
818181911112111"#,
60+
357,
61+
3121910778619_usize
62+
);
63+
}
64+
}

0 commit comments

Comments
 (0)