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