day 16 task 1 and not working idea of task 2...
This commit is contained in:
77
src/tasks/day16.rs
Normal file
77
src/tasks/day16.rs
Normal file
@@ -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<i32>) {
|
||||||
|
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<i32>) {
|
||||||
|
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::<usize>().unwrap();
|
||||||
|
let message = result[offset..offset + 8].iter().join("");
|
||||||
|
println!("Task 2: {}", message);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user