adventofcode

git clone https://git.ce9e.org/adventofcode.git

commit
466ce8ac1b07f881dcbf43e99744256a4b8e2b03
parent
5cea89071e5b5f2baa882c61af47b48874c1b539
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2022-12-23 09:29
refactor

Diffstat

M 2022/23/solution.rs 70 +++++++++++++++----------------------------------------------

1 files changed, 17 insertions, 53 deletions


diff --git a/2022/23/solution.rs b/2022/23/solution.rs

@@ -1,15 +1,9 @@
    1     1 #[path = "../lib.rs"] mod lib;
    2     2 
    3    -1 enum Dir {
    4    -1     North,
    5    -1     East,
    6    -1     South,
    7    -1     West,
    8    -1 }
   -1     3 enum Dir { North, East, South, West }
    9     4 
   10     5 const DIRS: [Dir; 4] = [Dir::North, Dir::South, Dir::West, Dir::East];
   11     6 
   12    -1 
   13     7 fn get_input() -> Vec<(i64, i64)> {
   14     8     let mut elves = vec![];
   15     9     for (y, line) in lib::iter_input().enumerate() {
@@ -22,25 +16,6 @@ fn get_input() -> Vec<(i64, i64)> {
   22    16     return elves;
   23    17 }
   24    18 
   25    -1 fn render(elves: &Vec<(i64, i64)>) {
   26    -1     let x1 = elves.iter().map(|(x, _)| *x).min().unwrap();
   27    -1     let y1 = elves.iter().map(|(_, y)| *y).min().unwrap();
   28    -1     let x2 = elves.iter().map(|(x, _)| *x).max().unwrap();
   29    -1     let y2 = elves.iter().map(|(_, y)| *y).max().unwrap();
   30    -1 
   31    -1     for y in y1..=y2 {
   32    -1         for x in x1..=x2 {
   33    -1             if elves.contains(&(x, y)) {
   34    -1                 print!("#");
   35    -1             } else {
   36    -1                 print!(".");
   37    -1             }
   38    -1         }
   39    -1         print!("\n");
   40    -1     }
   41    -1     print!("\n");
   42    -1 }
   43    -1 
   44    19 fn propose_move(elves: &Vec<(i64, i64)>, x: i64, y: i64, offset: usize) -> (i64, i64) {
   45    20     if !elves.iter().any(|(x2, y2)| (*x2, *y2) != (x, y) && (*x2 - x).abs() <= 1 && (*y2 - y).abs() <= 1) {
   46    21         return (x, y);
@@ -94,39 +69,28 @@ fn do_round(elves: &Vec<(i64, i64)>, offset: usize) -> (Vec<(i64, i64)>, bool) {
   94    69         }
   95    70     }
   96    71 
   97    -1     // println!("==== Round {} ====", offset);
   98    -1     // render(&result);
   99    -1 
  100    72     return (result, changed);
  101    73 }
  102    74 
  103    -1 fn part1(init: &Vec<(i64, i64)>, rounds: usize) -> i64 {
  104    -1     let mut elves = do_round(init, 0).0;
  105    -1     for i in 1..rounds {
  106    -1         elves = do_round(&elves, i).0;
  107    -1     }
   -1    75 fn main() {
   -1    76     let mut elves = get_input();
  108    77 
  109    -1     let x1 = elves.iter().map(|(x, _)| x).min().unwrap();
  110    -1     let y1 = elves.iter().map(|(_, y)| y).min().unwrap();
  111    -1     let x2 = elves.iter().map(|(x, _)| x).max().unwrap();
  112    -1     let y2 = elves.iter().map(|(_, y)| y).max().unwrap();
   -1    78     for i in 0.. {
   -1    79         let (new_elves, changed) = do_round(&elves, i);
   -1    80         elves = new_elves;
  113    81 
  114    -1     return (x2 + 1 - x1) * (y2 + 1 - y1) - elves.len() as i64;
  115    -1 }
   -1    82         if i + 1 == 10 {
   -1    83             let x1 = elves.iter().map(|(x, _)| x).min().unwrap();
   -1    84             let y1 = elves.iter().map(|(_, y)| y).min().unwrap();
   -1    85             let x2 = elves.iter().map(|(x, _)| x).max().unwrap();
   -1    86             let y2 = elves.iter().map(|(_, y)| y).max().unwrap();
  116    87 
  117    -1 fn part2(init: &Vec<(i64, i64)>) -> usize {
  118    -1     let mut state = do_round(init, 0);
  119    -1     for i in 1.. {
  120    -1         state = do_round(&state.0, i);
  121    -1         if !state.1 {
  122    -1             return i + 1;
   -1    88             let score = (x2 + 1 - x1) * (y2 + 1 - y1) - elves.len() as i64;
   -1    89             println!("part1: {}", score);
   -1    90         }
   -1    91         if !changed {
   -1    92             println!("part2: {}", i + 1);
   -1    93             break;
  123    94         }
  124    95     }
  125    -1     unreachable!();
  126    -1 }
  127    -1 
  128    -1 fn main() {
  129    -1     let elves = get_input();
  130    -1     println!("part1: {}", part1(&elves, 10));
  131    -1     println!("part2: {}", part2(&elves));
  132    96 }