]> aoc.elinar.fr Git - aoc_2023/commitdiff
Day14 - préparation partie 2
authoralex <null>
Thu, 14 Dec 2023 12:48:04 +0000 (13:48 +0100)
committeralex <null>
Thu, 14 Dec 2023 12:48:04 +0000 (13:48 +0100)
src/day14.rs

index 20ad1870242ae75ffc6997c8bfe79c359aa3cb7b..2e7441cc23e6a924798316301e1352728e2337e2 100644 (file)
@@ -16,63 +16,92 @@ pub fn run(input_file: &str) -> Result<(), Box<dyn Error>> {
     Ok(())
 }
 
-fn run_part1(input: &str) -> Result<u64, Box<dyn Error>> {
-    println!("Running day14 - part 1");
+struct Puzzle {
+    rows: Vec<Vec<char>>,
+    height: usize,
+    width: usize,
+}
 
-    let mut rows: Vec<Vec<char>> = input.lines()
-        .filter_map(|l| {
-            match l.is_empty() {
-                true => None,
-                false => {
-                    Some(l.chars().collect::<Vec<char>>())
-                },
-            }
-        })
-        .collect();
-    //rows.iter().for_each(|r| { println!("{:?}", r); });
-
-    let height = rows.len();
-    let width = rows[0].len();
-    for i in 0..width {
-        let mut j = 0;
-        while j < height {
-            while j < height && rows[j][i] != 'O' {
-                j += 1;
-            }
-            if j >= height {
-                continue;
-            }
-            if rows[j][i] == 'O' {
-                if j == 0 {
+impl Puzzle {
+    pub fn new(input: &str) -> Self {
+        let rows: Vec<Vec<char>> = input.lines()
+            .filter_map(|l| {
+                match l.is_empty() {
+                    true => None,
+                    false => {
+                        Some(l.chars().collect::<Vec<char>>())
+                    },
+                }
+            })
+            .collect();
+
+        //rows.iter().for_each(|r| { println!("{:?}", r); });
+        let height = rows.len();
+        let width = rows[0].len();
+
+        Self {
+            rows,
+            height,
+            width,
+        }
+    }
+
+    pub fn print(&self) {
+        self.rows.iter().for_each(|r| { println!("{:?}", r); });
+    }
+
+    pub fn roll_north(&mut self) {
+        for i in 0..self.width {
+            let mut j = 0;
+            while j < self.height {
+                while j < self.height && self.rows[j][i] != 'O' {
                     j += 1;
+                }
+                if j >= self.height {
                     continue;
                 }
-                let mut k = j;
-                while k > 0 && rows[k - 1][i] == '.' {
-                    k -= 1;
+                if self.rows[j][i] == 'O' {
+                    if j == 0 {
+                        j += 1;
+                        continue;
+                    }
+                    let mut k = j;
+                    while k > 0 && self.rows[k - 1][i] == '.' {
+                        k -= 1;
+                    }
+                    self.rows[j][i] = '.';
+                    self.rows[k][i] = 'O';
+                    //println!("{:2} swap: {} -> {}", i, j, k);
+                    //self.print();
                 }
-                rows[j][i] = '.';
-                rows[k][i] = 'O';
-                //println!("{:2} swap: {} -> {}", i, j, k);
-                //rows.iter().for_each(|r| { println!("{:?}", r); });
+                j += 1;
             }
-            j += 1;
         }
     }
 
-    let res = rows.iter().enumerate()
-        .map(|(i, r)| {
-            let s: u64 = r.iter()
-                .filter_map(|c| {
-                    match c {
-                        'O' => Some(1),
-                        _ => None,
-                    }
-                })
-                .sum();
-            s * (height - i) as u64
-        })
-        .sum();
+    pub fn total_load_north(&self) -> u64 {
+        self.rows.iter().enumerate()
+            .map(|(i, r)| {
+                let s: u64 = r.iter()
+                    .filter_map(|c| {
+                        match c {
+                            'O' => Some(1),
+                            _ => None,
+                        }
+                    })
+                    .sum();
+                s * (self.height - i) as u64
+            })
+            .sum()
+    }
+}
+
+fn run_part1(input: &str) -> Result<u64, Box<dyn Error>> {
+    println!("Running day14 - part 1");
+
+    let mut puzzle = Puzzle::new(input);
+    puzzle.roll_north();
+    let res = puzzle.total_load_north();
     Ok(res)
 }