feat: setup & day 1

thecoded.prof 4a7192ae 1414ea66

verified
+2
2025/.gitignore
··· 1 + /target 2 + inputs
+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
··· 1 + [package] 2 + name = "aoc2025" 3 + version = "0.1.0" 4 + edition = "2024" 5 + 6 + [dependencies] 7 + anyhow = "1.0.100"
+1
2025/src/days/mod.rs
··· 1 + pub mod one;
+1
2025/src/days/one/mod.rs
··· 1 + pub mod secret_entrance;
+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
··· 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 + }
+4
2025/src/main.rs
··· 1 + fn main() -> anyhow::Result<()> { 2 + aoc2025::days::one::secret_entrance::main()?; 3 + Ok(()) 4 + }