aoc22/day5/src/main1.rs
2024-03-09 23:23:01 -08:00

60 lines
1.7 KiB
Rust

use std::env;
use std::fs;
use std::collections::VecDeque;
fn main() {
let (mut stacks, moves) = read_input(&env::args().nth(1).unwrap());
println!("stack = {:?}", stacks);
println!("moves = {:?}", moves);
for (n, from, to) in moves {
for _i in 1..=n {
let item = stacks[from].pop_front().unwrap();
stacks[to].push_front(item);
}
}
let res: String = stacks.iter()
.map(|stack| stack.front().unwrap())
.collect();
println!("res = {:?}", res);
}
fn read_input(file: &str) -> (Vec<VecDeque<char>>, Vec<(usize, usize, usize)>) {
let input = fs::read_to_string(file).unwrap();
let n_stacks = (input.lines().next().unwrap().len() + 1) / 4;
let mut stacks: Vec<VecDeque<char>> = vec![VecDeque::new(); n_stacks];
let mut moves: Vec<(usize, usize, usize)> = Vec::new();
let mut reading_crates = true;
for line in input.lines() {
if line.is_empty() || (reading_crates && has_digit(line)) {
reading_crates = false;
continue;
} else if reading_crates {
for (i, c) in line.char_indices() {
if i % 4 == 1 && c != ' '{
stacks[i/4].push_back(c);
}
}
} else {
let nums: Vec<usize> = line
.split(|c: char| !c.is_numeric())
.filter(|s| !s.is_empty())
.map(|num| num.parse::<usize>().unwrap())
.collect();
moves.push((nums[0], nums[1] - 1, nums[2] - 1));
}
}
(stacks, moves)
}
fn has_digit(line: &str) -> bool {
!line.chars().filter(|c| c.is_digit(10)).collect::<Vec<char>>().is_empty()
}