From 2f0e522317972711b5e03ad25b38bf03af17e8d5 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Mon, 7 Jul 2025 09:51:31 +0200 Subject: Day 20 2022 --- 2022/20/common.rs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 2022/20/common.rs (limited to '2022/20/common.rs') diff --git a/2022/20/common.rs b/2022/20/common.rs new file mode 100644 index 0000000..cecc316 --- /dev/null +++ b/2022/20/common.rs @@ -0,0 +1,37 @@ +const MAX_OVERFLOW: i64 = 10000000000; + +pub fn read_from_stdin(key: i64) -> Vec<(usize, i64)> { + let mut line = String::new(); + let mut v = vec![]; + while std::io::stdin().read_line(&mut line).unwrap() > 0 { + v.push((v.len(), line[..line.len()-1].parse::().unwrap() * key)); + line.clear(); + } + v +} + +fn get_newpos(pos: i64, k: i64, n: i64) -> i64 { + (pos + k + MAX_OVERFLOW * (n-1)) % (n-1) +} + +fn move_to(a: &mut [(usize, i64)], i: usize, j: usize) { + if i < j { + for k in i..j { a.swap(k, k+1); } + } else { + for k in (j+1..=i).rev() { a.swap(k, k-1); } + } +} + +pub fn mix(a: &mut Vec<(usize, i64)>) { + for i in 0..a.len() { + let pos = a.iter().position(|x| x.0 == i).unwrap(); + let newpos = get_newpos(pos as i64, a[pos].1, a.len() as i64) as usize; + move_to(a, pos, newpos); + } +} + +pub fn groove_sum(a: &Vec<(usize, i64)>) -> i64 { + let n = a.len(); + let z = a.iter().position(|x| x.1 == 0).unwrap(); + a[(z + 1000) % n].1 + a[(z + 2000) % n].1 + a[(z + 3000) % n].1 +} -- cgit v1.3