From e7021d251dcf2b325e4f573368f0c7410a4c9d2e Mon Sep 17 00:00:00 2001 From: Reiner Herrmann Date: Wed, 21 Dec 2022 12:35:15 +0100 Subject: day20 part1 --- src/bin/day20.rs | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/bin/day20.rs (limited to 'src') diff --git a/src/bin/day20.rs b/src/bin/day20.rs new file mode 100644 index 0000000..79ab0f9 --- /dev/null +++ b/src/bin/day20.rs @@ -0,0 +1,60 @@ +static DAY: u8 = 20; + +fn main() { + let input = advent::read_lines(DAY); + println!("{DAY}a: {}", grove_coordinates(&input)); + println!("{DAY}b: {}", 0); +} + +fn grove_coordinates(input: &[String]) -> isize { + let mut input = input.iter() + .map(|x| (x.parse::().unwrap(), false)) + .collect::>(); + + loop { + let pos = match input.iter().position(|x| !x.1) { + None => break, + Some(p) => p, + }; + let val = input[pos]; + input.remove(pos); + + let input_len = input.len() as isize; + + let pos_diff = val.0 % input_len; + let mut new_pos = (pos as isize + pos_diff) % input_len; + if new_pos.is_negative() { + new_pos += input_len; + } + + if new_pos == 0 { + input.push((val.0 as isize, true)); + } else { + input.insert(new_pos as usize, (val.0 as isize, true)); + } + } + + let pos = input.iter().position(|x| x.0 == 0).unwrap(); + let n = ((pos + 1000) % input.len(), (pos + 2000) % input.len(), (pos + 3000) % input.len()); + input[n.0].0 + input[n.1].0 + input[n.2].0 +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test() { + let input = [ + "1", + "2", + "-3", + "3", + "-2", + "0", + "4", + ].iter().map(|&x| String::from(x)).collect::>(); + + assert_eq!(grove_coordinates(&input), 3); + } +} -- cgit v1.2.3