Rust challenge 67/100 - aoc 2022 day5 Dec 5, 2022 Table of content What is this 67th Challenge Challenge Solution What is this The rules of the game are explained in my original. 67th Challenge Challenge Solve today’s AOC challange.🎅🦀 Solution Here’s my solution, today was really easy in my opinion :) use std::collections::HashMap; use itertools::Itertools; fn main() { let mut x = HashMap::new(); let x = include_str!("../input.txt").lines() .fold(&mut x, | acc, line| { match line.chars().nth(0) { Some('m') => move_crates(acc, line), _ => init_crates(acc, line), }; acc }); let mut res = String::new(); for k in 1..x.len()+1 { let v = x.get(&(k as u64)).unwrap(); res.push(*v.last().unwrap()); } println!("{}", res); } fn init_crates<'a>(stacks: &'a mut HashMap<u64,Vec<char>>, input:&str) -> &'a mut HashMap<u64,Vec<char>> { let input = format!("{} ", input); let x = input.chars() .tuples().map(|(_,b,_,_)| b) .enumerate() .filter(|(_,c)| *c != ' ' && c.is_alphabetic()) .fold(stacks, |acc, (i, b)| { acc.entry((i+1) as u64).or_insert(vec![]).insert(0, b); acc }); x } fn move_crates<'a>(stacks: &'a mut HashMap<u64,Vec<char>>, input:&str) -> &'a mut HashMap<u64,Vec<char>> { let x=input.split(" ") .filter(|x| x.parse::<u64>().is_ok()) .map(|x| x.parse::<u64>().unwrap()) .collect::<Vec<u64>>(); let (number, origin, destination) = (x[0], x[1], x[2]); let crates = stacks.get_mut(&origin).unwrap(); let mut crates = crates.split_off(crates.len()-number as usize); // comment out this line for second answer with crate mover 9001 crates.reverse(); stacks.get_mut(&destination).unwrap().append(& mut crates); stacks } #[cfg(test)] mod tests { use std::collections::HashMap; #[test] fn test_init_crates() { let tests = [ (" [F] [C] [H] [F] [W] [P]\n" ,HashMap::from([(4,vec!['F']), (5,vec!['C']), (6,vec!['H']), (7,vec!['F']), (8,vec!['W']), (9,vec!['P']) ]) ), ("[F] [C] [H] [F] [W] [P]\n" ,HashMap::from([(1,vec!['F']), (2,vec!['C']), (3,vec!['H']), (4,vec!['F']), (5,vec!['W']), (6,vec!['P']) ]) ), (" [C] [H] [F] [W] [P]\n" ,HashMap::from([ (2,vec!['C']), (3,vec!['H']), (4,vec!['F']), (5,vec!['W']), (6,vec!['P']) ]) ), (" 1 2 3 \n" ,HashMap::from([]) ), ]; for test in tests { assert_eq!(super::init_crates(&mut HashMap::new(),test.0), &test.1); } } #[test] fn test_move_crates() { let test = vec![ ( (HashMap::from([(1,vec!['Z','N','D']),(2,vec!['M','C']), (3,vec!['P'])],),"move 1 from 1 to 2"), (HashMap::from([(1,vec!['Z','N']),(2,vec!['M','C','D']),(3,vec!['P'])])) ), ( (HashMap::from([(1,vec![]),(2,vec!['M','C']), (3,vec![])],),"move 2 from 2 to 1"), (HashMap::from([(1,vec!['C','M']),(2,vec![]),(3,vec![])])) ) ]; for mut test in test { assert_eq!(super::move_crates(& mut test.0.0, test.0.1), &test.1); } } } Share on: