2022 day 20 rust
This commit is contained in:
parent
fce1331719
commit
88b70450d4
|
@ -1,3 +1,4 @@
|
||||||
|
#![allow(dead_code)]
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
use crate::utils;
|
use crate::utils;
|
||||||
|
|
||||||
|
@ -6,39 +7,36 @@ pub fn run() -> () {
|
||||||
let data = parse_data(&utils::read_lines(utils::Source::Day(20)));
|
let data = parse_data(&utils::read_lines(utils::Source::Day(20)));
|
||||||
|
|
||||||
println!("Day 20");
|
println!("Day 20");
|
||||||
println!("Part 1: {}", solve1(&data));
|
println!("Part 1: {}", solve::<1, 1>(&data));
|
||||||
println!("Part 2: {}", solve2(&data));
|
println!("Part 2: {}", solve::<811589153, 10>(&data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn reorder(data: &[(usize, i32)]) -> Vec<i32> {
|
fn reorder(data: &[(usize, i64)], reps: i32) -> Vec<i64> {
|
||||||
let mut array = data.iter().copied().collect::<VecDeque<_>>();
|
let mut array = VecDeque::from_iter(data.iter().copied());
|
||||||
|
|
||||||
|
for _ in 0..reps {
|
||||||
for item in data {
|
for item in data {
|
||||||
let index = array.iter().position(|item_ref| item == item_ref).unwrap();
|
let index = array.iter().position(|item_ref| item == item_ref).unwrap();
|
||||||
array.remove(index);
|
array.remove(index);
|
||||||
let index = (index as i32 + item.1).rem_euclid(array.len() as i32) as usize;
|
let index = (index as i64 + item.1).rem_euclid(array.len() as i64) as usize;
|
||||||
array.insert(index, *item);
|
array.insert(index, *item);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let zero_offset = array.iter().position(|item_ref| 0 == item_ref.1).unwrap();
|
let zero_offset = array.iter().position(|item_ref| 0 == item_ref.1).unwrap();
|
||||||
array.rotate_left(zero_offset);
|
array.rotate_left(zero_offset);
|
||||||
array.into_iter().map(|x| x.1).collect()
|
array.into_iter().map(|x| x.1).collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn solve1(data: &[(usize, i32)]) -> i32 {
|
fn solve<const KEY: i64, const REPS: i32>(data: &[(usize, i64)]) -> i64 {
|
||||||
let array = reorder(data);
|
let array = reorder(&Vec::from_iter(data.iter().map(|&(index, value)| (index, value * KEY))), REPS);
|
||||||
let len = array.len();
|
let len = array.len();
|
||||||
array[1000 % len] + array[2000 % len] + array[3000 % len]
|
array[1000 % len] + array[2000 % len] + array[3000 % len]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn solve2(data: &[(usize, i32)]) -> i32 {
|
|
||||||
reorder(data);
|
|
||||||
2
|
|
||||||
}
|
|
||||||
|
|
||||||
|
fn parse_data<T: AsRef<str>>(data: &[T]) -> Vec<(usize, i64)> {
|
||||||
fn parse_data<T: AsRef<str>>(data: &[T]) -> Vec<(usize, i32)> {
|
|
||||||
data.iter()
|
data.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(index, line)| (index, line.as_ref().parse().unwrap()))
|
.map(|(index, line)| (index, line.as_ref().parse().unwrap()))
|
||||||
|
@ -54,11 +52,11 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn part1() {
|
fn part1() {
|
||||||
assert_eq!(3, solve1(&parse_data(DATA)));
|
assert_eq!(3, solve::<1, 1>(&parse_data(DATA)));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn part2() {
|
fn part2() {
|
||||||
assert_eq!(2, solve2(&parse_data(DATA)));
|
assert_eq!(1623178306, solve::<811589153, 10>(&parse_data(DATA)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue