2022 day 20 rust
This commit is contained in:
parent
7f830d635e
commit
fce1331719
5000
2022/rust/inputs/day20.txt
Normal file
5000
2022/rust/inputs/day20.txt
Normal file
File diff suppressed because it is too large
Load diff
|
@ -21,5 +21,6 @@ fn main() {
|
||||||
// solutions::day16::run();
|
// solutions::day16::run();
|
||||||
// solutions::day17::run();
|
// solutions::day17::run();
|
||||||
// solutions::day18::run();
|
// solutions::day18::run();
|
||||||
solutions::day19::run();
|
// solutions::day19::run();
|
||||||
|
solutions::day20::run();
|
||||||
}
|
}
|
||||||
|
|
64
2022/rust/src/solutions/day20.rs
Normal file
64
2022/rust/src/solutions/day20.rs
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
use std::collections::VecDeque;
|
||||||
|
use crate::utils;
|
||||||
|
|
||||||
|
|
||||||
|
pub fn run() -> () {
|
||||||
|
let data = parse_data(&utils::read_lines(utils::Source::Day(20)));
|
||||||
|
|
||||||
|
println!("Day 20");
|
||||||
|
println!("Part 1: {}", solve1(&data));
|
||||||
|
println!("Part 2: {}", solve2(&data));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn reorder(data: &[(usize, i32)]) -> Vec<i32> {
|
||||||
|
let mut array = data.iter().copied().collect::<VecDeque<_>>();
|
||||||
|
|
||||||
|
for item in data {
|
||||||
|
let index = array.iter().position(|item_ref| item == item_ref).unwrap();
|
||||||
|
array.remove(index);
|
||||||
|
let index = (index as i32 + item.1).rem_euclid(array.len() as i32) as usize;
|
||||||
|
array.insert(index, *item);
|
||||||
|
}
|
||||||
|
|
||||||
|
let zero_offset = array.iter().position(|item_ref| 0 == item_ref.1).unwrap();
|
||||||
|
array.rotate_left(zero_offset);
|
||||||
|
array.into_iter().map(|x| x.1).collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn solve1(data: &[(usize, i32)]) -> i32 {
|
||||||
|
let array = reorder(data);
|
||||||
|
let len = array.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, i32)> {
|
||||||
|
data.iter()
|
||||||
|
.enumerate()
|
||||||
|
.map(|(index, line)| (index, line.as_ref().parse().unwrap()))
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
static DATA: &[&str] = &["1", "2", "-3", "3", "-2", "0", "4"];
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part1() {
|
||||||
|
assert_eq!(3, solve1(&parse_data(DATA)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part2() {
|
||||||
|
assert_eq!(2, solve2(&parse_data(DATA)));
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,3 +17,4 @@ pub mod day16;
|
||||||
pub mod day17;
|
pub mod day17;
|
||||||
pub mod day18;
|
pub mod day18;
|
||||||
pub mod day19;
|
pub mod day19;
|
||||||
|
pub mod day20;
|
||||||
|
|
Loading…
Reference in a new issue