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::(); 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 = 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::(); println!("Part 2: {}", res2); } pub fn get_stacks(crates: &str) -> Vec> { let width = crates .lines() .rev() .next() .unwrap() .split_whitespace() .last() .unwrap() .parse::() .unwrap(); let mut stacks: Vec> = 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::() .unwrap(); let mut stacks: Vec> = 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::().unwrap(), from: split.nth(1).unwrap().parse::().unwrap(), to: split.nth(1).unwrap().parse::().unwrap(), } } }