diff --git a/src/day7.rs b/src/day7.rs new file mode 100644 index 0000000..85944e8 --- /dev/null +++ b/src/day7.rs @@ -0,0 +1,112 @@ +use std::collections::HashMap; + +#[aoc(day7, part1)] +pub fn part1(input: &str) -> u32 { + let run = run(input); + run.0 +} + +#[aoc(day7, part2)] +pub fn part2(input: &str) -> u64 { + let run = run(input); + run.1 +} + +fn run(input: &str) -> (u32, u64) { + let field = parse(input); + let mut beams = HashMap::new(); + let mut split_count = 0_u32; + for field_slice in field { + let local_split; + (beams, local_split) = propagate(&field_slice, beams); + split_count = split_count + local_split; + //println!("{}", split_count); + println!("{:?}", beams); + } + let timeline_count = beams.values().sum(); + (split_count, timeline_count) +} + +#[derive(Clone, Debug)] +enum TachyonPoint { + Source, + Splitter, +} + +fn parse(input: &str) -> Vec> { + let lines = input.lines().filter(|l| l.chars().any(|c| c != '.')); + let mut fieldmap: Vec> = vec![Vec::new(); lines.clone().count()]; + + for (i, line) in lines.enumerate() { + // println!("{}", line); + for (j, c) in line.chars().enumerate() { + match c { + 'S' => fieldmap[i].push((j, TachyonPoint::Source)), + '^' => fieldmap[i].push((j, TachyonPoint::Splitter)), + '.' => {} + _ => panic!("Unexpected input!"), + } + } + } + fieldmap +} + +fn propagate( + field_slice: &Vec<(usize, TachyonPoint)>, + mut beams: HashMap, +) -> (HashMap, u32) { + let mut split_count = 0; + for (i, tachyonpoint) in field_slice { + match tachyonpoint { + TachyonPoint::Source => { + beams.insert(*i, 1); + } + TachyonPoint::Splitter => { + if beams.contains_key(i) { + split_count = split_count + 1; + let local_value = beams[i]; + beams.remove(i); + let left = beams.remove(&(i - 1)).unwrap_or(0_u64); + beams.insert(i - 1, local_value + left); + let right = beams.remove(&(i + 1)).unwrap_or(0_u64); + beams.insert(i + 1, local_value + right); + } + } + } + } + (beams, split_count) +} + +#[cfg(test)] +mod tests { + use super::*; + + const EXAMPLE_INPUT: &str = "\ +.......S....... +............... +.......^....... +............... +......^.^...... +............... +.....^.^.^..... +............... +....^.^...^.... +............... +...^.^...^.^... +............... +..^...^.....^.. +............... +.^.^.^.^.^...^. +............... +"; + + #[test] + fn test_part1() { + assert_eq!(part1(EXAMPLE_INPUT), 21); + } + + #[test] + fn test_part2() { + assert_eq!(part2(EXAMPLE_INPUT), 40); + } +} diff --git a/src/lib.rs b/src/lib.rs index 10f8ffb..024cf9f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,6 +8,7 @@ extern crate aoc_runner_derive; // pub mod day3; // pub mod day4; // pub mod day5; -pub mod day6; +// pub mod day6; +pub mod day7; aoc_lib! { year = 2025 }