This commit is contained in:
2025-12-08 04:29:19 +01:00
parent 93cca2e135
commit c6c159ca4e
2 changed files with 114 additions and 1 deletions

112
src/day7.rs Normal file
View File

@@ -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<Vec<(usize, TachyonPoint)>> {
let lines = input.lines().filter(|l| l.chars().any(|c| c != '.'));
let mut fieldmap: Vec<Vec<(usize, TachyonPoint)>> = 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<usize, u64>,
) -> (HashMap<usize, u64>, 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);
}
}

View File

@@ -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 }