From 93f574463b85afaa680f7180b6adef4e9042833a Mon Sep 17 00:00:00 2001 From: jazzpi Date: Wed, 21 Dec 2022 15:41:35 +0100 Subject: [PATCH] Day 20, part 2 --- src/bin/d20p1.rs | 2 +- src/bin/d20p2.rs | 16 ++++++++++++++++ src/day20.rs | 18 +++++++++++------- 3 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 src/bin/d20p2.rs diff --git a/src/bin/d20p1.rs b/src/bin/d20p1.rs index 176a58b..b0e59e6 100644 --- a/src/bin/d20p1.rs +++ b/src/bin/d20p1.rs @@ -1,7 +1,7 @@ use aoc22::{day20, util}; pub fn main() { - let nodes = day20::parse_file(&util::parse_input()); + let nodes = day20::parse_file(&util::parse_input(), 1); day20::mix(&nodes); diff --git a/src/bin/d20p2.rs b/src/bin/d20p2.rs new file mode 100644 index 0000000..a5eb894 --- /dev/null +++ b/src/bin/d20p2.rs @@ -0,0 +1,16 @@ +use aoc22::{day20, util}; + +const KEY: isize = 811589153; +const ROUNDS: usize = 10; + +pub fn main() { + let nodes = day20::parse_file(&util::parse_input(), KEY); + // day20::print_nodes(&nodes); + + for _ in 0..ROUNDS { + day20::mix(&nodes); + // day20::print_nodes(&nodes); + } + + println!("Sum of coordinates: {}", day20::calc_coordinates(&nodes)); +} diff --git a/src/day20.rs b/src/day20.rs index 39c6558..75df371 100644 --- a/src/day20.rs +++ b/src/day20.rs @@ -35,14 +35,14 @@ pub fn get_prev(node: &Rc>, n: usize) -> Rc> { curr } -pub fn parse_file(input: &String) -> Vec>> { +pub fn parse_file(input: &String, key: isize) -> Vec>> { let mut result = Vec::new(); let mut last = None; for line in input.lines() { let val: isize = line.parse().unwrap(); let node = Rc::new(RefCell::new(Node { - val, + val: val * key, next: None, prev: last.clone(), })); @@ -64,9 +64,11 @@ pub fn parse_file(input: &String) -> Vec>> { } pub fn mix(nodes: &Vec>>) { + let div = nodes.len() - 1; + for node in nodes { let n = node.borrow().val; - if n == 0 { + if n == 0 || (n > 0 && (n as usize) % div == 0) || (n < 0 && (-n as usize) % div == 0) { continue; } @@ -77,9 +79,13 @@ pub fn mix(nodes: &Vec>>) { next.borrow_mut().prev = Some(prev.clone()); let prev = if n > 0 { - get_next(node, n as usize) + let n = (n as usize) % div; + assert!(n < div); + get_next(node, n) } else { - get_prev(node, (-n as usize) + 1) + let n = ((-n as usize) % div) + 1; + assert!(n < div); + get_prev(node, n) }; let next = get_next(&prev, 1); prev.deref().borrow_mut().next = Some(node.clone()); @@ -89,8 +95,6 @@ pub fn mix(nodes: &Vec>>) { n_mut.prev = Some(prev.clone()); n_mut.next = Some(next.clone()); drop(n_mut); - - // print_nodes(&nodes); } }