diff options
| author | Reiner Herrmann <reiner@reiner-h.de> | 2022-12-21 12:35:15 +0100 |
|---|---|---|
| committer | Reiner Herrmann <reiner@reiner-h.de> | 2022-12-21 13:17:47 +0100 |
| commit | e7021d251dcf2b325e4f573368f0c7410a4c9d2e (patch) | |
| tree | afaa0a585a15f2d1128ad2910057d19a105bf658 /src | |
| parent | 7c4319128f8d3702e58ace9965a00f87a3812b41 (diff) | |
day20 part1
Diffstat (limited to 'src')
| -rw-r--r-- | src/bin/day20.rs | 60 |
1 files changed, 60 insertions, 0 deletions
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::<isize>().unwrap(), false)) + .collect::<Vec<_>>(); + + 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::<Vec<_>>(); + + assert_eq!(grove_coordinates(&input), 3); + } +} |
