- commit
- 9b77bc242ba210404b4b4b43bfa86b1b5d241933
- parent
- 6e2cb42f5ff9d20f5a0f60752f6d322a431ad240
- Author
- Tobias Bengfort <tobias.bengfort@posteo.de>
- Date
- 2022-12-23 10:36
perf: use HashSet for elves everywhere
Diffstat
M | 2022/23/solution.rs | 30 | ++++++++++++++++-------------- |
1 files changed, 16 insertions, 14 deletions
diff --git a/2022/23/solution.rs b/2022/23/solution.rs
@@ -7,12 +7,12 @@ enum Dir { North, East, South, West } 7 7 8 8 const DIRS: [Dir; 4] = [Dir::North, Dir::South, Dir::West, Dir::East]; 9 910 -1 fn get_input() -> Vec<(i64, i64)> {11 -1 let mut elves = vec![];-1 10 fn get_input() -> HashSet<(i64, i64)> { -1 11 let mut elves = HashSet::new(); 12 12 for (y, line) in lib::iter_input().enumerate() { 13 13 for (x, c) in line.chars().enumerate() { 14 14 if c == '#' {15 -1 elves.push((x as i64, y as i64));-1 15 elves.insert((x as i64, y as i64)); 16 16 } 17 17 } 18 18 } @@ -60,21 +60,23 @@ fn propose_move(elves: &HashSet<(i64, i64)>, x: i64, y: i64, offset: usize) -> ( 60 60 return (x, y); 61 61 } 62 6263 -1 fn do_round(elves: &mut Vec<(i64, i64)>, offset: usize) -> bool {64 -1 let mut proposals: HashMap<(i64, i64), Vec<usize>> = HashMap::new();-1 63 fn do_round(elves: &mut HashSet<(i64, i64)>, offset: usize) -> bool { -1 64 let mut proposals: HashMap<(i64, i64), Vec<(i64, i64)>> = HashMap::new(); 65 65 let mut changed = false; 66 6667 -1 let elves_set = elves.iter().map(|a| *a).collect();68 -1 for i in 0..elves.len() {69 -1 let (x, y) = elves[i];70 -1 let proposal = propose_move(&elves_set, x, y, offset);71 -1 proposals.entry(proposal).and_modify(|v| v.push(i)).or_insert(vec![i]);-1 67 for pos in elves.iter() { -1 68 let proposal = propose_move(elves, pos.0, pos.1, offset); -1 69 if proposal != *pos { -1 70 proposals.entry(proposal) -1 71 .and_modify(|v| v.push(*pos)) -1 72 .or_insert(vec![*pos]); -1 73 } 72 74 } 73 7574 -1 for (pos, is) in proposals.iter() {75 -1 let i = is[0];76 -1 if is.len() == 1 && elves[i] != *pos {77 -1 elves[i] = *pos;-1 76 for (new, olds) in proposals.iter() { -1 77 if olds.len() == 1 { -1 78 elves.remove(&olds[0]); -1 79 elves.insert(*new); 78 80 changed = true; 79 81 } 80 82 }