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 day4;
|
||||
// pub mod day5;
|
||||
pub mod day6;
|
||||
// pub mod day6;
|
||||
pub mod day7;
|
||||
|
||||
aoc_lib! { year = 2025 }
|
||||
|
||||
Reference in New Issue
Block a user