109 lines
2.3 KiB
Rust
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(),
|
||
|
}
|
||
|
}
|
||
|
}
|