diff options
Diffstat (limited to 'd02')
| -rw-r--r-- | d02/Cargo.toml | 6 | ||||
| -rw-r--r-- | d02/input.txt | 5 | ||||
| -rw-r--r-- | d02/src/main.rs | 86 | 
3 files changed, 97 insertions, 0 deletions
| diff --git a/d02/Cargo.toml b/d02/Cargo.toml new file mode 100644 index 0000000..47add02 --- /dev/null +++ b/d02/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "d02" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/d02/input.txt b/d02/input.txt new file mode 100644 index 0000000..ba5a73d --- /dev/null +++ b/d02/input.txt @@ -0,0 +1,5 @@ +RUDULRLLUULRURDDRRUDURULLLDRLRLUDDLUDUDDUDRRDUDULDUUULLRULLRLDDLDLDDRLRRRRUDLLDDUULDRLLUDDRRUURLULRRRDLLURRUUDURUDDURLUDDDLUDDUUDUURUDLRDRDRLRDRLDRUDRUUDLRDDRRURDDLRDDRRURDUDDLULLUDRURURRRLRRUDUULULULRRLDLUDUURRLLRUDLLDRDDLRRRULRUDLULDDLLLULDLRUDLLLLRDDLRDRLDRLLRDRRDLRDULULRLLLDRUDRRRUULRUULDRURLUDRURRDLLDLRDLDDDDRRLUDLRRLUUUURDRDDLRRURURRDUULLRLURLURUDDDRDURDUUDRLRLRRLDDLDLDLDDDUDDULURLDDLLRLRRDULUDDLULRLUDDLDLRULUUUDRLDRUDURLUDDRLLRUULDLRRRRDLLLLURULLRDRRUDLUULRRDLLRLRLUDLDDULLDLLRDLDLL +LLUUUUUUDUDRLRDRDLDURRRLLRRLRURLLUURRLLUDUDLULUURUUURDLUDLDDLULLRDLRUULDLRDUDURLLDDUDUDULLUDDUULLLUULRRRLULRURRDLRUDUDDURRRDRUURDURLLULLRULLDRUULLURLDRDUUDDDDDDRRLDRLRRRLULDDUURRLLLLDRURLURDRDRDURUDUURRDUDUDRLLUUDDRLUDDDRDLDLRLDRURRDLLRULDRLLURURRLUULLRLRRURDDRDRUUURUURUUUDLLRRLUDRLDLRLURLDLUDDUDDDLDUDRRLDLRURULRLLRDUULURRRULDLLLRLDDDUURRRRDULLRURRLULULDLRRUDUDDLRUURDLDUDDUDRRDLRRRDUDUUUDLLDDDDLURLURRRUUULLLULRRLLLLLLULDUUDLRUDRRDLRDUUDUDLLRLDLLRUURDUUURUUUDDLLUUDLULDURLULULUUUDRUDULLURRULRULLRDLDDU +RLUUURULLDLRLDUDRDURRDUURLLUDDDUULRRRLRLURDDRUULUDULDUUDDDDUDDDDRUDDLDUUDRUDLRRRLLRDDLLLRLLRUULRUULDDRURRLURRLRLULDDRRRDDURDDRDRDULRUDRUUDULRLLULDLRLLDRULRDDRRDDUDLRLLUDRDRRRLUDULRDLRDDURRUUDDRRUDURRUUUDDRRDUDURLUUDUDUURDDDLURLULLUULULURUDUUDRUDULLUUULURDLDUULLDDLLDULRLRLRDUUURUUDLRLDURUDRLDULLUDLDLLRDUURRDUDURLUUUDLLRRULRLULRLDLLURDURRULRLLRRDUDLLRDRRRRDLUUDRUUUDDLRLUDDDDDDRURRRUUURRDLLRURLDDLLDLRRLLLDRRULRRUDLDRDDRRLULURLLUURURURRRRUUUUURUDURLRLLLULULDLLDLRDRRULUDUDRDRRDRDRRDUDLLLRUDRUDDDULRULRRRDRLRUUUURUDURDUUULLULRUDDULDUUDLDURRD +ULRULDDLDLULLLRRRLRUDDDDDLLDDUDLRRDULUUDRDLRRURDRRLUULRURUDRRULDLLLUDRUUDULULUDDRUDDDRDURRRDRDUUURLRDULUDRDRLDRUDDLLLDRRULUDLUDLDLLRRUDUULULDLDLLUURDLDDLLUUDURLURLLLDRDLDRRLRULUURRDRULRUUURULRRUDDDDLLDLDDLLRRLRRRRDUUDUDLDRDRRURDLRURULDLRDLLLLRUDRLLRDLRLRDURDRUDURRRLRDRDLLRLUDDDDRLRLLDUURRURLUURUULUDLUURDRRUDDLUDUDDDURRDRUDRLRULDULUUUUUUDDUDRUDUUURUDRRDLUDLUUDUULUDURDLDDDLLURRURUUDUDDRRDRLLULULDRLRURRDDDRDUUURDDDRULUDRDDLDURRLDDDLRRRLDDRDURULDLUDLLLURLURRLRRULDLLDDUDRRULDRRRRLURRUULRRRUDLURDLLDLLDULUUDRRLDLLLDRLRUDLUULDLDRUDUDURDRUDRDDDLRLULLUR +LRLUUURRLRRRRRUURRLLULRLULLDLUDLUDRDDRLDLRLULLURDURLURDLLRLDUUDDURRRRLDLLRULLRLDLLUUDRLDDLLDRULDRLLRURDLRURRUDLULLRURDLURRURUDULLDRLLUUULUDRURRUUDUDULUUULRLDDULDRDLUDDUDDDLRURULLDLLLRLLUURDLRUDLLLLDLLRLRUUUDDRUUUUDLDLRDDURLDURUULLLUUDLLLLDULRRRLLDLDRRDRLUDRUDURLLUDLRLLUDUDRDDDRDLRDLRULUULDRLUDLRLDUURLRRLUDDDUUDDDUDRLDLDUDLURUULLDDDURUUULRLUDLDURUUDRDRURUDDUURDUUUDLLDLDLDURUURLLLLRURUURURULRULLRUDLRRUUUUUDRRLLRDDUURDRDRDDDUDRLURDRRRUDLLLDURDLUUDLLUDDULUUDLDUUULLDRDLRURUURRDURRDLURRRRLLUUULRDULDDLDUURRDLDLLULRRLLUDLDUDLUUL diff --git a/d02/src/main.rs b/d02/src/main.rs new file mode 100644 index 0000000..33c7ec0 --- /dev/null +++ b/d02/src/main.rs @@ -0,0 +1,86 @@ +use std::fs; + +fn solve_part1(lines: &Vec<&str>) -> String { +    let mut result = String::new(); + +    let mut num = 5; +    for line in lines { +        for c in line.chars() { +            num = match c { +                'U' => if num - 3 >  0 { num - 3 } else { num }, +                'D' => if num + 3 < 10 { num + 3 } else { num }, +                'L' => if num % 3 != 1 { num - 1 } else { num }, +                'R' => if num % 3 != 0 { num + 1 } else { num }, +                _   => num, // shouldn't happen +            } +        } +        result.push_str(&num.to_string()); +    } + +    result +} + +fn solve_part2(lines: &Vec<&str>) -> String { +    let mut result = String::new(); + +    // Part 2's keypad is a bit more exotic +    let keypad = [ +        [0,  0,  1,  0,  0], +        [0,  2,  3,  4,  0], +        [5,  6,  7,  8,  9], +        [0, 10, 11, 12,  0], +        [0,  0, 13,  0,  0], +    ]; +    let mut pos = (2, 0); // (row, col) index + +    for line in lines { +        for c in line.chars() { +            let mut new = pos; +            match c { +                'U' => new.0 = if pos.0 > 0 { pos.0 - 1 } else { pos.0 }, +                'D' => new.0 = if pos.0 < 4 { pos.0 + 1 } else { pos.0 }, +                'L' => new.1 = if pos.1 > 0 { pos.1 - 1 } else { pos.1 }, +                'R' => new.1 = if pos.1 < 4 { pos.1 + 1 } else { pos.1 }, +                _   => {}, // shouldn't happen +            }; +            // Ignore this `c' if it would take us off the diamond's edge +            if keypad[new.0][new.1] != 0 { +                pos = new; +            } +        } + +        // Print as hexadecimal to follow puzzle description +        result.push_str(&format!("{:X}", keypad[pos.0][pos.1])); +    } + +    result +} + +fn main() { +    // Read directions from input text file +    let input = fs::read_to_string("input.txt").unwrap(); +    let lines = input.lines().collect(); + +    // Part 1 gives 74921 for me +    println!("Part 1 solution: {}", solve_part1(&lines)); + +    // Part 2 gives A6B35 for me +    println!("Part 2 solution: {}", solve_part2(&lines)); +} + +#[cfg(test)] +mod tests { +    use super::*; + +    #[test] +    fn part1_example1() { +        let lines = vec!["ULL", "RRDDD", "LURDL", "UUUUD"]; +        assert_eq!(solve_part1(&lines), "1985"); +    } + +    #[test] +    fn part2_example1() { +        let lines = vec!["ULL", "RRDDD", "LURDL", "UUUUD"]; +        assert_eq!(solve_part2(&lines), "5DB3"); +    } +} | 
