+16
2025/Cargo.lock
+16
2025/Cargo.lock
···
1
+
# This file is automatically @generated by Cargo.
2
+
# It is not intended for manual editing.
3
+
version = 4
4
+
5
+
[[package]]
6
+
name = "anyhow"
7
+
version = "1.0.100"
8
+
source = "registry+https://github.com/rust-lang/crates.io-index"
9
+
checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
10
+
11
+
[[package]]
12
+
name = "aoc2025"
13
+
version = "0.1.0"
14
+
dependencies = [
15
+
"anyhow",
16
+
]
+7
2025/Cargo.toml
+7
2025/Cargo.toml
+1
2025/src/days/mod.rs
+1
2025/src/days/mod.rs
···
1
+
pub mod one;
+1
2025/src/days/one/mod.rs
+1
2025/src/days/one/mod.rs
···
1
+
pub mod secret_entrance;
+37
2025/src/days/one/secret_entrance.rs
+37
2025/src/days/one/secret_entrance.rs
···
1
+
pub fn main() -> anyhow::Result<()> {
2
+
crate::run("Secret Entrance", "inputs/day1.txt", parse, part_a, part_b)
3
+
}
4
+
5
+
fn parse(input: &str) -> Vec<i32> {
6
+
input
7
+
.lines()
8
+
.filter(|line| !line.is_empty())
9
+
.filter_map(|line| line.replace("L", "-").replace("R", "").parse().ok())
10
+
.collect()
11
+
}
12
+
13
+
fn part_a(input: Vec<i32>) -> usize {
14
+
input
15
+
.iter()
16
+
.scan(50, |state, &rotation| {
17
+
*state += rotation;
18
+
Some(*state)
19
+
})
20
+
.filter(|&state| state % 100 == 0)
21
+
.count()
22
+
}
23
+
24
+
fn part_b(input: Vec<i32>) -> usize {
25
+
input
26
+
.iter()
27
+
.scan(50, |state, &rotation| {
28
+
let mut passes = (rotation / 100).abs() as usize;
29
+
let turn = rotation % 100;
30
+
if *state + turn <= 0 && *state != 0 || 99 < *state + turn {
31
+
passes += 1;
32
+
}
33
+
*state = (*state + turn).rem_euclid(100);
34
+
Some(passes)
35
+
})
36
+
.sum()
37
+
}
+47
2025/src/lib.rs
+47
2025/src/lib.rs
···
1
+
pub mod days;
2
+
3
+
use std::{fmt::Display, fs, time::Instant};
4
+
5
+
use anyhow::Result;
6
+
7
+
pub fn run<T, P, A, B, RA, RB>(
8
+
name: &str,
9
+
input_path: &str,
10
+
parse: P,
11
+
part_a: A,
12
+
part_b: B,
13
+
) -> Result<()>
14
+
where
15
+
T: Clone,
16
+
P: Fn(&str) -> T,
17
+
A: Fn(T) -> RA,
18
+
B: Fn(T) -> RB,
19
+
RA: Display,
20
+
RB: Display,
21
+
{
22
+
let input = parse(&fs::read_to_string(input_path)?);
23
+
24
+
let label_a = format!("{name} Part A");
25
+
println!("{label_a}");
26
+
println!("{}", "-".repeat(label_a.len()));
27
+
let part_a_start = Instant::now();
28
+
println!("Part A answer: {}", part_a(input.clone()));
29
+
let part_a_elapsed = part_a_start.elapsed();
30
+
println!("Part A time: {:?}", part_a_elapsed);
31
+
32
+
println!();
33
+
34
+
let label_b = format!("{name} Part B");
35
+
println!("{label_b}");
36
+
println!("{}", "-".repeat(label_b.len()));
37
+
let part_b_start = Instant::now();
38
+
println!("Part B answer: {}", part_b(input.clone()));
39
+
let part_b_elapsed = part_b_start.elapsed();
40
+
println!("Part B time: {:?}", part_b_elapsed);
41
+
42
+
println!();
43
+
44
+
println!("Total time: {:?}", part_a_elapsed + part_b_elapsed);
45
+
46
+
Ok(())
47
+
}