Day 05
This commit is contained in:
parent
7da0e7bfac
commit
88d091a75e
2 changed files with 78 additions and 0 deletions
77
src/day05.rs
Normal file
77
src/day05.rs
Normal file
|
@ -0,0 +1,77 @@
|
|||
use std::{default, collections::VecDeque};
|
||||
|
||||
use aoc_runner_derive::{aoc, aoc_generator};
|
||||
use itertools::Itertools;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Instruction {
|
||||
from: usize,
|
||||
to: usize,
|
||||
num: usize,
|
||||
}
|
||||
|
||||
#[aoc_generator(day05)]
|
||||
pub fn input_generator(input: &str) -> (Vec<Vec<char>>, Vec<Instruction>) {
|
||||
let mut instructions = vec![];
|
||||
let mut rows = vec![];
|
||||
for line in input.lines() {
|
||||
if line.trim().starts_with('[') {
|
||||
let mut row = vec![];
|
||||
for chunk in &line.chars().chunks(4) {
|
||||
let boxes = chunk.filter(|c| c.is_ascii_uppercase()).collect::<Vec<char>>();
|
||||
row.push(boxes.first().copied())
|
||||
}
|
||||
rows.push(row);
|
||||
}
|
||||
if line.starts_with("move") {
|
||||
let mut nums: Vec<usize> = vec![];
|
||||
for w in line.split_ascii_whitespace() {
|
||||
if w.chars().all(|c| c.is_ascii_digit()) {
|
||||
nums.push(w.parse().unwrap())
|
||||
}
|
||||
}
|
||||
instructions.push(Instruction {
|
||||
num: nums[0],
|
||||
from: nums[1]-1,
|
||||
to: nums[2]-1,
|
||||
})
|
||||
}
|
||||
}
|
||||
let num_stacks = rows.iter().map(|v| v.len()).max().unwrap_or_default();
|
||||
let mut stacks: Vec<Vec<char>> = vec![];
|
||||
stacks.resize(num_stacks, Default::default());
|
||||
for row in rows.iter().rev() {
|
||||
for (stack,item) in row.iter().enumerate() {
|
||||
stacks[stack].extend(item);
|
||||
}
|
||||
}
|
||||
(stacks,instructions)
|
||||
}
|
||||
|
||||
#[aoc(day05, part1)]
|
||||
pub fn solve_part1((stacks, instructions): &(Vec<Vec<char>>, Vec<Instruction>)) -> String {
|
||||
let mut stacks = stacks.clone();
|
||||
for inst in instructions {
|
||||
for _ in 0..inst.num {
|
||||
let item = stacks[inst.from].pop();
|
||||
stacks[inst.to].extend(item);
|
||||
}
|
||||
}
|
||||
stacks.iter().filter_map(|s| s.last()).collect()
|
||||
}
|
||||
|
||||
#[aoc(day05, part2)]
|
||||
pub fn solve_part2((stacks, instructions): &(Vec<Vec<char>>, Vec<Instruction>)) -> String {
|
||||
let mut stacks = stacks.clone();
|
||||
let mut buffer = Vec::with_capacity(1024);
|
||||
for inst in instructions {
|
||||
for _ in 0..inst.num {
|
||||
let item = stacks[inst.from].pop();
|
||||
buffer.extend(item)
|
||||
}
|
||||
while let Some(item) = buffer.pop() {
|
||||
stacks[inst.to].push(item);
|
||||
}
|
||||
}
|
||||
stacks.iter().filter_map(|s| s.last()).collect()
|
||||
}
|
|
@ -3,4 +3,5 @@ pub mod day01;
|
|||
pub mod day02;
|
||||
pub mod day03;
|
||||
pub mod day04;
|
||||
pub mod day05;
|
||||
aoc_lib! { year = 2022 }
|
||||
|
|
Loading…
Reference in a new issue