capitalpb

joined 10 months ago
[โ€“] [email protected] 5 points 10 months ago

Not too tricky today. Part 2 wasn't as big of a curveball as yesterday thankfully. I don't think it's the cleanest code I've ever written, but hey - the whole point of this is to get better at Rust, so I'll definitely be learning as I go, and coming back at the end to clean a lot of these up. I think for this one I'd like to look into a parsing crate like nom to clean up all the spliting and unwrapping in the two from() methods.

https://github.com/capitalpb/advent_of_code_2023/blob/main/src/solvers/day02.rs

#[derive(Debug)]
struct Hand {
    blue: usize,
    green: usize,
    red: usize,
}

impl Hand {
    fn from(input: &str) -> Hand {
        let mut hand = Hand {
            blue: 0,
            green: 0,
            red: 0,
        };

        for color in input.split(", ") {
            let color = color.split_once(' ').unwrap();
            match color.1 {
                "blue" => hand.blue = color.0.parse::().unwrap(),
                "green" => hand.green = color.0.parse::().unwrap(),
                "red" => hand.red = color.0.parse::().unwrap(),
                _ => unreachable!("malformed input"),
            }
        }

        hand
    }
}

#[derive(Debug)]
struct Game {
    id: usize,
    hands: Vec,
}

impl Game {
    fn from(input: &str) -> Game {
        let (id, hands) = input.split_once(": ").unwrap();
        let id = id.split_once(" ").unwrap().1.parse::().unwrap();
        let hands = hands.split("; ").map(Hand::from).collect();
        Game { id, hands }
    }
}

pub struct Day02;

impl Solver for Day02 {
    fn star_one(&self, input: &str) -> String {
        input
            .lines()
            .map(Game::from)
            .filter(|game| {
                game.hands
                    .iter()
                    .all(|hand| hand.blue <= 14 && hand.green <= 13 && hand.red <= 12)
            })
            .map(|game| game.id)
            .sum::()
            .to_string()
    }

    fn star_two(&self, input: &str) -> String {
        input
            .lines()
            .map(Game::from)
            .map(|game| {
                let max_blue = game.hands.iter().map(|hand| hand.blue).max().unwrap();
                let max_green = game.hands.iter().map(|hand| hand.green).max().unwrap();
                let max_red = game.hands.iter().map(|hand| hand.red).max().unwrap();

                max_blue * max_green * max_red
            })
            .sum::()
            .to_string()
    }
}
[โ€“] [email protected] 2 points 10 months ago

Wow, I sure did. I was tired last night. I'll edit my solution in and fix my error.

[โ€“] [email protected] 4 points 10 months ago* (last edited 10 months ago) (2 children)

Solved part one in about thirty seconds. But wow, either my brain is just tired at this hour or I'm lacking in skill, but part two is harder than any other year has been on the first day. Anyway, I managed to solve it, but I absolutely hate it, and will definitely be coming back to try to clean this one up.

https://github.com/capitalpb/advent_of_code_2023/blob/main/src/solvers/day01.rs

impl Solver for Day01 {
    fn star_one(&self, input: &str) -> String {
        let mut result = 0;

        for line in input.lines() {
            let line = line
                .chars()
                .filter(|ch| ch.is_ascii_digit())
                .collect::>();
            let first = line.first().unwrap();
            let last = line.last().unwrap();
            let number = format!("{first}{last}").parse::().unwrap();
            result += number;
        }

        result.to_string()
    }

    fn star_two(&self, input: &str) -> String {
        let mut result = 0;

        for line in input.lines() {
            let mut first = None;
            let mut last = None;

            while first == None {
                for index in 0..line.len() {
                    let line_slice = &line[index..];
                    if line_slice.starts_with("one") || line_slice.starts_with("1") {
                        first = Some(1);
                    } else if line_slice.starts_with("two") || line_slice.starts_with("2") {
                        first = Some(2);
                    } else if line_slice.starts_with("three") || line_slice.starts_with("3") {
                        first = Some(3);
                    } else if line_slice.starts_with("four") || line_slice.starts_with("4") {
                        first = Some(4);
                    } else if line_slice.starts_with("five") || line_slice.starts_with("5") {
                        first = Some(5);
                    } else if line_slice.starts_with("six") || line_slice.starts_with("6") {
                        first = Some(6);
                    } else if line_slice.starts_with("seven") || line_slice.starts_with("7") {
                        first = Some(7);
                    } else if line_slice.starts_with("eight") || line_slice.starts_with("8") {
                        first = Some(8);
                    } else if line_slice.starts_with("nine") || line_slice.starts_with("9") {
                        first = Some(9);
                    }

                    if first.is_some() {
                        break;
                    }
                }
            }

            while last == None {
                for index in (0..line.len()).rev() {
                    let line_slice = &line[index..];
                    if line_slice.starts_with("one") || line_slice.starts_with("1") {
                        last = Some(1);
                    } else if line_slice.starts_with("two") || line_slice.starts_with("2") {
                        last = Some(2);
                    } else if line_slice.starts_with("three") || line_slice.starts_with("3") {
                        last = Some(3);
                    } else if line_slice.starts_with("four") || line_slice.starts_with("4") {
                        last = Some(4);
                    } else if line_slice.starts_with("five") || line_slice.starts_with("5") {
                        last = Some(5);
                    } else if line_slice.starts_with("six") || line_slice.starts_with("6") {
                        last = Some(6);
                    } else if line_slice.starts_with("seven") || line_slice.starts_with("7") {
                        last = Some(7);
                    } else if line_slice.starts_with("eight") || line_slice.starts_with("8") {
                        last = Some(8);
                    } else if line_slice.starts_with("nine") || line_slice.starts_with("9") {
                        last = Some(9);
                    }

                    if last.is_some() {
                        break;
                    }
                }
            }

            result += format!("{}{}", first.unwrap(), last.unwrap())
                .parse::()
                .unwrap();
        }

        result.to_string()
    }
}
view more: โ€น prev next โ€บ