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>, 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> = 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 = line .split(|c: char| !c.is_numeric()) .filter(|s| !s.is_empty()) .map(|num| num.parse::().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::>().is_empty() }