diff --git a/2022/rust/src/day5.rs b/2022/rust/src/day5.rs index eccfaec..1eeac3b 100644 --- a/2022/rust/src/day5.rs +++ b/2022/rust/src/day5.rs @@ -1,25 +1,95 @@ mod common; -type Input = String; -type Result = usize; - -fn processed_input(input: &str) -> Input { - input.to_owned() +#[derive(Debug)] +struct Move { + amount: i32, + from: usize, + to: usize, } -fn part1(input: &Input) -> Result { - 100 +#[derive(Debug)] +struct Crates { + stacks: Vec>, + moves: Vec, +} + +const NUM_STACKS: usize = 9; + +type Input = Crates; +type Result = String; + +fn processed_input(input: &str) -> Input { + let mut stacks: Vec> = vec![]; + let mut moves: Vec = vec![]; + + for _ in 0..NUM_STACKS { + stacks.push(vec![]); + } + + let mut parsing_stacks = true; + for l in input.lines() { + if l.trim() == "" || l.chars().skip(1).next().unwrap() == '1' { + parsing_stacks = false; + continue; + } else if parsing_stacks { + let mut x = 0; + for c in l.chars().skip(1).step_by(4) { + x += 1; + if c == ' ' { + continue; + } + stacks[x - 1].push(c); + } + } else { + let words: Vec<&str> = l.split_whitespace().collect(); + println!("words: {:?}", words); + moves.push(Move { + amount: words[1].parse().unwrap(), + from: words[3].parse::().unwrap() - 1, + to: words[5].parse::().unwrap() - 1, + }) + } + } + + for s in &mut stacks[..] { + s.reverse(); + } + + Crates { stacks, moves } +} + +fn perform_moves(crates: &mut Crates) { + let stacks = &mut crates.stacks; + for Move { amount, from, to } in &crates.moves { + println!("move: {} {} {}", amount, from, to); + for _ in 0..*amount { + let popped = stacks[*from].pop().unwrap(); + stacks[*to].push(popped); + } + println!("{:?}", stacks); + } +} + +fn part1(input: &mut Input) -> Result { + println!("{:?}", input); + perform_moves(input); + + let mut r = String::from(""); + for s in &input.stacks { + r.push(s.last().unwrap_or(&' ').clone()) + } + r.trim().to_string() } fn part2(input: &Input) -> Result { - 0 + "".to_string() } fn main() { let input_text = common::day_input(5); eprintln!("{}\n\nAbove is your input file.\n\n", input_text); - let input = processed_input(&input_text); - common::show_answers(&part1(&input), &part2(&input)) + let mut input = processed_input(&input_text); + common::show_answers(&part1(&mut input), &part2(&input)) // common::show_both_answers(&both_parts(&input)) } @@ -31,13 +101,22 @@ fn main() { mod tests { use super::*; - const TEST_INPUT: &str = ""; + const TEST_INPUT: &str = " [D] +[N] [C] +[Z] [M] [P] + 1 2 3 + +move 1 from 2 to 1 +move 3 from 1 to 3 +move 2 from 2 to 1 +move 1 from 1 to 2"; #[test] fn test() { - let input = processed_input(TEST_INPUT); - assert_eq!(part1(&input), 0); - assert_eq!(part2(&input), 0); + let mut input = processed_input(TEST_INPUT); + assert_eq!(part1(&mut input), "CMZ"); + let mut input = processed_input(TEST_INPUT); + assert_eq!(part2(&input), ""); // assert_eq!(both_parts(&input), (0, 0)); } }