day 5 done

2 files changed,665insertions(+),0deletions(-) A day5/input A day5/main.rs

A day5/input => day5/input +513 -0

@@ 0,0 1,513 @@[M] [B] [N] [T] [H] [V] [Q] [H] [Q] [N] [H] [W] [T] [Q] [V] [P] [F] [Q] [P] [C] [R] [C] [D] [T] [N] [N] [L] [S] [J] [D] [V] [W] [R] [M] [G] [R] [N] [D] [S] [F] [Q] [Q] [F] [F] [F] [Z] [S] [N] [M] [F] [D] [R] [C] [W] [T] [M] 1 2 3 4 5 6 7 8 9 move 1 from 8 to 7 move 1 from 2 to 7 move 6 from 9 to 8 move 1 from 9 to 1 move 1 from 9 to 1 move 3 from 3 to 6 move 3 from 3 to 9 move 1 from 9 to 2 move 5 from 7 to 9 move 9 from 1 to 6 move 3 from 4 to 9 move 2 from 9 to 2 move 1 from 4 to 2 move 1 from 3 to 9 move 8 from 9 to 4 move 14 from 6 to 7 move 1 from 3 to 2 move 5 from 4 to 2 move 5 from 5 to 7 move 4 from 2 to 1 move 2 from 4 to 9 move 1 from 4 to 3 move 3 from 5 to 7 move 1 from 8 to 6 move 2 from 8 to 7 move 2 from 1 to 2 move 1 from 9 to 7 move 2 from 1 to 3 move 5 from 6 to 5 move 4 from 5 to 7 move 3 from 8 to 4 move 20 from 7 to 1 move 11 from 7 to 5 move 1 from 6 to 9 move 3 from 9 to 2 move 12 from 1 to 9 move 2 from 8 to 3 move 4 from 2 to 8 move 8 from 2 to 1 move 4 from 8 to 9 move 1 from 2 to 5 move 12 from 9 to 7 move 4 from 4 to 9 move 4 from 9 to 5 move 13 from 5 to 4 move 4 from 4 to 7 move 1 from 7 to 9 move 2 from 9 to 5 move 9 from 1 to 2 move 1 from 8 to 3 move 5 from 4 to 2 move 1 from 3 to 6 move 7 from 2 to 8 move 6 from 1 to 6 move 6 from 8 to 7 move 6 from 2 to 1 move 3 from 9 to 3 move 7 from 3 to 7 move 4 from 4 to 9 move 1 from 8 to 9 move 1 from 3 to 9 move 1 from 2 to 4 move 1 from 9 to 6 move 5 from 1 to 9 move 1 from 4 to 9 move 2 from 9 to 1 move 8 from 6 to 7 move 4 from 9 to 7 move 2 from 5 to 2 move 2 from 1 to 9 move 14 from 7 to 4 move 22 from 7 to 2 move 2 from 7 to 4 move 3 from 7 to 5 move 9 from 4 to 7 move 6 from 2 to 4 move 8 from 4 to 3 move 14 from 2 to 9 move 2 from 3 to 9 move 3 from 2 to 9 move 4 from 4 to 2 move 1 from 4 to 5 move 1 from 1 to 4 move 5 from 7 to 8 move 1 from 1 to 3 move 4 from 5 to 2 move 6 from 3 to 9 move 1 from 3 to 4 move 4 from 8 to 9 move 2 from 4 to 6 move 4 from 5 to 3 move 1 from 7 to 6 move 1 from 8 to 5 move 3 from 3 to 1 move 33 from 9 to 5 move 5 from 2 to 1 move 1 from 3 to 5 move 1 from 7 to 6 move 18 from 5 to 1 move 1 from 2 to 8 move 6 from 5 to 4 move 1 from 8 to 7 move 2 from 4 to 1 move 4 from 1 to 2 move 19 from 1 to 2 move 4 from 6 to 8 move 4 from 1 to 8 move 14 from 2 to 9 move 5 from 2 to 4 move 1 from 8 to 2 move 8 from 2 to 5 move 5 from 8 to 4 move 4 from 9 to 7 move 1 from 8 to 1 move 16 from 5 to 4 move 15 from 4 to 5 move 1 from 9 to 5 move 5 from 7 to 6 move 2 from 7 to 6 move 1 from 1 to 9 move 7 from 6 to 7 move 1 from 8 to 5 move 1 from 1 to 9 move 12 from 5 to 7 move 7 from 5 to 9 move 12 from 7 to 2 move 1 from 7 to 4 move 7 from 4 to 7 move 2 from 9 to 4 move 5 from 4 to 9 move 8 from 2 to 3 move 4 from 2 to 4 move 9 from 4 to 8 move 6 from 3 to 5 move 8 from 7 to 3 move 1 from 4 to 3 move 7 from 8 to 9 move 4 from 5 to 4 move 6 from 3 to 1 move 4 from 3 to 4 move 1 from 3 to 6 move 6 from 4 to 9 move 1 from 6 to 5 move 17 from 9 to 4 move 3 from 7 to 3 move 1 from 7 to 9 move 2 from 5 to 3 move 2 from 1 to 3 move 2 from 8 to 9 move 1 from 5 to 1 move 14 from 4 to 5 move 2 from 3 to 2 move 1 from 7 to 6 move 10 from 9 to 4 move 12 from 9 to 4 move 9 from 4 to 5 move 1 from 2 to 9 move 13 from 5 to 9 move 2 from 5 to 1 move 1 from 2 to 9 move 3 from 4 to 2 move 12 from 4 to 7 move 8 from 5 to 7 move 1 from 1 to 9 move 1 from 6 to 4 move 1 from 5 to 4 move 1 from 4 to 8 move 5 from 3 to 4 move 10 from 9 to 6 move 3 from 6 to 2 move 7 from 6 to 5 move 6 from 5 to 4 move 1 from 8 to 5 move 1 from 1 to 4 move 2 from 7 to 2 move 5 from 4 to 9 move 2 from 5 to 8 move 1 from 1 to 3 move 2 from 1 to 7 move 6 from 7 to 9 move 9 from 9 to 8 move 1 from 1 to 3 move 4 from 2 to 7 move 11 from 7 to 3 move 11 from 8 to 6 move 7 from 3 to 1 move 4 from 7 to 2 move 3 from 2 to 9 move 8 from 1 to 5 move 2 from 7 to 5 move 2 from 2 to 9 move 2 from 3 to 9 move 11 from 4 to 7 move 7 from 9 to 5 move 6 from 6 to 5 move 2 from 2 to 9 move 1 from 2 to 3 move 6 from 9 to 4 move 3 from 9 to 1 move 4 from 3 to 5 move 6 from 7 to 1 move 2 from 6 to 3 move 2 from 9 to 2 move 3 from 3 to 2 move 3 from 6 to 8 move 2 from 7 to 5 move 20 from 5 to 6 move 8 from 5 to 1 move 1 from 5 to 9 move 2 from 8 to 4 move 1 from 8 to 7 move 16 from 1 to 8 move 8 from 8 to 9 move 4 from 2 to 4 move 1 from 1 to 5 move 1 from 5 to 4 move 3 from 8 to 4 move 14 from 4 to 6 move 5 from 8 to 7 move 6 from 7 to 8 move 29 from 6 to 2 move 3 from 9 to 8 move 21 from 2 to 3 move 1 from 8 to 3 move 6 from 9 to 4 move 8 from 3 to 5 move 7 from 8 to 4 move 7 from 3 to 9 move 3 from 7 to 2 move 12 from 4 to 8 move 2 from 3 to 1 move 2 from 9 to 1 move 1 from 6 to 7 move 1 from 7 to 6 move 1 from 6 to 3 move 3 from 1 to 8 move 2 from 4 to 1 move 4 from 6 to 1 move 5 from 2 to 7 move 1 from 1 to 2 move 5 from 1 to 2 move 2 from 8 to 1 move 1 from 4 to 5 move 9 from 8 to 4 move 3 from 7 to 9 move 7 from 5 to 7 move 2 from 5 to 9 move 4 from 9 to 2 move 3 from 3 to 2 move 5 from 2 to 7 move 2 from 8 to 2 move 2 from 7 to 3 move 1 from 8 to 6 move 2 from 1 to 2 move 1 from 6 to 7 move 1 from 8 to 1 move 12 from 7 to 1 move 5 from 2 to 7 move 7 from 4 to 2 move 2 from 4 to 1 move 5 from 3 to 8 move 7 from 1 to 9 move 4 from 7 to 1 move 7 from 1 to 5 move 12 from 9 to 2 move 27 from 2 to 4 move 3 from 8 to 9 move 6 from 2 to 5 move 6 from 1 to 8 move 1 from 7 to 6 move 9 from 5 to 2 move 3 from 9 to 2 move 13 from 4 to 5 move 10 from 2 to 7 move 1 from 9 to 8 move 11 from 5 to 7 move 1 from 8 to 7 move 1 from 2 to 6 move 13 from 4 to 3 move 23 from 7 to 4 move 1 from 6 to 9 move 1 from 2 to 4 move 7 from 3 to 5 move 1 from 9 to 8 move 19 from 4 to 1 move 2 from 4 to 1 move 1 from 7 to 6 move 1 from 4 to 5 move 1 from 5 to 7 move 11 from 5 to 1 move 2 from 5 to 4 move 2 from 6 to 9 move 3 from 8 to 2 move 2 from 8 to 1 move 3 from 2 to 1 move 1 from 9 to 5 move 6 from 1 to 3 move 1 from 9 to 7 move 2 from 7 to 5 move 2 from 8 to 6 move 1 from 3 to 2 move 2 from 8 to 5 move 1 from 2 to 1 move 3 from 4 to 1 move 3 from 5 to 1 move 2 from 5 to 1 move 2 from 6 to 9 move 1 from 9 to 6 move 1 from 4 to 5 move 1 from 9 to 8 move 1 from 8 to 6 move 8 from 1 to 6 move 7 from 1 to 8 move 9 from 1 to 6 move 1 from 5 to 3 move 3 from 8 to 4 move 11 from 3 to 4 move 1 from 3 to 6 move 10 from 6 to 8 move 13 from 1 to 6 move 3 from 4 to 5 move 7 from 8 to 6 move 3 from 8 to 5 move 6 from 5 to 3 move 22 from 6 to 9 move 4 from 3 to 6 move 4 from 9 to 5 move 1 from 1 to 5 move 2 from 3 to 4 move 2 from 1 to 5 move 1 from 9 to 2 move 5 from 8 to 3 move 2 from 9 to 2 move 11 from 6 to 9 move 3 from 2 to 7 move 1 from 6 to 7 move 12 from 9 to 8 move 4 from 7 to 1 move 12 from 4 to 8 move 2 from 4 to 7 move 1 from 1 to 8 move 1 from 5 to 1 move 19 from 8 to 4 move 4 from 5 to 1 move 1 from 7 to 4 move 1 from 7 to 1 move 3 from 3 to 4 move 2 from 8 to 4 move 1 from 5 to 7 move 1 from 7 to 9 move 8 from 1 to 8 move 1 from 1 to 4 move 1 from 3 to 9 move 1 from 3 to 5 move 1 from 5 to 2 move 7 from 8 to 7 move 16 from 4 to 7 move 1 from 7 to 4 move 3 from 8 to 2 move 14 from 7 to 4 move 1 from 5 to 8 move 5 from 7 to 5 move 16 from 4 to 5 move 3 from 5 to 4 move 3 from 2 to 1 move 1 from 7 to 9 move 11 from 4 to 2 move 3 from 8 to 6 move 2 from 1 to 8 move 1 from 4 to 9 move 18 from 5 to 1 move 1 from 8 to 7 move 3 from 7 to 9 move 18 from 9 to 3 move 3 from 6 to 9 move 7 from 1 to 6 move 1 from 8 to 4 move 1 from 4 to 9 move 3 from 6 to 4 move 5 from 9 to 2 move 2 from 4 to 7 move 7 from 2 to 8 move 1 from 7 to 3 move 2 from 6 to 8 move 1 from 9 to 5 move 1 from 6 to 8 move 1 from 4 to 8 move 1 from 5 to 3 move 1 from 7 to 5 move 8 from 8 to 7 move 10 from 2 to 6 move 1 from 9 to 3 move 6 from 6 to 2 move 5 from 6 to 2 move 7 from 2 to 7 move 12 from 1 to 6 move 2 from 2 to 1 move 1 from 2 to 5 move 4 from 7 to 6 move 12 from 3 to 1 move 2 from 7 to 2 move 9 from 3 to 8 move 1 from 2 to 6 move 1 from 5 to 4 move 9 from 6 to 5 move 1 from 7 to 6 move 1 from 4 to 9 move 9 from 6 to 7 move 7 from 8 to 3 move 6 from 3 to 1 move 4 from 8 to 3 move 5 from 3 to 1 move 1 from 9 to 8 move 2 from 8 to 9 move 5 from 5 to 7 move 14 from 7 to 8 move 1 from 9 to 4 move 2 from 2 to 1 move 3 from 5 to 3 move 2 from 3 to 1 move 1 from 4 to 6 move 6 from 8 to 6 move 6 from 8 to 3 move 3 from 6 to 1 move 2 from 8 to 9 move 19 from 1 to 6 move 3 from 9 to 3 move 6 from 3 to 4 move 6 from 6 to 2 move 4 from 3 to 9 move 1 from 7 to 9 move 2 from 5 to 7 move 5 from 9 to 6 move 6 from 7 to 2 move 11 from 2 to 5 move 2 from 7 to 4 move 4 from 4 to 3 move 2 from 4 to 8 move 12 from 1 to 2 move 1 from 8 to 2 move 8 from 5 to 7 move 2 from 4 to 9 move 2 from 7 to 1 move 4 from 2 to 3 move 1 from 8 to 6 move 1 from 1 to 5 move 2 from 9 to 1 move 2 from 7 to 3 move 2 from 5 to 2 move 1 from 5 to 7 move 2 from 7 to 8 move 1 from 5 to 7 move 5 from 3 to 4 move 3 from 1 to 7 move 1 from 2 to 4 move 15 from 6 to 1 move 4 from 4 to 1 move 4 from 2 to 3 move 8 from 3 to 2 move 5 from 2 to 4 move 1 from 8 to 6 move 1 from 8 to 9 move 1 from 3 to 1 move 3 from 7 to 3 move 5 from 7 to 6 move 4 from 2 to 9 move 6 from 2 to 6 move 4 from 9 to 6 move 12 from 1 to 5 move 6 from 4 to 1 move 1 from 3 to 6 move 4 from 5 to 8 move 7 from 5 to 3 move 3 from 8 to 2 move 1 from 2 to 3 move 1 from 9 to 5 move 1 from 4 to 5 move 1 from 8 to 5 move 8 from 6 to 9 move 10 from 1 to 4 move 3 from 6 to 1 move 9 from 3 to 6 move 1 from 3 to 8 move 1 from 2 to 4 move 6 from 9 to 1 move 1 from 1 to 4 move 10 from 1 to 6 move 1 from 8 to 6 move 13 from 6 to 7 move 1 from 2 to 1 move 1 from 9 to 6 move 9 from 7 to 5 move 1 from 9 to 4 move 3 from 7 to 1 move 3 from 5 to 6 move 10 from 4 to 7 move 5 from 6 to 5 move 3 from 4 to 5 move 13 from 6 to 9 move 7 from 5 to 3 move 6 from 3 to 2 move 5 from 6 to 4 move 4 from 2 to 8

A day5/main.rs => day5/main.rs +152 -0

@@ 0,0 1,152 @@use std::fs::File; use std::io::{self, BufRead}; use std::path::Path; fn main() { //: [Vec<char>; STACK_NUM_TEST] let mut stacks= vec![ vec!['Z', 'N'], vec!['M', 'C', 'D'], vec!['P']]; run_instruction("move 1 from 2 to 1", &mut stacks); assert_eq!(vec!['P'], stacks[2]); assert_eq!(vec!['M', 'C'], stacks[1]); assert_eq!(vec!['Z', 'N', 'D'], stacks[0]); run_instruction("move 3 from 1 to 3", &mut stacks); assert_eq!(vec!['P', 'D', 'N', 'Z'], stacks[2]); assert_eq!(vec!['M', 'C'], stacks[1]); assert_eq!(stacks[0].is_empty(), true); run_instruction("move 2 from 2 to 1", &mut stacks); assert_eq!(vec!['P', 'D', 'N', 'Z'], stacks[2]); assert_eq!(stacks[1].is_empty(), true); assert_eq!(vec![ 'C', 'M'], stacks[0]); run_instruction("move 1 from 1 to 2", &mut stacks); assert_eq!(vec!['P', 'D', 'N', 'Z'], stacks[2]); assert_eq!(vec!['M'], stacks[1]); assert_eq!(vec!['C'], stacks[0]); assert_eq!(get_top(stacks), "CMZ"); let mut stacks2 = vec![ vec!['Z', 'N'], vec!['M', 'C', 'D'], vec!['P']]; run_instruction2("move 1 from 2 to 1", &mut stacks2); assert_eq!(vec!['P'], stacks2[2]); assert_eq!(vec!['M', 'C'], stacks2[1]); assert_eq!(vec!['Z', 'N', 'D'], stacks2[0]); run_instruction2("move 3 from 1 to 3", &mut stacks2); assert_eq!(vec!['P', 'Z', 'N', 'D'], stacks2[2]); assert_eq!(vec!['M', 'C'], stacks2[1]); assert_eq!(stacks2[0].is_empty(), true); run_instruction2("move 2 from 2 to 1", &mut stacks2); assert_eq!(vec!['P', 'Z', 'N', 'D'], stacks2[2]); assert_eq!(stacks2[1].is_empty(), true); assert_eq!(vec!['M', 'C'], stacks2[0]); run_instruction2("move 1 from 1 to 2", &mut stacks2); assert_eq!(vec!['P', 'Z', 'N', 'D'], stacks2[2]); assert_eq!(vec!['C'], stacks2[1]); assert_eq!(vec!['M'], stacks2[0]); assert_eq!(get_top(stacks2), "MCD"); let mut stacks_real = vec![vec!['N', 'S', 'D', 'C', 'V', 'Q', 'T'], vec!['M', 'F', 'V'], vec!['F', 'Q', 'W', 'D', 'P', 'N', 'H', 'M'], vec!['D', 'Q', 'R', 'T', 'F'], vec!['R', 'F', 'M', 'N', 'Q', 'H', 'V', 'B'], vec!['C', 'F', 'G', 'N', 'P', 'W', 'Q'], vec!['W', 'F', 'R', 'L', 'C', 'T'], vec!['T', 'Z', 'N', 'S'], vec!['M', 'S', 'D', 'J', 'R', 'Q', 'H', 'N']]; let mut stacks_real2 = stacks_real.clone(); // File hosts must exist in current path before this produces output if let Ok(lines) = read_lines("./input") { // Consumes the iterator, returns an (Optional) String for line in lines { if let Ok(cmd) = line { run_instruction(&cmd, &mut stacks_real); } } } println!("{}", get_top(stacks_real)); // File hosts must exist in current path before this produces output if let Ok(lines) = read_lines("./input") { // Consumes the iterator, returns an (Optional) String for line in lines { if let Ok(cmd) = line { run_instruction2(&cmd, &mut stacks_real2); } } } println!("{}", get_top(stacks_real2)); } fn get_top(stacks: Vec<Vec<char>>) -> String{ let mut top_all = String::new(); for stack in stacks{ top_all.push(stack[stack.len()-1]); } return top_all; } fn run_instruction(inst: &str, stacks: &mut Vec<Vec<char>>) { let inst_split:Vec<&str> = inst.rsplit(' ').rev().collect(); if inst_split[0] != "move" { return; } let num_move = int_str_to_int(inst_split[1]); // instructions are 1 indexed let from = (int_str_to_int(inst_split[3])-1) as usize; let to = (int_str_to_int(inst_split[5])-1) as usize; for _ in 0..num_move { match stacks[from].pop() { Some(n) => stacks[to].push(n), _ => panic!("failed to pop with instruction: {}", inst), } } } fn run_instruction2(inst: &str, stacks: &mut Vec<Vec<char>>) { let inst_split:Vec<&str> = inst.rsplit(' ').rev().collect(); if inst_split[0] != "move" { return; } let num_move = (int_str_to_int(inst_split[1])) as usize; // instructions are 1 indexed let from = (int_str_to_int(inst_split[3])-1) as usize; let to = (int_str_to_int(inst_split[5])-1) as usize; let orig_len: usize = stacks[from].len(); let mut off = stacks[from].split_off(orig_len-num_move); stacks[to].append(&mut off); } fn int_str_to_int(num_str:&str) -> u32 { match num_str.parse::<u32>() { Ok(n) => return n, _ => panic!("failed to parse {}", num_str), } } // The output is wrapped in a Result to allow matching on errors // Returns an Iterator to the Reader of the lines of the file. fn read_lines<P>(filename: P) -> io::Result<io::Lines<io::BufReader<File>>> where P: AsRef<Path>, { let file = File::open(filename)?; Ok(io::BufReader::new(file).lines()) }