diff --git a/05/main.rs b/05/main.rs new file mode 100644 index 0000000..65677d1 --- /dev/null +++ b/05/main.rs @@ -0,0 +1,115 @@ +#![allow(dead_code)] +use std::collections::VecDeque; +use std::fs::File; +use std::io; +use std::io::BufRead; +use std::path::Path; +use std::time::Instant; + +fn main() { + let now = Instant::now(); + part_one(); + let part_one_duration = now.elapsed(); + part_two(); + let part_two_duration = now.elapsed(); + println!( + "p1: {}ms, p2: {}ms", + part_one_duration.as_millis(), + (part_two_duration - part_one_duration).as_millis() + ); +} + +fn read_lines

(filename: P) -> io::Result>> +where + P: AsRef, +{ + // note that this discards a final newline + let file = File::open(filename)?; + Ok(io::BufReader::new(file).lines()) +} + +fn part_one() { + if let Ok(lines) = read_lines("./inputs/input") { + let mut stacks = vec![VecDeque::::new(); 9]; + let mut lines_parsed = 0; + for line in lines { + lines_parsed += 1; + // build our stacks... + if lines_parsed < 9 { + if let Ok(stack) = line { + for (i, s) in stack.chars().enumerate() { + if (i % 4) == 1 && s != ' ' { + // we load in from the head, so the end of the vec is the "top" of the stack + stacks[(i / 4)].push_front(s) + } + } + continue; + } + } + if lines_parsed < 11 { + continue; // skip the break + } + // ok, so now we need to move the crates around + if let Ok(instruction) = line { + let steps = instruction.split(" ").collect::>(); + let (mut count, from, to) = ( + steps[1].parse::().unwrap(), + steps[3].parse::().unwrap(), + steps[5].parse::().unwrap(), + ); + while count > 0 { + let c = stacks[from - 1].pop_back().unwrap(); + stacks[to - 1].push_back(c); + count -= 1; + } + } + } + let mut result = "".to_string(); + for mut s in stacks { + result.push(s.pop_back().unwrap()); + } + println!("{}", result); + } +} + +fn part_two() { + if let Ok(lines) = read_lines("./inputs/input") { + let mut stacks = vec![VecDeque::::new(); 9]; + let mut lines_parsed = 0; + for line in lines { + lines_parsed += 1; + // build our stacks... + if lines_parsed < 9 { + if let Ok(stack) = line { + for (i, s) in stack.chars().enumerate() { + if (i % 4) == 1 && s != ' ' { + // we load in from the head, so the end of the vec is the "top" of the stack + stacks[(i / 4)].push_front(s) + } + } + continue; + } + } + if lines_parsed < 11 { + continue; // skip the break + } + // ok, so now we need to move the crates around + if let Ok(instruction) = line { + let steps = instruction.split(" ").collect::>(); + let (count, from, to) = ( + steps[1].parse::().unwrap(), + steps[3].parse::().unwrap(), + steps[5].parse::().unwrap(), + ); + let s = stacks[from - 1].len(); + let mut c = stacks[from - 1].split_off(s - count); + stacks[to - 1].append(&mut c); + } + } + let mut result = "".to_string(); + for mut s in stacks { + result.push(s.pop_back().unwrap()); + } + println!("{}", result); + } +}