day 5
This commit is contained in:
parent
111d183782
commit
a183a6dd1a
102
src/days/day5.rs
Normal file
102
src/days/day5.rs
Normal file
|
@ -0,0 +1,102 @@
|
|||
use aoc_runner_derive::{aoc, aoc_generator};
|
||||
use itertools::Itertools;
|
||||
|
||||
fn get_many_mut<T>(vec: &mut [T], i: [usize; 2]) -> [&mut T; 2] {
|
||||
if i[0] == i[1] {
|
||||
panic!("no")
|
||||
} else {
|
||||
let a = &mut vec[i[0]];
|
||||
let a = unsafe { &mut *(a as *mut T) };
|
||||
let b = &mut vec[i[1]];
|
||||
[a, b]
|
||||
}
|
||||
}
|
||||
|
||||
struct Instruction {
|
||||
count: u32,
|
||||
from: u32,
|
||||
to: u32,
|
||||
}
|
||||
|
||||
impl Instruction {
|
||||
fn execute_part1(&self, state: &mut [Vec<char>]) {
|
||||
let [from, to] = get_many_mut(state, [self.from as usize - 1, self.to as usize - 1]);
|
||||
|
||||
for _ in 0..self.count {
|
||||
to.push(from.pop().unwrap());
|
||||
}
|
||||
}
|
||||
|
||||
fn execute_part2(&self, state: &mut [Vec<char>]) {
|
||||
let [from, to] = get_many_mut(state, [self.from as usize - 1, self.to as usize - 1]);
|
||||
|
||||
let iter = from.drain((from.len() - self.count as usize)..);
|
||||
to.extend(iter);
|
||||
}
|
||||
}
|
||||
|
||||
struct PuzzleInput {
|
||||
initial_state: Vec<Vec<char>>,
|
||||
instructions: Vec<Instruction>,
|
||||
}
|
||||
|
||||
#[aoc_generator(day5)]
|
||||
fn generator(s: &str) -> PuzzleInput {
|
||||
let (s1, s2) = s.split_once("\n\n").unwrap();
|
||||
|
||||
let mut initial_state = Vec::new();
|
||||
|
||||
for l in s1.lines().rev().skip(1) {
|
||||
initial_state.resize((l.len() + 1) / 4, Vec::new());
|
||||
|
||||
for (i, mut craate) in l.chars().chunks(4).into_iter().enumerate() {
|
||||
let craate = craate.nth(1).unwrap();
|
||||
|
||||
if craate != ' ' {
|
||||
initial_state[i].push(craate);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let instructions = s2
|
||||
.lines()
|
||||
.map(|l| {
|
||||
let mut split = l.split(' ');
|
||||
assert_eq!(split.next(), Some("move"));
|
||||
let count = split.next().unwrap().parse().unwrap();
|
||||
assert_eq!(split.next(), Some("from"));
|
||||
let from = split.next().unwrap().parse().unwrap();
|
||||
assert_eq!(split.next(), Some("to"));
|
||||
let to = split.next().unwrap().parse().unwrap();
|
||||
|
||||
Instruction { count, from, to }
|
||||
})
|
||||
.collect();
|
||||
|
||||
PuzzleInput {
|
||||
initial_state,
|
||||
instructions,
|
||||
}
|
||||
}
|
||||
|
||||
#[aoc(day5, part1)]
|
||||
fn part1(input: &PuzzleInput) -> String {
|
||||
let mut state = input.initial_state.clone();
|
||||
|
||||
for inst in &input.instructions {
|
||||
inst.execute_part1(&mut state);
|
||||
}
|
||||
|
||||
state.iter().map(|v| v.last().unwrap()).collect::<String>()
|
||||
}
|
||||
|
||||
#[aoc(day5, part2)]
|
||||
fn part2(input: &PuzzleInput) -> String {
|
||||
let mut state = input.initial_state.clone();
|
||||
|
||||
for inst in &input.instructions {
|
||||
inst.execute_part2(&mut state);
|
||||
}
|
||||
|
||||
state.iter().map(|v| v.last().unwrap()).collect::<String>()
|
||||
}
|
|
@ -5,6 +5,7 @@ mod days {
|
|||
mod day2;
|
||||
mod day3;
|
||||
mod day4;
|
||||
mod day5;
|
||||
}
|
||||
|
||||
aoc_lib! { year = 2022 }
|
||||
|
|
Loading…
Reference in a new issue