Unable to load image

Advent of Code Day 5, AKA Stacks 101 :marseyinabox:

I actually stayed up to get a semi-decent score for once (being a eurocel for this is suffering). How are you all faring with shifting boxes around?

![](/images/16702184438592093.webp)

26
Jump in the discussion.

No email address required.

Here's mine:

Spent too much time fighting borrow checker for part 2 to avoid allocating temporary buffer

use std::fs::File;
use std::io::{BufRead, BufReader};


use regex::Regex;


fn main() {
    let move_re = Regex::new(r"move (\d+) from (\d+) to (\d+)").expect("Can't compile regex");

    let file = File::open("input.txt").expect("Can't open input file");
    let reader = BufReader::new(file);


    let mut stack_lines = Vec::new();
    let mut move_lines = Vec::new();
    let mut is_stacks = true;


    for line in reader.lines() {
        let line = line.expect("Can't read a line from file");
        if line.is_empty() {
            is_stacks = false;
        } else if is_stacks {
            stack_lines.push(line);
        } else {
            move_lines.push(line);
        }
    }
    let stack_numbers = stack_lines.pop().expect("No stack number line");
    let stack_count = stack_numbers.split_ascii_whitespace().count();


    let mut stacks: Vec<Vec<u8>> = vec![vec![]; stack_count];


    for line in stack_lines.iter().rev() {
        let line_bytes = line.as_bytes();
        for i in 0..stack_count {
            if line_bytes[i * 4 + 1] != ' ' as u8 {
                stacks[i].push(line_bytes[i * 4 + 1])
            }
        }
    }
    for mv in move_lines.iter() {
        let numbers = move_re.captures(&mv).expect("Can't parse move lines");
        let crate_count: usize = numbers.get(1).unwrap().as_str().parse().expect("Not a number");
        let src: usize = numbers.get(2).unwrap().as_str().parse::<usize>().expect("Not a number") - 1usize;
        let dst: usize = numbers.get(3).unwrap().as_str().parse::<usize>().expect("Not a number") - 1usize;


        // for i in 0..crate_count {
        //     let popped = stacks[src].pop().expect("Trying to grab a crate from empty stack");
        //     stacks[dst].push(popped);
        // }

        
        let (source, destination) = if src < dst {
            let (a, b) = stacks.split_at_mut(src + 1);
            (a.last_mut().unwrap(), &mut b[dst - src - 1])
        } else if src > dst {
            let (a, b) = stacks.split_at_mut(dst + 1);
            (&mut b[src - dst - 1], a.last_mut().unwrap())
        } else {
            continue
        };
        let source_len = source.len();
        destination.extend_from_slice(&source[source_len - crate_count..source_len]);
        source.truncate(source_len - crate_count);
    }


    for stack in stacks.iter() {
        print!("{}", *stack.last().expect("No crate on top of the stack") as char);
    }
    println!("");
}
Jump in the discussion.

No email address required.

:#marseywoah:

Jump in the discussion.

No email address required.



Now playing: Bayou Boogie (DKC2).mp3

Link copied to clipboard
Action successful!
Error, please refresh the page and try again.