From 43003def6bb173749c57b9c67439a7a876be83da Mon Sep 17 00:00:00 2001 From: Johannes Date: Sat, 14 Dec 2024 08:57:16 +0100 Subject: [PATCH] day 14 part 1 --- src/day14.rs | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + src/main.rs | 1 + 3 files changed, 108 insertions(+) create mode 100644 src/day14.rs diff --git a/src/day14.rs b/src/day14.rs new file mode 100644 index 0000000..d03cf44 --- /dev/null +++ b/src/day14.rs @@ -0,0 +1,106 @@ +use std::fs::read_to_string; + +use itertools::Itertools; + +pub fn day_main() { + let input = read_to_string("input/day14.txt").unwrap(); + let input = input.trim(); + println!(" part1: {}", part1(input)); // 50112000 too low + println!(" part2: {}", part2(input)); +} + +type RiddleResult = usize; + +fn part1(input: &str) -> RiddleResult { + solve(input, 100, 101, 103) +} + +fn solve(input: &str, rounds: i64, width: i64, height: i64) -> RiddleResult { + let mut robots: Vec<((i64, i64), (i64, i64))> = input + .lines() + .map(|line| { + line.strip_prefix("p=") + .unwrap() + .split(" v=") + .map(|s| { + s.split(",") + .map(|d| d.parse::().unwrap()) + .collect_tuple::<(i64, i64)>() + .unwrap() + }) + .collect_tuple() + .unwrap() + }) + .collect_vec(); + for _ in 0..rounds { + robots.iter_mut().for_each(|((px, py), (vx, vy))| { + *px = (*px + width + *vx) % width; + *py = (*py + height + *vy) % height; + }); + } + // for y in 0..height { + // for x in 0..width { + // let c = robots + // .iter() + // .filter(|&&((px, py), _)| px == x && py == y) + // .count(); + // if c == 0 { + // print!("."); + // } else { + // print!("{c}"); + // } + // } + // println!(); + // } + robots + .iter() + .filter(|&&((px, py), _)| px < width / 2 && py < height / 2) + .count() + * robots + .iter() + .filter(|&&((px, py), _)| px < width / 2 && py > height / 2) + .count() + * robots + .iter() + .filter(|&&((px, py), _)| px > width / 2 && py < height / 2) + .count() + * robots + .iter() + .filter(|&&((px, py), _)| px > width / 2 && py > height / 2) + .count() +} + +fn part2(_input: &str) -> RiddleResult { + 0 +} + +#[cfg(test)] +mod test { + use crate::day14::solve; + + use super::part2; + + const TEST_INPUT: &str = r"p=0,4 v=3,-3 +p=6,3 v=-1,-3 +p=10,3 v=-1,2 +p=2,0 v=2,-1 +p=0,0 v=1,3 +p=3,0 v=-2,-2 +p=7,6 v=-1,-3 +p=3,0 v=-1,-2 +p=9,3 v=2,3 +p=7,3 v=-1,2 +p=2,4 v=2,-3 +p=9,5 v=-3,-3 +"; + + #[test] + fn test1() { + assert_eq!(solve(TEST_INPUT, 100, 11, 7), 12); + } + + #[test] + fn test2() { + assert_eq!(part2(TEST_INPUT), 0); + } +} diff --git a/src/lib.rs b/src/lib.rs index d4f41a6..a2305cd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,5 +11,6 @@ pub mod day10; pub mod day11; pub mod day12; pub mod day13; +pub mod day14; // PLACEHOLDER pub mod utils; diff --git a/src/main.rs b/src/main.rs index f1ac698..29e9315 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,6 +18,7 @@ fn main() { (11, day11::day_main), (12, day12::day_main), (13, day13::day_main), + (14, day14::day_main), // PLACEHOLDER ]); let day: Option = args().nth(1).and_then(|a| a.parse().ok());