- 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 23 -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 612 -113 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 1825 -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 -131 -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 -144 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 7197 -1 // println!("==== Round {} ====", offset);98 -1 // render(&result);99 -1100 72 return (result, changed); 101 73 } 102 74103 -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 77109 -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 81114 -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 87117 -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 -1128 -1 fn main() {129 -1 let elves = get_input();130 -1 println!("part1: {}", part1(&elves, 10));131 -1 println!("part2: {}", part2(&elves));132 96 }