From: alex Date: Thu, 14 Dec 2023 12:48:04 +0000 (+0100) Subject: Day14 - préparation partie 2 X-Git-Url: https://aoc.elinar.fr/?a=commitdiff_plain;h=29953f9747edb799c67c174af6caa64f1b52b0e6;p=aoc_2023 Day14 - préparation partie 2 --- diff --git a/src/day14.rs b/src/day14.rs index 20ad187..2e7441c 100644 --- a/src/day14.rs +++ b/src/day14.rs @@ -16,63 +16,92 @@ pub fn run(input_file: &str) -> Result<(), Box> { Ok(()) } -fn run_part1(input: &str) -> Result> { - println!("Running day14 - part 1"); +struct Puzzle { + rows: Vec>, + height: usize, + width: usize, +} - let mut rows: Vec> = input.lines() - .filter_map(|l| { - match l.is_empty() { - true => None, - false => { - Some(l.chars().collect::>()) - }, - } - }) - .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> = input.lines() + .filter_map(|l| { + match l.is_empty() { + true => None, + false => { + Some(l.chars().collect::>()) + }, + } + }) + .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> { + println!("Running day14 - part 1"); + + let mut puzzle = Puzzle::new(input); + puzzle.roll_north(); + let res = puzzle.total_load_north(); Ok(res) }