commit 5cd4bbc3742ae6f34a0ad17f2c68e2f0f4e95fd0
parent 2335c9d7580ac5cf7c0169910684cb974bd4d4bd
Author: Martin Ashby <martin@ashbysoft.com>
Date:   Sat, 17 Dec 2022 23:29:20 +0000
day17 skeleton...
Diffstat:
3 files changed, 94 insertions(+), 2 deletions(-)
diff --git a/input/day17_ex.txt b/input/day17_ex.txt
@@ -0,0 +1 @@
+>>><<><>><<<>><>>><<<>>><<<><<<>><>><<>>
+\ No newline at end of file
diff --git a/src/day17.rs b/src/day17.rs
@@ -0,0 +1,87 @@
+const ROCK: char = '#';
+const AIR: char = '.';
+
+#[derive(Clone,PartialEq)]
+struct Pos {
+    x: u32,
+    y: u32,
+}
+
+#[derive(Clone,PartialEq)]
+enum RockType {
+    Bar,Cross,Ell,VBar,Square
+}
+
+enum Direction {
+    Down,Left,Right
+}
+
+#[derive(Clone,PartialEq)]
+struct Rock {
+    rtype: RockType,
+    pos: Pos,
+}
+
+impl Rock {
+    pub fn mv(self, dir: Direction, grid: &Vec<Vec<char>>) -> Self {
+        // Check we _can_ move
+        // Then move
+        self
+    }
+    pub fn solidify(self, grid: &mut Vec<Vec<char>>) {
+        // as it says, transform squares covered by ourselves into solid rock
+    }
+}
+
+fn rock_height(grid: &Vec<Vec<char>>) -> usize {
+    0
+}
+
+fn run(input: String) {
+    let initial_height = 6;
+    let width = 7;
+    let rocks = vec![RockType::Bar,RockType::Cross,RockType::Ell,RockType::VBar,RockType::Square].into_iter().cycle();
+    let gas_jets = input.chars().cycle();
+    let mut grid: Vec<Vec<char>> = (0..initial_height).map(|_| {
+        (0..width).map(|_| {AIR}).collect()
+    }).collect();
+
+    let mut rock = Rock{
+        rtype: rocks.next().unwrap(),
+        pos: Pos{x: 2, y: 3}
+    };
+    let mut rocks_count: usize = 1;
+    'lp: loop {
+        let mv = match gas_jets.next().unwrap() {
+            '>' => Direction::Right,
+            '<' => Direction::Left,
+            dir => panic!("Unexpected jet direction! {}", dir)
+        };
+        // apply jet, ignore if it didn't move
+        let r2 = rock.mv(mv, &grid);
+        // apply gravity
+        let r3 = r2.mv(Direction::Down, &grid);
+
+        if rock == r3 {
+            // We didn't move, solidify!
+            rock.solidify(&mut grid);
+            if rocks_count == 2022 {
+                break 'lp;
+            }
+            // Measure height...
+            let max_rock = rock_height(&grid);
+            // Extend grid to max_rock + 7 (enough room for any new rocks)
+            grid.extend((0..(max_rock+7)).map(|_| { (0..width).map(|_| { AIR }).collect() }));
+            // Spawn new rock
+            rock = Rock {
+                rtype: rocks.next().unwrap(),
+                pos: Pos{x: 2, y: 3}
+            };
+            // remember how many rocks we did
+            rocks_count += 1;
+        } else {
+            rock = r3;
+        }
+    }
+    println!("Day 17: {}", rock_height(&grid));
+}
+\ No newline at end of file
diff --git a/src/main.rs b/src/main.rs
@@ -17,7 +17,8 @@ use std::fs;
 // mod day13;
 // mod day14;
 // mod day15;
-mod day16;
+// mod day16;
+mod day17;
 
 fn main() {
     // day1::run(fs::read_to_string("input/day1.txt").expect("Failed to read input file!"));
@@ -35,5 +36,6 @@ fn main() {
     // day13::run(fs::read_to_string("input/day13.txt").expect("Failed to read input file!"));
     // day14::run(fs::read_to_string("input/day14.txt").expect("Failed to read input file!"));
     // day15::run(fs::read_to_string("input/day15.txt").expect("Failed to read input file!"));
-    day16::run(fs::read_to_string("input/day16.txt").expect("Failed to read input file!"));
+    // day16::run(fs::read_to_string("input/day16.txt").expect("Failed to read input file!"));
+    day17::run(fs::read_to_string("input/day17_ex.txt").expect("Failed to read input file!"));
 }