adventofcode

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

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     9 
   10    -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    62 
   63    -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    66 
   67    -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    75 
   74    -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     }