From 23b0aa1ff5c89393e618a24a8cb76036f2975322 Mon Sep 17 00:00:00 2001 From: Johannes Date: Mon, 9 Dec 2024 08:30:46 +0100 Subject: [PATCH] day 9 part 1 --- src/day09.rs | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + src/main.rs | 1 + 3 files changed, 76 insertions(+) create mode 100644 src/day09.rs diff --git a/src/day09.rs b/src/day09.rs new file mode 100644 index 0000000..18e4329 --- /dev/null +++ b/src/day09.rs @@ -0,0 +1,74 @@ +use std::fs::read_to_string; + +pub fn day_main() { + let input = read_to_string("input/day09.txt").unwrap(); + let input = input.trim(); + println!(" part1: {}", part1(input)); + println!(" part2: {}", part2(input)); +} + +type RiddleResult = usize; + +fn part1(input: &str) -> RiddleResult { + let mut disk = Vec::with_capacity(input.len() * 10); + for (i, l) in input.chars().enumerate() { + let l = l.to_digit(10).unwrap(); + let content = if i % 2 == 0 { + // file + Some(i / 2) // id based on order of apperance and every second one is a file + } else { + None + }; + for j in 0..l { + disk.push(content); + } + } + // dbg!(disk); + let mut free = disk + .iter() + .enumerate() + .find(|(_, v)| v.is_none()) + .unwrap() + .0; + let mut last_block = disk.len() - 1; + + while free < last_block { + if disk[free].is_some() { + break; + } + disk[free] = disk[last_block]; + disk[last_block] = None; + while last_block > 0 && disk[last_block].is_none() { + last_block -= 1; + } + while free < disk.len() && disk[free].is_some() { + free += 1; + } + } + disk.into_iter() + .take(free) + .enumerate() + .map(|(i, v)| i * v.unwrap()) + .sum() +} + +fn part2(_input: &str) -> RiddleResult { + 0 +} + +#[cfg(test)] +mod test { + use super::{part1, part2}; + + const TEST_INPUT: &str = r"2333133121414131402"; + + #[test] + fn test1() { + assert_eq!(part1(TEST_INPUT), 1928); + } + + #[test] + fn test2() { + assert_eq!(part2(TEST_INPUT), 0); + } +} diff --git a/src/lib.rs b/src/lib.rs index 9e83a3a..bec7896 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,4 +6,5 @@ pub mod day05; pub mod day06; pub mod day07; pub mod day08; +pub mod day09; pub mod utils; diff --git a/src/main.rs b/src/main.rs index 133ef8d..5185f1e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,6 +13,7 @@ fn main() { (6, day06::day_main), (7, day07::day_main), (8, day08::day_main), + (9, day09::day_main), ]); let day: Option = args().nth(1).and_then(|a| a.parse().ok()); let Some(day) = day else {