day7 :))
This commit is contained in:
112
src/day7.rs
Normal file
112
src/day7.rs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,6 +8,7 @@ extern crate aoc_runner_derive;
|
|||||||
// pub mod day3;
|
// pub mod day3;
|
||||||
// pub mod day4;
|
// pub mod day4;
|
||||||
// pub mod day5;
|
// pub mod day5;
|
||||||
pub mod day6;
|
// pub mod day6;
|
||||||
|
pub mod day7;
|
||||||
|
|
||||||
aoc_lib! { year = 2025 }
|
aoc_lib! { year = 2025 }
|
||||||
|
|||||||
Reference in New Issue
Block a user