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);
+    }
+}