From c99848b907d2d63577ffdc81fc11a77e4d328a92 Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Tue, 19 Apr 2022 20:24:37 +0200 Subject: Refile for merging repos --- 2017/src/bin/day_10.rs | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 2017/src/bin/day_10.rs (limited to '2017/src/bin/day_10.rs') diff --git a/2017/src/bin/day_10.rs b/2017/src/bin/day_10.rs new file mode 100644 index 0000000..faec18a --- /dev/null +++ b/2017/src/bin/day_10.rs @@ -0,0 +1,63 @@ +extern crate advent_of_code_2017; +use advent_of_code_2017::*; + +fn main() { + let args = AdventArgs::init(); + + let lengths: Vec = if args.part == 1 { + args.input[0].split(",").map(|x| x.parse().unwrap()).collect() + } else { + let suffix: [usize; 5] = [17, 31, 73, 47, 23]; + args.input[0].as_bytes() + .iter().map(|&x| x as usize) + .chain(suffix.iter().cloned()) + .collect() + }; + + let mut position = 0; + let mut list: Vec = (0..256).collect(); + + if args.part == 1 { + hash_round(&mut list, &lengths, &mut position, 0); + } else { + for i in 0..64 { + let skip = lengths.len() * i; + hash_round(&mut list, &lengths, &mut position, skip); + } + } + + + if args.part == 1 { + let answer = list[0]*list[1]; + println!("{}", answer); + } else { + let mut current_char = 0; + for (i, l) in list.iter().enumerate() { + current_char = current_char ^ l; + if i % 16 == 15 { + print!("{:02x}", current_char); + current_char = 0; + } + } + println!(""); + } +} + +fn hash_round(list: &mut Vec, lengths: &Vec, position: &mut usize, skip: usize) { + for (inner_skip, &length) in lengths.iter().enumerate() { + reverse(list, *position, length); + *position = (*position + length + skip + inner_skip) % list.len(); + } +} + +fn reverse(list: &mut Vec, position: usize, length: usize) { + let mut a = position; + let mut b = position + length - 1; + let len = list.len(); + while a < b { + list.swap(a%len, b%len); + + a += 1; + b -= 1; + } +} -- cgit v1.2.3