- 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 6162 -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 -168 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 7074 -1 let mut result = vec![];75 -176 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 7785 -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();