This repository has been archived on 2023-08-08. You can view files and clone it, but cannot push or open issues/pull-requests.
advent-of-code-2022/day5/src/lib.rs

109 lines
2.3 KiB
Rust

pub fn start() {
let input = include_str!("input.txt").replace("\r", "");
let (crates, moves) = input.split_once("\n\n").unwrap();
let mut stacks = get_stacks(crates);
moves.lines().map(|f| Move::from_line(f)).for_each(|m| {
(0..m.amount).for_each(|_| {
let from = stacks[m.from - 1].pop().unwrap();
stacks[m.to - 1].push(from);
})
});
let res1 = stacks
.iter_mut()
.map(|f| f.pop().unwrap_or(' '))
.collect::<String>();
println!("Part 1: {}", res1);
let mut stacks = get_stacks(crates);
moves.lines().map(|f| Move::from_line(f)).for_each(|m| {
let amount = stacks[m.from - 1].len() - m.amount..;
let crates: Vec<char> = stacks[m.from - 1].drain(amount).collect();
stacks[m.to - 1].extend(crates);
});
let res2 = stacks
.iter_mut()
.map(|s| s.pop().unwrap_or(' '))
.collect::<String>();
println!("Part 2: {}", res2);
}
pub fn get_stacks(crates: &str) -> Vec<Vec<char>> {
let width = crates
.lines()
.rev()
.next()
.unwrap()
.split_whitespace()
.last()
.unwrap()
.parse::<usize>()
.unwrap();
let mut stacks: Vec<Vec<char>> = Vec::with_capacity(width);
let stack_size = crates.lines().count() - 1;
for _ in 0..width {
stacks.push(Vec::with_capacity(stack_size))
}
crates.lines().rev().skip(1).for_each(|f| {
let mut crates = f.chars().skip(1).step_by(4);
stacks.iter_mut().for_each(|f| {
if let Some(c) = crates.next() {
if c.is_alphabetic() {
f.push(c)
}
}
})
});
let width = crates
.lines()
.rev()
.next()
.unwrap()
.split_whitespace()
.last()
.unwrap()
.parse::<usize>()
.unwrap();
let mut stacks: Vec<Vec<char>> = Vec::with_capacity(width);
let stack_size = crates.lines().count() - 1;
for _ in 0..width {
stacks.push(Vec::with_capacity(stack_size))
}
crates.lines().rev().skip(1).for_each(|f| {
let mut crates = f.chars().skip(1).step_by(4);
stacks.iter_mut().for_each(|f| {
if let Some(c) = crates.next() {
if c.is_alphabetic() {
f.push(c)
}
}
})
});
stacks
}
#[derive(Debug)]
struct Move {
amount: usize,
from: usize,
to: usize,
}
impl Move {
fn from_line(line: &str) -> Self {
let mut split = line.split(" ");
Self {
amount: split.nth(1).unwrap().parse::<usize>().unwrap(),
from: split.nth(1).unwrap().parse::<usize>().unwrap(),
to: split.nth(1).unwrap().parse::<usize>().unwrap(),
}
}
}