From 01b077fc5f0511c4a56fe07b91f90731673cfa6d Mon Sep 17 00:00:00 2001 From: Joe Ardent <code@ardent.nebcorp.com> Date: Fri, 3 Jan 2025 11:18:34 -0800 Subject: [PATCH] day9, part1 --- Cargo.lock | 4 +++ Cargo.toml | 2 +- day09/Cargo.toml | 6 ++++ day09/src/main.rs | 82 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 day09/Cargo.toml create mode 100644 day09/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 1f4e226..863a1ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,6 +52,10 @@ dependencies = [ "winnow", ] +[[package]] +name = "day09" +version = "0.1.0" + [[package]] name = "memchr" version = "2.7.4" diff --git a/Cargo.toml b/Cargo.toml index d7d46a8..e2c7c6d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "2" -members = ["day01", "day02", "day03", "day04", "day05", "day06", "day07", "day08"] +members = ["day01", "day02", "day03", "day04", "day05", "day06", "day07", "day08", "day09"] [workspace.dependencies] winnow = "0.6" diff --git a/day09/Cargo.toml b/day09/Cargo.toml new file mode 100644 index 0000000..0ede72d --- /dev/null +++ b/day09/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "day09" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/day09/src/main.rs b/day09/src/main.rs new file mode 100644 index 0000000..b898ef3 --- /dev/null +++ b/day09/src/main.rs @@ -0,0 +1,82 @@ +fn main() { + let input = std::fs::read_to_string("input").unwrap(); + println!("{}", pt1(&input)); +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum Cell { + Free, + Block(usize), +} + +fn pt1(input: &str) -> usize { + let mut next_id = 0; + let mut map = Vec::new(); + let mut frees = Vec::new(); + for (i, c) in input.chars().enumerate() { + let n = match c.to_digit(10) { + Some(n) => n as usize, + _ => { + continue; + } + }; + if i % 2 == 0 { + let cell = Cell::Block(next_id); + for _ in 0..n { + map.push(cell); + } + next_id += 1; + } else { + for _ in 0..n { + frees.push(map.len()); + map.push(Cell::Free); + } + } + } + let omap = map.clone(); + let mut next_free = 0; + for (i, &b) in omap.iter().enumerate().rev() { + if b == Cell::Free { + continue; + } + let free = frees[next_free]; + if i <= free { + break; + } + next_free += 1; + map.swap(free, i); + } + + //println!("{map:?}"); + + map.iter() + .enumerate() + .map(|(i, &b)| match b { + Cell::Block(v) => i * v, + _ => 0, + }) + .sum() +} + +enum Block { + Free(usize), + // size, id + Block(usize, usize), +} + +fn pt2(input: &str) -> usize { + todo!() +} + +#[cfg(test)] +mod test { + use super::*; + + static INPUT: &str = "2333133121414131402"; + + #[test] + fn p1() { + let v = pt1(INPUT); + assert_eq!(v, 1928); + } +}