main.rs (1955B)
1 use regex::Regex; 2 use std::collections::VecDeque; 3 4 fn main() { 5 let input_raw = std::fs::read_to_string("input.txt").unwrap(); 6 let stacks_raw = input_raw.trim().split("\n\n").nth(0).unwrap(); 7 let stack_count = (stacks_raw.split('\n').last().unwrap().len() + 1) / 4; 8 let re = Regex::new(r"[A-Z]").unwrap(); 9 let stacks = { 10 let mut tmp = (0..stack_count) 11 .map(|_| VecDeque::new()) 12 .collect::<Vec<VecDeque<char>>>(); 13 for l in stacks_raw.split('\n').rev().skip(1) { 14 for m in re.find_iter(l) { 15 let i = (m.start() - 1) / 4; 16 tmp[i].push_back(l.chars().nth(m.start()).unwrap()); 17 } 18 } 19 tmp 20 }; 21 let re = Regex::new(r"^move ([0-9]+) from ([0-9]+) to ([0-9]+)$").unwrap(); 22 let procedure = (*input_raw.trim().trim().split("\n\n").nth(1).unwrap()) 23 .split('\n') 24 .map(|x| { 25 re.captures(x) 26 .unwrap() 27 .iter() 28 .skip(1) 29 .map(|c| c.unwrap().as_str().parse::<usize>().unwrap()) 30 .collect() 31 }) 32 .collect::<Vec<Vec<usize>>>(); 33 // VWLCWGSDQ 34 println!("Part 1: {}", part_1(stacks.clone(), &procedure)); 35 // TCGLQSLPW 36 println!("Part 2: {}", part_2(stacks.clone(), &procedure)); 37 } 38 39 fn part_1(mut stacks: Vec<VecDeque<char>>, procedure: &Vec<Vec<usize>>) -> String { 40 for p in procedure { 41 for _ in 0..p[0] { 42 let c = stacks[p[1] - 1].pop_back().unwrap(); 43 stacks[p[2] - 1].push_back(c); 44 } 45 } 46 stacks.iter().map(|s| s.back().unwrap()).collect() 47 } 48 49 fn part_2(mut stacks: Vec<VecDeque<char>>, procedure: &Vec<Vec<usize>>) -> String { 50 for p in procedure { 51 let ii = stacks[p[1] - 1].len() - p[0]; 52 let mut cc = stacks[p[1] - 1].split_off(ii); 53 stacks[p[2] - 1].append(&mut cc); 54 } 55 stacks.iter().map(|s| s.back().unwrap()).collect() 56 }