adventofcode

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

commit
13b6e228cb0478e633629510657edf65a6a97187
parent
cbe257c3e02a48eb385e627019597f96c05db4e8
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2022-12-23 10:11
perf: mutate elves in place

Diffstat

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

1 files changed, 8 insertions, 16 deletions


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

@@ -59,38 +59,30 @@ fn propose_move(elves: &HashSet<(i64, i64)>, x: i64, y: i64, offset: usize) -> (
   59    59     return (x, y);
   60    60 }
   61    61 
   62    -1 fn do_round(elves: &Vec<(i64, i64)>, offset: usize) -> (Vec<(i64, i64)>, bool) {
   63    -1     let mut tmp = vec![];
   -1    62 fn do_round(elves: &mut Vec<(i64, i64)>, offset: usize) -> bool {
   -1    63     let mut proposed = vec![];
   64    64     let mut changed = false;
   65    65 
   66    66     let elves_set = elves.iter().map(|a| *a).collect();
   67    -1 
   68    67     for (x, y) in elves.iter() {
   69    -1         let proposed = propose_move(&elves_set, *x, *y, offset);
   70    -1         tmp.push(proposed);
   71    -1         changed |= proposed != (*x, *y);
   -1    68         proposed.push(propose_move(&elves_set, *x, *y, offset));
   72    69     }
   73    70 
   74    -1     let mut result = vec![];
   75    -1 
   76    71     for i in 0..elves.len() {
   77    -1         let (x, y) = tmp[i];
   78    -1         if tmp.iter().filter(|(x2, y2)| *x2 == x && *y2 == y).count() == 1 {
   79    -1             result.push((x, y));
   80    -1         } else {
   81    -1             result.push(elves[i]);
   -1    72         if proposed[i] != elves[i] && proposed.iter().filter(|(x2, y2)| (*x2, *y2) == proposed[i]).count() == 1 {
   -1    73             elves[i] = proposed[i];
   -1    74             changed = true;
   82    75         }
   83    76     }
   84    77 
   85    -1     return (result, changed);
   -1    78     return changed;
   86    79 }
   87    80 
   88    81 fn main() {
   89    82     let mut elves = get_input();
   90    83 
   91    84     for i in 0.. {
   92    -1         let (new_elves, changed) = do_round(&elves, i);
   93    -1         elves = new_elves;
   -1    85         let changed = do_round(&mut elves, i);
   94    86 
   95    87         if i + 1 == 10 {
   96    88             let x1 = elves.iter().map(|(x, _)| x).min().unwrap();