From 51f16fa7ad07bdb78b20d7a82c1aa6dac0eb55a5 Mon Sep 17 00:00:00 2001 From: Johannes Date: Sun, 22 Dec 2019 11:43:14 +0100 Subject: [PATCH] day 16 task 1 and not working idea of task 2... --- src/tasks/day16.rs | 77 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/tasks/day16.rs diff --git a/src/tasks/day16.rs b/src/tasks/day16.rs new file mode 100644 index 0000000..5318783 --- /dev/null +++ b/src/tasks/day16.rs @@ -0,0 +1,77 @@ +use itertools::Itertools; +use num_integer::Integer; +use std::iter; + +#[allow(dead_code)] +pub fn run() { + let input = "03036732577212944063491565474664" //"59750530221324194853012320069589312027523989854830232144164799228029162830477472078089790749906142587998642764059439173975199276254972017316624772614925079238407309384923979338502430726930592959991878698412537971672558832588540600963437409230550897544434635267172603132396722812334366528344715912756154006039512272491073906389218927420387151599044435060075148142946789007756800733869891008058075303490106699737554949348715600795187032293436328810969288892220127730287766004467730818489269295982526297430971411865028098708555709525646237713045259603175397623654950719275982134690893685598734136409536436003548128411943963263336042840301380655801969822" + .chars() + .map(|it| it.to_digit(10).unwrap() as i32) + .collect_vec(); + task1(input.clone()); + task2(input.clone()); +} + +fn task1(input: Vec) { + let p = [0, 1, 0, -1]; + let result = (0..100).fold(input, |old, _| { + (1..=old.len()) + .map(|position| { + let pattern = p + .iter() + .map(|x| std::iter::repeat(*x).take(position)) + .flatten(); + let val: i32 = old + .iter() + .zip(std::iter::repeat(pattern).flatten().skip(1)) + .map(|(value, multiplier)| value * multiplier) + .sum(); + val.abs() % 10 + }) + .collect_vec() + }); + println!("Task 1: {:.*}", 8, result.iter().join("")); +} + +fn task2(input: Vec) { + let l = input.len() * 10_000; + let big_input = iter::repeat(input.clone().into_iter()) + .flatten() + .take(l) + .collect_vec(); + let p = [0, 1, 0, -1]; + let result = (0..100).fold(big_input, |old, _| { + (1..=old.len()) + .map(|position| { + let pattern = p.iter().map(|x| iter::repeat(*x).take(position)).flatten(); + let iter = iter::repeat(pattern).flatten().skip(1); + let repeats_after = (4 * position).lcm(&input.len()); + if repeats_after > l { + l + } else { + repeats_after + }; + let part: i32 = iter::repeat(input.iter()) + .flatten() + .zip(iter.clone()) + .take(repeats_after) + .map(|(value, multiplier)| value * multiplier) + .sum(); + let part_fits = l / repeats_after; + let most_parts = part * part_fits as i32; + + let number_rest = l / repeats_after; + let part_rest: i32 = iter + .zip(iter::repeat(input.iter()).flatten()) + .take(number_rest) + .map(|(value, multiplier)| value * multiplier) + .sum(); + + (part_rest + most_parts) % 10 + }) + .collect_vec() + }); + let offset = input[0..7].iter().join("").parse::().unwrap(); + let message = result[offset..offset + 8].iter().join(""); + println!("Task 2: {}", message); +}