diff --git a/README.md b/README.md index aaddfc4..05be71f 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,6 @@ -# Advent of Code 2019 +# Advent of Code 2022 -These are my solutions for [Advent of Code 2019](https://adventofcode.com/). Thanks to [Eric Wastl](http://was.tl) for the great puzzles and a great time I had solving them. - -These are my attempts for the year 2019. I wanted to learn Rust (started at version 1.48 finished at 1.49) and I would say I succeeded to get the hange of this strange language for just a bit. - -My goal was to finish at least one puzzle on a given day. And to try to use a few additional crates as possible. I did not quite succeed in the former, but at least I solved every single puzzle alone. I am quite pround of a few of them. I learned a lot. Not only about rust, but also on how to approach certain riddles. +These are my solutions for [Advent of Code 2022](https://adventofcode.com/). Thanks to [Eric Wastl](http://was.tl) for the great puzzles and a great time I had solving them. If you look at the code and see ways I could improve it, please do not hesitate to contact me. I am always grateful for everything that makes me a better programmer. diff --git a/data/day02/example01.txt b/data/day02/example01.txt new file mode 100644 index 0000000..25097e8 --- /dev/null +++ b/data/day02/example01.txt @@ -0,0 +1,3 @@ +A Y +B X +C Z \ No newline at end of file diff --git a/data/day02/input.txt b/data/day02/input.txt new file mode 100644 index 0000000..a8e5f26 --- /dev/null +++ b/data/day02/input.txt @@ -0,0 +1,2500 @@ +B Z +A X +B Z +B Z +C Z +B Z +A Z +B X +C Y +C Y +A X +A X +A Z +B Z +A X +A Z +B X +C Y +A Y +A Y +C Y +B Y +C X +C Y +B Z +A X +A Y +B Y +A X +A Z +B X +B Y +B Z +B Z +B Z +C Y +B X +A X +C Y +B Z +B Z +C X +A Z +B Z +B Z +C X +C X +B X +B X +A X +B X +C Z +C Y +C Y +C Y +C X +B Z +B Y +C X +A X +C X +C Y +C Y +C Y +B X +B Y +A Z +B Z +A X +B Z +C Y +B Y +B Z +B X +C Y +B Y +A Y +A X +B Z +B Z +B Z +B Z +C X +A X +B Y +C Y +C Y +B Z +B Z +A Z +B Y +A X +A Z +B Z +A X +B X +B X +B X +B X +A X +A Z +B X +B Z +B X +B Z +B X +C Y +C Y +C X +B X +A Z +C Y +B Z +C Z +B X +B Z +B Z +C Z +C Y +B X +B X +C Y +A Y +A X +C Z +B X +B X +C X +C X +C Y +C X +C Y +C Y +C Y +B Z +B Z +A X +C Y +C Y +A Y +C Y +A Z +B Z +A Y +C Y +C Y +A X +B X +B Z +C Y +C Y +B Z +B X +C Y +B Y +A Z +A Z +C Y +B X +C Y +B Z +C Y +B Z +B Z +B X +C Y +C X +B Z +C Z +A Y +C Y +C Y +A Y +C X +A Y +B Z +B Y +C X +A Y +C Y +C X +C Y +C Y +B Z +A Y +B Z +A Y +B Z +B Z +B Z +C Y +A Y +A X +B Z +C Y +C Y +C Y +B X +B Z +C Y +C Y +C Y +B X +C X +B X +A X +B Z +B X +C Z +A X +A X +A X +C Y +C Y +B Z +A Z +C X +B X +C Y +A Y +A Z +A Z +A X +A X +C Y +B Z +A Z +B Z +B X +C Z +B X +B X +B Y +A Z +B Z +C Y +B X +C X +C X +A X +B Z +B X +A Y +B Z +A X +B X +B Z +A X +B Z +C Y +B Y +C Y +A Z +B X +B X +B X +B Z +B Z +B Z +A X +B X +B Z +B Z +A X +B X +C Z +B X +A Z +A Z +C Z +A Y +C Y +B X +B Z +A X +B Z +B X +C Y +C Y +B X +C Y +C X +C Y +B Z +A Z +C Y +A Z +B X +B Z +B Z +A X +A Y +A X +B Z +B Z +B Y +A Z +C Y +B Z +B X +B Z +A Y +C X +B Z +C Y +A Y +A X +A Z +C Y +C Z +A Y +B X +A X +B X +C Y +C Z +B Y +B Z +B Z +C Y +B Z +C Z +B Y +A Z +A Z +B Z +B X +B X +A Z +C Y +B X +B Z +A Y +C Y +B Z +C Y +B X +C Y +C Y +C Y +A Y +C Y +C X +A X +C Y +C Y +A X +C Y +C Z +B X +B X +C Y +A X +A Y +C Y +A X +C X +A Y +A Z +A X +B Z +B Z +C X +C Y +B X +A X +A Z +B X +B Z +A X +B Z +B Z +B Z +B X +B Z +B Z +A Y +C X +A X +B X +B Z +C Y +C Y +C Y +C Y +B Z +C Y +B Y +C Y +A Z +C Y +B Z +B X +B Z +B Z +B X +C Y +A Z +B X +B Z +B Z +B X +C Y +B X +C X +C X +A X +C Y +A X +B Y +C Y +B Z +B X +C Y +B Y +B X +B X +B Y +B X +A Z +B X +B X +B X +B Z +B Y +A X +B X +C Y +C Y +B Y +B X +A Y +C Z +B X +C Y +B X +C Y +A Z +B Y +A Z +B Z +A Y +A X +C Y +B X +B X +A X +B Y +A Z +B X +B Z +A X +C Z +B Y +A X +A X +A X +A X +B Y +C Z +C Y +B Y +C Y +B X +B Z +A X +C Y +A Y +A X +C Y +C Y +B X +B Y +A X +C Y +A Y +A Z +A X +A Y +C Y +A X +C Z +C Y +B Z +B Y +C Y +C Z +A X +A X +C X +B X +C X +B X +A Z +B Z +C Y +C Y +A Z +C Y +A X +C X +B Z +C X +C Z +B X +B X +C Y +B X +A Y +B X +B Z +C X +C Y +B X +B X +B Z +B X +C Y +B Z +C Y +C Y +A Z +C Y +C Y +C Y +B X +B X +A X +C Y +B X +B X +C Y +B Z +A X +B X +C Y +B Z +B Y +B Z +A X +B Y +B Z +C X +C Y +B Z +B Z +B Z +B Z +B Z +C X +B Z +C Y +C X +B Y +B X +B X +C Y +B X +B X +C Y +C Y +A X +C Y +C Z +A Z +C Y +C Y +C Z +A X +C Y +A Y +B X +C X +C Y +C Z +C Y +C Y +B X +A X +B Z +A Y +B Z +B Z +B X +B Z +A Z +B Y +B Y +C Y +A Y +C Y +B X +A X +C Z +B Z +B X +A Z +C Y +C Y +C X +A Z +C Y +C Y +A Y +B Y +B Y +B Z +B Z +B X +B X +B Z +B X +B X +B Z +A Y +A Y +C Y +C Y +B X +A Y +A X +C Y +A Z +C X +B Y +B Y +B Y +A Z +C Y +B Z +B Z +A Y +B Z +B Z +C Z +C X +C X +B X +C Y +B X +B X +C Y +A X +A Z +C X +B X +A X +B Z +A X +B X +A Y +B X +B Z +B X +B X +C Z +A Z +B Z +C Z +B X +B X +A X +B Z +B Z +B Z +B Z +B Z +B Z +B X +C Y +B Z +B X +B X +C Y +C Y +B Z +B Z +B X +A Y +A X +A Z +C Z +A X +B Z +B X +B Z +B X +C Y +A X +A Y +C Y +C Y +B X +B X +B X +B Z +B X +B Z +A Y +A X +C Y +A Z +C Y +A X +C Y +B Z +A Y +C Y +C Y +C Y +B Z +B Z +A Z +A X +B X +C Y +A X +B Y +C Y +B X +B Z +B Z +A Z +B Z +C Y +B Z +A X +C X +B Z +B X +A X +C Y +C Y +A Z +C Y +C Z +A Z +A Z +B X +B X +B Z +C Y +B Z +B Z +C Y +B X +B Y +B Z +C Y +A X +C Y +A Y +C Y +C Y +C Y +B X +B X +B Z +B Y +C Y +B Y +A Z +A Z +B X +A Z +C X +C Y +B Z +B X +B Z +B X +B Z +B Z +B X +B Z +B Z +C X +C Y +A Z +C Y +B Y +A X +B Z +B Y +A Z +A X +B X +C Y +B Z +C Y +B X +C Y +B Z +B Y +B X +A Z +B Y +C Y +B X +C Y +A X +B Y +B X +C Y +C X +B X +B X +C Y +C Y +B Z +A X +B X +B Z +A X +B X +A X +B X +B X +B Y +C Y +A X +C X +C Y +C X +B Y +A Z +A X +C Y +B X +B X +B Z +C Y +B Z +B X +B Z +B Y +B Y +B Z +B X +C Y +B Y +A X +C Y +B Z +B Z +C Y +A Z +C Y +B Y +C Y +B Y +B X +B Z +B X +C Y +B X +C Y +B Z +C Y +B Z +B X +B X +B Z +A X +C Y +A X +B X +C Y +B X +C Z +C Y +B Z +A Y +A Y +C Y +B Z +A Z +B Z +C Y +A Z +B X +A X +B X +C Y +B Z +A X +B X +A Y +B X +B Z +A Z +C Y +A Z +C X +A Z +B X +C Y +B Z +B Z +A X +B Y +C Z +B Z +A Z +C Y +B X +C Y +B X +C Y +B Y +B Z +C Y +B Z +C Y +C Y +B Y +B Y +C Y +C Y +A Y +B Y +B X +C Y +C Y +C X +C Y +C Y +B Z +B X +B X +C Y +C Y +A X +C Y +C Y +B X +A Y +B X +A X +B Y +B X +B Z +B X +C Y +B Z +A Z +B Z +C X +B Z +B Y +B Z +B Z +C Y +B X +B X +C Y +B Z +B Z +B Z +B Z +A X +C Y +A Z +A X +C X +B Z +B Y +A Y +B X +C Y +B X +C Y +C Z +A Z +C Y +C Y +C Y +B Z +B Y +A X +C Y +B X +B X +B Z +B X +C Y +C Y +A X +B Z +B Z +C Y +B Y +B Y +B Z +A X +B Z +A X +B Y +C X +A Z +B Z +B Z +B X +C Y +B Y +B Y +B X +C Y +B X +B Z +C Y +B Z +A X +A Z +B Y +C Y +B X +B Z +C Y +B X +B X +B Z +B Y +C X +B X +A X +B X +B Z +B Z +B Z +A Z +A Z +B X +C X +B X +B Y +C Z +C Y +B Y +A X +A Z +B Z +B X +B Z +B Z +A Y +A Z +C Y +C Y +C Y +A Y +B Z +C X +C Y +C Y +A Z +B Z +C Y +B Z +C Y +A X +C Y +C Y +B X +A X +B X +A X +A Z +A X +B Y +B X +A X +B Z +B Z +B X +A Z +B X +A X +B Z +B Z +B Z +A X +B X +C Y +C Y +B Z +A X +A X +B Z +C X +B Z +C Y +C Y +C Y +A Y +B X +C Z +C Y +B X +A Y +A Z +C X +B Y +B Z +C Y +B X +A Z +C Z +C Y +C Y +B Z +B X +B Z +A Z +C Y +B X +A X +C Y +C Y +B X +B Y +B X +B X +C Y +B Y +C Y +B Z +B X +A Y +A X +B Z +A Z +B Z +B Z +A Y +C Y +A X +B X +B X +A X +C Y +B Z +B Y +B Z +B Z +B X +C Y +C Y +C Z +B Y +B Y +B Z +B X +B Z +C Y +B X +A Z +C Y +B Z +B X +C Y +C Y +C Y +B Z +C Y +B Z +C Y +B Z +B Z +B Z +C Y +C Y +B Z +C Z +A Y +A Z +A Z +C Y +C Y +A Z +B X +B X +A X +B Z +B Z +A X +A Z +C Y +B X +A Z +B X +C Y +A Z +C Y +B Z +B X +B X +B Z +B X +C Y +C Z +C Z +B X +A X +A Y +B Y +B X +B X +A Y +A X +B X +C Y +C Y +B Z +B Z +A X +C Y +B Z +B X +B Z +C Y +B X +C Y +B Z +B Y +B Z +B X +B X +C Y +B Z +B Z +B Z +A X +B Z +B Z +B Z +A Y +A X +C Y +B Z +B X +A X +B Z +C Y +B X +B Z +C Z +C Y +C Y +B Y +B Y +C Y +A Y +B Y +A Y +C Y +A Z +B X +B Y +C Y +A X +B Z +C Y +A X +B X +C Y +B X +A Y +C Z +C X +C Z +B Z +C X +A Z +C X +B Z +B Z +B Z +A X +C Y +B X +A Y +C Y +B Z +A Y +A Z +B X +A Z +C Y +C Y +C Y +B Z +B Y +A X +C Y +C X +A Y +B Z +A X +A Z +C Y +A Z +B Z +B Z +C X +B X +C Y +A X +C Y +A Z +B Z +B Z +B X +C Y +C Y +C X +C Z +C Y +C X +C X +C Y +B X +C X +C Z +C Y +B Y +C X +A X +C Y +A X +C Z +C X +C Y +B X +A Z +B Z +B X +B Z +B X +C Y +B Y +B Z +B X +B Z +C Y +C Z +B X +B Y +C Y +C Y +C Y +C X +A Y +B X +C X +B X +B Y +B Z +C X +B Z +B Z +A X +A X +B Z +B Z +A Y +A Z +B Y +A X +B X +B X +C Y +A X +A Y +B X +B Z +C Z +B Z +B X +C Y +C Y +B Z +A Z +B X +A Y +A Y +C Y +B Z +B X +A X +B Y +A Y +B Z +B Z +B Z +B Y +C Z +A X +C X +B Y +A Y +B Z +C Y +A X +B Z +C Y +A X +B X +B Z +B X +B Z +B Z +C Y +A Z +B X +C Y +B Z +A Y +B X +C X +B X +B X +B Z +B X +B Z +B X +B Z +B Z +C Y +B Z +C Y +B X +B Z +B X +B Z +C Y +B X +C Y +A Z +A Z +B Z +B X +B Z +B X +C Y +A Y +A X +B Z +B X +B X +A Z +A X +C Z +A X +A X +C Z +C Y +B X +B X +B Z +A Z +B X +C Y +B X +B Z +C X +C Y +C Y +A Z +B X +B X +C Z +C Y +B X +A X +C X +B Z +B Z +B X +C Y +B Z +A X +B X +B Z +A Z +B X +A Y +B Z +B X +C Y +B Y +C Y +A Z +A X +C Y +A Z +A X +C Y +C Y +C Y +C Y +C Y +B X +C X +B Y +A Z +B Z +C Y +A X +B Z +C X +C Y +B X +A Y +B X +B Z +C Y +B X +A Y +B Z +C Y +B Z +A X +B X +C Y +A Y +B Z +B X +A Z +C Y +B Y +A Y +A Z +B Y +C Y +B Z +B Z +B Z +C X +C X +B Y +B Z +A X +C Y +C Y +A Y +A X +A X +C Y +A Y +B Z +B Z +B Z +B X +A X +B X +C Y +A Z +B X +A Y +A X +A X +B Z +B Z +C Y +B X +B Z +C Y +B Z +A Z +C Y +B X +B Z +C X +C Y +C Y +C Z +B Z +B X +A X +B Z +C Z +C Y +C Y +C Y +B Z +A Y +C Y +B X +C Y +C Y +B X +B X +C Y +C Y +B Z +B X +A Z +C Z +B Z +A X +B Y +B Z +A X +C Y +C Y +B Z +A Y +C Y +B Y +B Z +C Y +A X +C Y +C X +C Y +C Y +A Y +B Z +C Y +C Y +B X +C Y +B Z +B Z +C Z +B Z +C Y +B Z +B Z +C Y +A X +C Y +A Z +B X +C X +B X +C X +A Z +C Y +A X +A X +B Z +C Y +B Z +B X +A Y +B Z +C X +B Z +A Y +C Y +B X +A Z +B Z +B Z +B Z +B Z +B Z +C Y +C Y +C Y +B X +A Y +A Z +B Z +C Y +B Y +C X +B X +B Z +B X +C Y +A X +C Z +C Y +A X +B X +C Y +B X +A X +C Z +C Y +C Y +C Z +C Y +C Y +B X +C Y +A Y +B X +B Z +B Z +C Y +A X +B Z +B Z +C Y +B X +B Z +B Z +C Y +C X +B Z +B Z +A Z +B X +B Z +B Z +B X +B X +B X +A X +A Z +B Z +B Z +B X +B X +C Y +C Y +B X +A Y +C Y +B Z +C Z +B Y +B Z +C X +A X +B X +C Y +C Y +A Y +C X +B Z +B Z +B Z +B Z +A Z +A Y +A X +A Y +B Y +A Y +B Z +C Y +C X +C X +B Z +C Y +A X +B Y +B X +B X +B X +A Y +B Z +B X +B Z +B Z +B Z +A Z +C Y +C Y +C Y +B Z +C X +B Z +A X +A Y +B Z +C Z +B Z +A X +B Z +A X +B Z +A Z +A X +B Z +B Z +B Z +B X +A Z +B X +C Y +B Y +B X +A X +B Z +A Z +B Z +B Z +B Y +C X +B X +B Z +A X +B X +B Z +B X +C Y +C Z +A Y +B Y +A X +B Z +B Y +A Z +C X +C Y +B Z +A X +C Y +A Y +C Y +C X +A Y +B X +B X +B Z +C Y +B Y +A X +B Z +B X +A X +A X +B X +A X +B Z +B X +B Y +C Y +B Z +C Y +C X +B Z +B Z +B Z +C Y +A X +B Z +A Y +A X +C Y +B Z +C Y +C X +C Y +C Y +A X +B Z +A X +A X +B X +B Y +C Y +C Y +A X +B Z +C Y +C X +B Z +B Z +B Z +B X +A Y +B X +C Y +A X +C Y +B Z +C Y +C Y +A X +B Y +B Z +B Y +A Y +B Z +B Y +B Z +A Y +C Y +A Y +A X +A Z +A X +B X +C Y +C Y +B X +A Z +B X +B Z +B X +B X +B Z +C Y +B Z +B Z +B X +A Z +A Y +C Y +B Y +C Y +C Y +B Z +C Y +C Y +B Y +B Z +B X +C Y +B Z +B Z +A Y +A Y +B X +B X +C Y +B Z +B Z +B X +B X +C Y +A Z +B X +B X +A Z +B X +B Z +B X +B X +A X +C Y +C Y +C Y +B X +A Z +C Y +C Y +B Z +B X +B Z +B Z +B Z +B Y +A X +A Z +C Y +C Y +B X +B Y +C X +A Z +C X +C Y +C X +C Y +C Y +C X +A X +B Z +B X +B Z +C Y +A Y +B X +B Z +C X +B X +B Y +B Z +B Z +A Z +C X +B X +B X +B Y +B Z +C Y +C Y +C Y +A Z +B Z +A Z +B Z +B X +C Y +B X +B X +A Y +C Y +A X +B Z +C Y +B Z +B Z +B Z +B Y +C Y +A Z +B X +C Y +B Z +C X +B X +A X +B Z +B X +A Y +B Z +B Z +C X +B X +B X +B Z +B Z +B X +C Y +B Z +A Y +B X +C X +C Y +B Y +B Z +B X +C X +C Y +B X +B Z +B Z +B X +C Z +B Z +B X +C X +C X +B Z +B Z +C Y +B X +C Y +A Z +A Z +B Z +B X +A Z +B X +B Z +B Y +B Z +C Y +B Z +A Z +C X +B Z +B Z +C Y +A Z +C Y +C Y +C Y +A X +A Z +A Z +B Z +C X +A X +C Y +B X +B X +C Y +C X +A Z +B X +B Z +B X +B Y +C Y +A X +C Y +C Y +A X +C Y +B Z +B X +C Y +C Y +B X +C Y +C Y +C Y +A X +B Z +B X +B Z +B Y +A Z +B Z +C Y +B Z +A X +A Z +A Y +B Y +B Z +B Z +A X +B Y +A Z +B Z +B Z +A Y +C Y +B X +B Z +A X +B Z +B Z +A X +B Z +B Z +B X +A Z +B X +B Z +A Y +A Y +A X +C Y +B Z +A X +B Z +C Y +B Z +B X +C Y +C Y +C Y +B X +A Z +C Y +B Y +B Z +B Z +B Z +B X +C Y +C X +A X +B Z +A X +C Y +C Y +B X +B X +B Z +C Z +C Y +C Y +A Y +C Y +B Z +B X +B X +B Z +C Y +B Z +B X +B X +C Z +B X +C X +C Y +C Y +C X +C Y +C Y +B Z +B X +B X +C Y +C Y +C Y +B Y +A X +B Z +B Y +A Z +B Z +C X +B Y +B X +B Z +B X +A Z +A Z +C Y +C X +C Y +A Z +B Y +A Y +C Y +B Z +A Z +A Z +C Y +B Z +B X +B Z +C Z +C Y +C X +B Z +B X +A X +A Y +B Z +B X +A Y +B X +B X +C Y +B X +B Z +A Z +C Y +C Y +A Y +B Z +C Y +B Y +C Y +C Y +C Y +B Z +A Y +B Z +A X +B X +B Z +B Z +B Z +A X +C X +B X +C X +A Z +C Y +B X +B Z +B Y +C Y +C Y +B Y +B Y +C Y +C Y +A X +C Y +B Y +B X +B X +A Z +B X +C Y +B Z +A Z +C Y +C X +A Z +B Z +A Z +C Y +B Z +B X +C Y +B Z +B Z +B X +C Z +B X +B Z +B Y +B Y +B X +B Z +C Y +B Z +B Z +B X +B Z +B Z +B Z +C X +B X +C Y +B Z +C X +C Y +C X +C X +B Y +B Z +A X +C X +B Z +A Z +A X +B Z +B Z +B Z +C Y +B X +B X +C Y +B X +C Y +B Z +B Y +B X +B Y +A X +B Z +A X +C X +C X +B Z +C Y +A Y +B X +B X +C Y +C Y +C Y +C Y +B Z +B Z +C Y +B Z +B X +B X +B Z +B X +B X +B Z +B Y +C Z +C X +C Y +B X +B X +A X +B X +C Y +A Z +B Z +B X +C Y +B Z +B Z +B Z +B Z +B Z +B Z +A Y +C Y +C X +C Y +C Y +A X +B X +B Z +B Y +B Z +C Y +B Y +A Y +A Z +B Z +B Y +C Z +B Z +C Y +B Z +C Y +B Z +B Z +C Y +C Z +A X +C Y +C Y +A Z +A X +C Y +B Z +C X +C Y +B Z +B Z +B Z +C Z +B Y +B Z +B Z +C Y +C Y +A Y +B Y +B X +B X +B Z +B Y +A Z +A X +A Y +C Y +B Z +C Z +A Y +B X +B Y +C Y +C X +C Y +B X +B X +C X +C Y +B Z +C Y +C Y +C Z +B Z +B X +A X +C X +C Y +B Z +B X +B Z +B Z +B Z +C Y +A X +C X +B Y +B X +A X +A Y +B X +C Y +B X +C Z +C X +B X +A Z +B Z +B X +B Z +A Y +C X +A Z +B Y +B Z +C X +C Z +B X +B Z +B X +B Z +B Z +C X +B X +B X +A Z +C Y +B X +C Y +B Z +B Z +C X +C Y +B Z +A X +B Z +C Y +B X +A X +C Y +A X +A X +C Y \ No newline at end of file diff --git a/data/day__/example01.txt b/data/day__/example01.txt new file mode 100644 index 0000000..e69de29 diff --git a/data/day__/input.txt b/data/day__/input.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/days/day02/mod.rs b/src/days/day02/mod.rs new file mode 100644 index 0000000..909da92 --- /dev/null +++ b/src/days/day02/mod.rs @@ -0,0 +1,225 @@ +use std::cmp::Ordering; + +use super::template::{DayTrait, ResultType}; +use anyhow::Result; +use thiserror::Error; + +const DAY_NUMBER: usize = 2; + +pub struct Day; + +impl DayTrait for Day { + fn get_day_number(&self) -> usize { + DAY_NUMBER + } + + fn part1(&self, lines: &str) -> Result { + let sum = lines + .split("\n") + .map(RPS::parse_line) + .collect::>>()? + .into_iter() + .map(|(first, second)| second.asses_pair(&first)) + .sum(); + + Ok(ResultType::IntResult(sum)) + } + + fn part2(&self, lines: &str) -> Result { + let sum = lines + .split("\n") + .map(Strategy::parse_line) + .collect::>>()? + .into_iter() + .map(|(first, second)| second.fullfill(&first).asses_pair(&first)) + .sum(); + + Ok(ResultType::IntResult(sum)) + } +} + +#[derive(Debug, Error)] +enum RPSError { + #[error("No a valid RPS: {0}")] + ParseError(String), + + #[error("Not a logal RPS line: {0}")] + IllegalLine(String), +} + +#[derive(Debug, PartialEq, Eq, Copy, Clone)] +enum RPS { + Rock, + Paper, + Scissors, +} + +impl RPS { + pub fn parse_line(line: &str) -> Result<(Self, Self)> { + let mut parts = line.split(" "); + let (Some(first), Some(second)) = (parts.next(), parts.next()) else { + Err(RPSError::IllegalLine(line.to_owned()))? + }; + + let first = RPS::try_from(first)?; + let second = RPS::try_from(second)?; + Ok((first, second)) + } + + pub fn value(&self) -> i64 { + match self { + RPS::Rock => 1, + RPS::Paper => 2, + RPS::Scissors => 3, + } + } + + pub fn asses_pair(&self, other: &Self) -> i64 { + let outcome = match self.partial_cmp(other) { + Some(Ordering::Less) => 0, + Some(Ordering::Equal) => 3, + Some(Ordering::Greater) => 6, + None => unreachable!(), + }; + outcome + self.value() + } +} + +impl PartialOrd for RPS { + fn partial_cmp(&self, other: &Self) -> Option { + match (self, other) { + (RPS::Rock, RPS::Paper) | (RPS::Paper, RPS::Scissors) | (RPS::Scissors, RPS::Rock) => { + Some(Ordering::Less) + } + (RPS::Rock, RPS::Scissors) | (RPS::Paper, RPS::Rock) | (RPS::Scissors, RPS::Paper) => { + Some(Ordering::Greater) + } + _ => Some(Ordering::Equal), + } + } +} + +impl TryFrom<&str> for RPS { + type Error = RPSError; + + fn try_from(value: &str) -> std::result::Result { + match value { + "A" | "X" => Ok(RPS::Rock), + "B" | "Y" => Ok(RPS::Paper), + "C" | "Z" => Ok(RPS::Scissors), + _ => Err(RPSError::ParseError(value.to_owned())), + } + } +} +#[derive(Debug, Eq, PartialEq, Clone, Copy)] +enum Strategy { + Loose, + Draw, + Win, +} + +impl Strategy { + pub fn parse_line(line: &str) -> Result<(RPS, Self)> { + let mut parts = line.split(" "); + let (Some(first), Some(second)) = (parts.next(), parts.next()) else { + Err(RPSError::IllegalLine(line.to_owned()))? + }; + + let first = RPS::try_from(first)?; + let second = Strategy::try_from(second)?; + Ok((first, second)) + } + + pub fn fullfill(&self, other: &RPS) -> RPS { + match (other, self) { + (_, Strategy::Draw) => *other, + (RPS::Rock, Strategy::Win) | (RPS::Scissors, Strategy::Loose) => RPS::Paper, + (RPS::Paper, Strategy::Win) | (RPS::Rock, Strategy::Loose) => RPS::Scissors, + (RPS::Scissors, Strategy::Win) | (RPS::Paper, Strategy::Loose) => RPS::Rock, + } + } +} + +impl TryFrom<&str> for Strategy { + type Error = RPSError; + + fn try_from(value: &str) -> std::result::Result { + match value { + "X" => Ok(Strategy::Loose), + "Y" => Ok(Strategy::Draw), + "Z" => Ok(Strategy::Win), + _ => Err(RPSError::ParseError(value.to_owned())), + } + } +} + +#[cfg(test)] +mod test { + use super::*; + use crate::common::file::read_data; + use anyhow::Result; + + #[test] + fn test_parse() -> Result<()> { + let input = "A Y"; + let expected = (RPS::Rock, RPS::Paper); + let result = RPS::parse_line(input)?; + assert_eq!(result, expected); + + Ok(()) + } + + #[test] + fn test_assess() -> Result<()> { + let first = RPS::Scissors; + let second = RPS::Paper; + let expected = 9; + let result = first.asses_pair(&second); + assert_eq!(result, expected); + + Ok(()) + } + + #[test] + fn test_part1() -> Result<()> { + let day = Day {}; + let lines = read_data(day.get_day_number(), "example01.txt")?; + let expected = ResultType::IntResult(15); + let result = day.part1(&lines)?; + assert_eq!(result, expected); + + Ok(()) + } + + #[test] + fn test_parse_strategy() -> Result<()> { + let input = "A Y"; + let expected = (RPS::Rock, Strategy::Draw); + let result = Strategy::parse_line(input)?; + assert_eq!(result, expected); + + Ok(()) + } + + #[test] + fn test_assess_stragety() -> Result<()> { + let first = RPS::Scissors; + let second = Strategy::Win; + let expected = RPS::Rock; + let result = second.fullfill(&first); + assert_eq!(result, expected); + + Ok(()) + } + + #[test] + fn test_part2() -> Result<()> { + let day = Day {}; + let lines = read_data(day.get_day_number(), "example01.txt")?; + let expected = ResultType::NoResult; + let result = day.part2(&lines)?; + assert_eq!(result, expected); + + Ok(()) + } +} diff --git a/src/days/day_provider.rs b/src/days/day_provider.rs deleted file mode 100644 index 38aff61..0000000 --- a/src/days/day_provider.rs +++ /dev/null @@ -1,21 +0,0 @@ -use super::{day01, DayTrait}; -use thiserror::Error; - -const MAX_DAY: usize = 1; - -pub fn get_day(day_num: usize) -> Result, ProviderError> { - match day_num { - 1 => Ok(Box::new(day01::Day)), - _ => Err(ProviderError::InvalidNumber(day_num)), - } -} - -pub fn get_all_days() -> impl Iterator> { - (1..=MAX_DAY).map(|day_num| get_day(day_num).expect("Must never happen")) -} - -#[derive(Debug, Error)] -pub enum ProviderError { - #[error("Not a valid day number: {0}")] - InvalidNumber(usize), -} diff --git a/src/days/mod.rs b/src/days/mod.rs index b07fc9d..9f4042e 100644 --- a/src/days/mod.rs +++ b/src/days/mod.rs @@ -1,6 +1,31 @@ mod day01; -pub mod day_provider; +mod day02; mod template; pub use template::DayTrait; pub use template::ResultType; + +pub mod day_provider { + use super::*; + use thiserror::Error; + + const MAX_DAY: usize = 2; + + pub fn get_day(day_num: usize) -> Result, ProviderError> { + match day_num { + 1 => Ok(Box::new(day01::Day)), + 2 => Ok(Box::new(day02::Day)), + _ => Err(ProviderError::InvalidNumber(day_num)), + } + } + + pub fn get_all_days() -> impl Iterator> { + (1..=MAX_DAY).map(|day_num| get_day(day_num).expect("Must never happen")) + } + + #[derive(Debug, Error)] + pub enum ProviderError { + #[error("Not a valid day number: {0}")] + InvalidNumber(usize), + } +} diff --git a/src/main.rs b/src/main.rs index 655c81b..fc7054f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -31,10 +31,10 @@ fn output(day: usize, part: usize, result: ResultType) -> () { fn run(day: Box, part1: bool, part2: bool) -> Result<()> { let lines = read_data(day.get_day_number(), "input.txt")?; if part1 { - output(1, 1, day.part1(&lines)?); + output(day.get_day_number(), 1, day.part1(&lines)?); } if part2 { - output(1, 2, day.part2(&lines)?); + output(day.get_day_number(), 2, day.part2(&lines)?); } Ok(())