diff --git a/2022/2/Cargo.lock b/2022/2/Cargo.lock new file mode 100644 index 0000000..0d24a72 --- /dev/null +++ b/2022/2/Cargo.lock @@ -0,0 +1,14 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "common" +version = "0.1.0" + +[[package]] +name = "day2" +version = "0.1.0" +dependencies = [ + "common", +] diff --git a/2022/2/Cargo.toml b/2022/2/Cargo.toml new file mode 100644 index 0000000..9f7f179 --- /dev/null +++ b/2022/2/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "day2" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +common = { path = "../common" } \ No newline at end of file diff --git a/2022/2/input b/2022/2/input new file mode 100644 index 0000000..0d597b9 --- /dev/null +++ b/2022/2/input @@ -0,0 +1,2500 @@ +C Z +C Z +A X +A X +B Z +B Z +B Z +A Z +B X +A X +A X +A X +C Z +C Z +C X +A X +A X +A X +C Z +B Z +C Z +A Y +B Z +A X +C Y +A X +A X +C Y +C Z +A Y +B Z +A X +C Y +B Z +B Z +B Z +A X +C X +C X +B Z +A X +C Z +A X +B Z +A Y +C X +A X +C Z +C Z +B Z +C Y +C X +C X +C X +C X +A Y +C Y +C Z +C Y +A X +C Y +A X +B Z +A Y +C X +A X +B Y +A X +C X +C X +C Z +A X +C X +A X +C X +B Z +A Z +B Y +B Z +B Z +A X +C Y +B X +A X +A X +B Z +A X +C X +C Z +C Z +A X +C Z +C Z +C Z +C X +C Z +A X +B Z +B Y +C Z +B Z +B Z +A X +B Z +C Y +C Z +A X +A Y +C Z +A X +B Y +C Y +C Z +A X +C Y +C X +A X +C X +A X +C Z +A X +C Y +A Y +C Z +C X +C Y +C Y +A Y +A Y +C Y +C Y +A Y +A X +C Z +C Z +C X +C X +C Z +A Y +C Z +C Z +A Y +A Y +B Z +A X +B Z +C Y +B Z +C Z +C Y +C Y +B Y +C X +A X +A X +A X +A Y +A X +C Z +C Z +C Z +A X +B Z +A X +B Z +C Y +C Z +A Y +C Y +A X +A X +C Z +B X +C Z +C Z +B Z +B Z +B Z +C Z +C X +C Z +A X +B Z +C Z +C X +A X +A Y +B Y +A X +B Z +A X +C Z +C Z +C X +B Z +C Z +C Z +C X +A X +A X +B Y +C Y +C Z +B Y +A X +B Z +A X +B X +B Z +C X +C X +C Y +C X +B Y +B Z +C X +A Y +C X +C Y +A X +C Z +C Z +C X +B Z +A Y +B Z +A Y +B X +A X +C Z +B Z +C X +C X +C X +A X +C X +B Z +C Z +B Y +B Z +A X +A X +C Z +B Z +A X +A Z +C Y +B Z +C X +C Z +A Y +C X +A X +A X +A Y +B Z +A X +B Z +A Y +B X +C X +C Y +A X +C Z +B X +C Z +C X +C X +C Z +A X +B Z +C Z +C X +C Z +B Y +A X +C X +C Y +A X +C Z +A X +B Z +C X +C X +B Z +C Z +C Z +C Y +A X +C Z +C X +A X +C Y +C Z +C Z +C Y +B Y +B Z +A X +B Y +C X +A X +A X +C Y +C Z +B Z +C X +C X +B Z +C Z +A X +A Y +A X +C Y +A Y +B Y +A X +A X +C X +C X +B Z +A Y +B Z +C Z +A X +A Y +A X +C X +A X +C Z +B Y +C Z +A X +B Z +C Z +C Z +A X +A X +B Z +B Z +B Z +A X +C X +A X +A X +C Y +C Y +C X +C X +A X +A Y +B Y +C Z +C Z +B Y +C X +C Z +A Y +C X +C Z +C X +B Z +C Y +C Z +C X +C Y +C Z +B Z +C Z +B Z +A X +B Y +B Y +C Z +B Z +C X +C Z +C Z +C Z +B Y +B Z +C Z +B Y +A X +A X +C X +A X +C X +A X +B Z +A X +A X +A X +C Z +A Y +A X +C Z +C X +A X +C X +A X +B Z +C Z +C Z +C Z +A X +A X +C Z +A X +B Z +C X +C Z +C Y +B Z +A X +B Z +A X +A Z +B Y +B Z +B Z +B Z +A Y +C Z +A X +B Y +C X +B X +B Z +C X +B Y +C Z +A X +C X +B Z +A X +B Z +A X +A X +B Y +C Y +C X +C X +C Z +A X +C Z +A X +B Y +C X +C Y +B Y +B Y +A Y +C X +A Y +C Z +C Y +A X +C Z +C Z +B Z +A X +A X +A X +A X +B Z +C Z +C X +C X +C Z +A X +B Z +B Y +C Y +A Y +C X +B Z +A Y +B Z +C Z +B Z +C X +A X +B Z +A X +A Y +C Y +B Z +B Z +C X +C Z +C Z +C Z +A X +B Z +A Y +A X +C Y +A Y +B Z +A Y +C Z +A Y +A Y +C X +A X +B Z +A Y +B Z +C X +A X +B Y +B Z +C Z +C Z +B Z +A X +A X +B Y +C Z +C Y +B Z +C Z +A Y +A X +C X +C Z +A X +A X +A Z +C X +C X +B X +B Z +A Y +C X +A Y +C X +C Z +A Y +B Z +A X +B X +A Y +C X +C Y +A Y +C X +B Y +C Y +A X +B Z +A X +C Z +A X +A X +C Z +C Z +B X +C X +A Y +B Z +C Z +A X +A X +C Z +C Y +A X +C X +C Z +C Y +C X +C Y +C X +C Z +C Z +B Z +A X +A Y +B Z +A X +B Z +C X +B Y +A X +A X +A X +A X +B Z +C Z +B Z +B Y +C Z +C X +C Z +C X +B Z +C Z +A X +C Z +C Z +A Y +C X +A X +B Z +A X +B Z +B Y +A X +A X +A X +A Y +C Z +A X +B Y +A Y +B Y +C Y +A X +A X +C Y +A X +C Z +B Z +C X +C Z +A X +B Z +C Z +B Z +B Z +B Z +C X +C Z +A X +A Y +C X +C Z +B Z +B Y +C Z +B Y +B Z +C Z +A Y +B Z +C X +C Y +A X +B Y +A X +C Z +C X +C Z +A X +C X +B Z +B X +C Z +B Z +A Y +A X +A Y +C Z +C Y +A X +B X +A Z +C Y +C X +C Y +C X +C Y +B Z +C X +B Y +C Z +C Y +B Z +A Y +B Y +C Z +C X +B Z +A Y +C Z +C Z +C Z +C Y +C X +C X +B Y +C Z +A Y +C Z +C X +B Y +C X +B Z +B Z +B Z +B Z +C Y +C Z +C X +B X +C Z +C Z +C Z +C X +B Y +B Z +C X +A X +C Y +B X +C X +C X +C Z +A X +A X +B Z +B Z +A X +C Z +A X +A Y +C X +B X +C Y +C Y +A X +A X +C Z +C Z +B Y +B Y +B Z +C X +A X +A Z +C Z +B Y +C Y +C X +C Y +B Z +C X +A X +A X +C Z +C Y +B X +C Z +B Z +A X +C X +A Y +C Y +C Z +B Z +C Z +A X +C Y +B Z +C Y +B X +C Z +C Z +A X +A X +C X +C Z +C X +C Y +C Z +A Y +C X +C Z +B Y +B Y +C Z +A X +C Y +A X +C X +C X +B Y +C Z +C Z +A X +A Y +C Z +B Z +C Y +A X +A X +C Z +C Z +A X +C Z +C Z +B Z +B Z +A X +A Y +A X +C Z +C X +A X +B X +C Z +C Z +B Y +A X +B Z +C X +C Z +C Z +C Z +C X +A Y +A X +A Y +A X +A Y +C Z +C Z +B Z +B Y +A X +B Z +C Z +C X +C Y +C Z +A X +C Y +B Y +B Z +C Z +B Y +C X +C Z +B Y +B Z +B Y +C X +C Z +C X +C Z +B Y +B Z +C X +A X +A Y +B Z +B Y +A X +A X +C Z +A X +A X +C X +A X +C Z +C X +A X +B X +A Y +C X +A X +C Y +A X +C Z +A X +A X +C Z +A X +A X +C Z +A X +B Y +B Z +A X +C X +A X +C X +B Z +C Y +A Y +C Z +B Z +A X +C X +A X +B Y +C X +B Y +B Z +A X +B Z +C X +B Z +A X +A X +C X +A X +C X +A Y +C Z +A X +B Y +B Z +C Z +C Z +A X +C Y +B Z +C X +B Z +B Z +C Z +A X +C X +C X +A Y +A X +C Z +B Z +A X +B X +A X +B Z +B Z +C Z +B Y +C Z +A X +C Z +C Z +C Z +C X +A X +A X +C Y +B Y +C Z +B Y +A X +B Z +A Y +C Y +B Y +C Z +C X +C X +A X +B Y +A X +A X +C Z +C X +C Y +A X +A X +A X +C X +B Z +B Y +A X +B Y +C X +C Z +B Z +A X +C X +C Z +B Y +A X +C Z +B Z +B Z +A X +B Y +A X +B Y +C Z +C Z +B Z +C Z +C Y +A X +B Z +C Z +A Y +C Z +B Z +B Z +C Z +B Y +C Z +C Z +B Z +A Y +C X +C Y +B Z +C X +C Z +A X +A X +C Y +A Z +C Z +C X +B Z +B Z +C Y +A X +A Y +C Z +A X +A X +B Z +A X +C X +C X +B X +B X +A Z +B Y +A X +A Y +C Z +A X +A X +B Z +B Z +C Y +A X +C Y +C Z +A Y +C Y +B X +C X +A X +B Z +A X +A X +A X +A X +A X +B X +A X +C Z +B Z +B Z +B X +A X +C Z +B Z +C Z +C Z +C Y +A X +C Y +C Y +C Z +A Y +C Z +A X +C X +C Z +A X +A Y +C Z +C X +A X +C X +B Y +C Z +B Z +A X +C Y +B Z +B Y +A X +C Z +A X +B Z +C Z +C Y +C Z +A X +A X +B Z +B Y +A X +C X +C Y +B X +C Z +A Y +C X +B Y +B Z +A Y +C Y +C Z +C Z +C X +A X +A X +C X +C X +C Z +C X +C X +B X +B Z +B Z +C X +C Z +C X +A X +A X +A X +C Z +C Y +B Z +C X +C X +A X +C X +C Y +A X +B Y +A X +C Z +C Z +B Z +A X +A X +A X +B Z +C X +A X +B Y +B Z +C X +B Y +C X +B Y +C Z +B X +A X +A X +B Z +A X +A X +A X +B Z +A X +C Z +C X +C Z +A X +C Y +C Y +C Z +C Z +C Z +A X +C Z +C X +C Z +C Z +A X +B Z +C X +C Y +B X +B Z +B Z +A X +C Y +B Y +C Z +B Z +C Z +C X +A Z +C Z +B X +C X +C Z +C Z +C X +C Z +C Z +A X +B Z +C Z +C X +A X +B Z +C Y +C Y +B Y +C X +A X +A X +C Z +B Z +C X +C X +C X +B Y +C Z +B X +C X +C Z +A X +A X +C Z +C Z +C X +C X +C Z +A X +C Z +C X +C Z +C Z +A X +C Z +A X +A X +A X +B Z +A X +B Z +C Z +C Z +A X +C Z +C Z +B Z +C Z +A Y +C X +A X +A X +C X +A X +C X +C X +A Y +B Y +C Z +B Z +C X +B Y +C Y +C X +C Z +A X +C Y +B Z +B Y +A X +B Y +B Y +A X +C X +C X +A X +A Y +C Y +B Z +A X +B Z +A Y +B Y +C Z +C Z +C Z +A Y +B Y +B Y +C Z +B Z +C Z +A X +C Y +A X +B Y +B Z +C X +C Y +A X +B Z +B Z +A X +B Z +C Y +A X +C X +C Z +C Z +A X +C Y +A X +C X +C X +B Z +B Y +A X +C Y +B Z +B Y +A X +C Z +A X +B Y +A X +A X +A X +C X +A X +C Z +B Z +C Z +A X +A X +B Y +C X +C Y +C Z +A X +C Z +B Z +A X +B Z +A X +B Y +B Z +C Z +C Z +C Y +C X +A X +C Z +A Y +A X +B Z +B Y +A X +C X +C Z +B Z +A X +C Z +C X +C Y +A X +A X +C Z +A X +A X +C X +C X +A X +C X +C Z +A X +A X +C Y +A Y +B Z +C X +C X +B Y +B Z +A X +B Z +C Z +C Z +A Y +C Y +C Z +A X +C Z +A X +C Y +C X +B X +B Z +A X +A X +B Z +A X +C X +C X +A Y +A X +A X +C Y +B Z +A X +B Y +C X +B Z +C Y +B Y +A X +C Z +B Y +B Z +A X +B Y +C X +C Z +A X +B Z +A X +C Y +C Z +A X +A X +C Y +C Y +C X +A Y +C Z +B Z +A X +A Y +C Z +C Z +C Z +C Z +B Y +A Y +A X +A X +C X +A X +B Y +C Z +B Z +A Y +C X +C X +A Y +A X +A X +C X +C Z +C X +A X +A Y +C X +C Z +C X +A X +A X +C Z +C X +A X +C X +C Z +A X +A X +C Z +B Y +A X +C Z +C Y +C Z +C Z +B X +B Z +B X +A X +C Z +B X +C Z +A X +C Z +A Y +A Z +B Z +C X +A X +A X +A X +A X +A X +C Z +A X +B X +A Y +A X +C X +A X +A Y +A Y +B Y +C X +A Y +A X +C Z +C Z +C Y +B Z +C X +C Z +A Y +C X +C Y +C X +A X +B Y +C Z +C Z +A X +C Z +B Z +B Z +C X +C X +A X +B Y +C X +C X +A X +C Z +B Y +C Y +C Z +A X +B Z +C Z +B Y +C X +A X +B Y +B Z +A X +C Y +B Z +C Z +C X +A X +C X +A X +B Y +C X +A X +C Y +B Z +B Z +B Z +C Y +A X +A X +A Y +C Z +B X +B Z +A X +A X +C X +A X +C X +A X +C X +A X +A X +A X +A Y +A Y +B Y +A X +B Y +A X +B Y +B Z +B Y +A Y +C Z +C Z +C Z +C Z +A X +C Z +C X +C Y +C Z +B Z +B Z +B Z +C Y +C Z +B Z +C X +A Y +A X +C X +C Y +A Y +B Y +C X +C X +B Y +C Z +A X +C X +C X +C X +C X +C X +C X +B Z +C Y +A X +A X +B Y +B Z +A X +C X +C Z +A X +B X +B Z +C Y +B Z +C Z +C Y +A X +C Z +B Y +C X +A X +A Y +A X +C X +A Y +A Y +C Z +B Z +C Z +C X +C Y +B Y +A X +C X +C Z +B Y +A X +B X +B Z +C Z +B Z +B Z +A X +A Y +A X +A X +B Z +C Z +A X +A Y +C Z +C Z +C Y +A X +B Z +C X +C X +A Y +A X +C X +C Y +C Z +C Y +C X +A X +B Z +C Y +B Z +C X +A X +A X +C X +C Z +C Y +C Y +A X +A Y +C Z +A Y +B Y +C Y +A Y +C Z +B Y +C X +A X +B Z +C Z +A X +A X +B Z +C X +B Z +C Z +C Z +A Y +A X +C X +A X +B Z +C X +A X +A X +B Y +A Z +B Z +C X +C Z +C X +C Z +C X +A X +C Z +B Y +C Y +C Z +A X +C Z +A X +A Z +A X +A X +C Z +A X +B Z +C X +B Z +A X +C X +A X +C X +C Z +B Z +A Y +C Y +C Z +C Z +C X +C Z +A X +A X +B Y +B Z +C Y +B Z +A Y +A X +A X +B Z +B X +A X +B Y +B Z +C X +A X +A X +C Z +B Y +C X +B Y +A Y +A Z +A X +B Y +C X +C Z +C Z +C Y +C Z +A X +B X +C X +A Y +A X +C Z +C Y +C X +B Z +A X +C X +C Z +A X +C Z +A X +C X +C X +A Y +C Z +A X +C X +C Z +C Y +A X +A Y +A Y +C Z +C X +A X +C Z +A Y +A Y +A X +B Z +C Z +B Y +C Z +B Y +C X +C Z +B Y +A X +A X +B Z +A X +C Z +A X +A X +B Y +A X +B Z +A Y +A X +A Y +C Z +B Z +A X +B X +B Y +B Z +A X +A Z +B Y +B Z +C X +B Z +A X +B Z +C Z +B Y +C X +A X +A Y +B Y +A Y +C X +C X +B Y +A Y +B Z +C Z +B Z +A Y +A X +B Z +B Z +A Y +C Z +C Z +B Z +C X +B Z +B Y +B Z +B Z +A X +A X +C X +C Z +B Z +A X +B Z +C Y +C Z +A Z +A X +A X +C Z +A X +C Z +C Z +C Z +B Z +A X +A Y +B X +A X +A X +A X +C Z +B X +B X +A X +C Z +A X +B X +A X +A X +B Z +A X +C Z +C Y +A X +B Z +A X +C Z +B Z +A X +A X +B Y +B Y +C Y +A X +B Z +C Y +A X +C Z +B Z +A X +C Z +B Z +C X +B X +B Z +C Z +A X +B Z +A X +A X +A X +A X +C Z +B Z +B Y +C Z +A X +C Z +A X +C X +C X +A X +B Y +C X +B Z +A Y +C Y +B Z +C Y +C X +A X +B Z +C X +B Y +A X +A Y +B Y +B Y +A X +C X +C Z +B Z +A Y +A X +B Y +C X +B Z +B X +C Y +B X +C X +B Y +C X +A X +C Z +B Z +B Y +B Y +A X +A X +A Z +B Z +B Z +C X +C Y +A Y +C Z +C X +A X +C Z +C X +B Z +A Y +B Z +C Z +B Z +B Z +C X +B Z +C X +C X +B Z +A X +B Y +B Z +A X +C X +A X +C Y +A X +C X +B X +C Z +C Y +C Z +B Z +C X +A X +A X +A Y +C Z +C Y +A Y +C Z +B Z +C Z +C Y +A X +A X +C X +C Z +C Z +A Z +C Z +A X +B Z +C X +C Z +A X +B Z +C X +A X +A Y +B Y +C X +A X +A X +C X +C Y +B Z +C X +A X +C X +B Z +B Y +A Y +C Z +A X +C Z +C Z +A X +C Y +B Z +A Y +B Y +B Y +A X +A X +C X +C X +B Y +C Z +C Z +C Z +C X +C Y +C Z +B Z +C Z +A Y +C Z +A X +B Z +B Y +B Z +A X +A X +A X +A X +C X +C Z +B Z +C X +B Z +C Z +A X +C X +C Z +B Y +A X +C X +A X +B Z +B Z +A X +A X +B Y +C Y +C Y +C X +A X +B Z +C Y +B Z +A Y +B Y +B Y +A X +B Z +A X +C X +C Z +A X +B Z +A Y +C Y +B Z +C Z +C Y +A X +C Y +A X +C X +B Z +C X +A X +C Z +A X +B Y +B Z +C X +C Y +B X +A X +B Z +A X +B Y +C X +C X +C Y +C Y +C X +B Y +C Z +C X +B Z +B Y +C X +A Y +C Z +C Z +C X +B X +B Y +A X +A X +C Z +C X +C Y +A X +C Y +A Y +C Z +C X +A X +C Z +C X +A X +B X +C X +C X +C X +B Y +B Z +C X +C Z +A Y +B Y +C X +C X +A X +B Z +C Z +A X +C Y +C Z +A Y +B Z +C X +C Z +A X +C Z +B Z +B Y +B Z +A X +C X +A Y +C X +C Z +B Y +C Y +C Z +C Z +A X +A X +A X +C Z +B Y +C Z +A X +A X +B Z +B Y +B Z +C Z +B Z +A Y +C Y +C Z +B Y +A X +A X +C Z +B Y +C Z +A X +C X +B Y +A Y +B Z +A X +A X +A X +B Y +A X +C Z +B Y +C Z +B Y +C Z +C X +C Y +C X +A X +A X +A X +C Z +C X +C X +B Y +A Y +B Z +B X +C Z +B Y +A X +C Y +B Z +C X +A X +A X +A X +A X +C X +B Y +A X +A X +B Y +A X +B Z +C Z +A X +A X +A X +A X +B Z +A X +C Z +C X +C Y +B Z +C Z +A X +C Y +C Z +A X +A X +C X +B Z +C X +B Z +C Z +A X +A X +A Y +B Y +C Z +B Y +A X +C X +C Z +C Z +C X +A X +A X +C Z +A X +A Y +A X +A X +C Z +C X +C X +C Z +C X +A X +C Z +C Z +B Z +A Y +A Y +B Y +A X +A X +C X +C X +A X +A X +C X +C X +B Y +C Z +A X +B Y +A X +A X +A X +C X +C Y +B Z +B Y +B Z +C Z +C Z +C X +C Z +A X +B Z +A Y +C Z +B Z +A X +C Y +B Z +C Z +C Y +A X +B Y +C Z +A X +A X +A X +C Z +C Z +C X +A Y +C X +B Z +B Y +A X +C X +C X +A Y +A Y +A X +B X +B Z +B Y +B Y +A X +C Y +A X +C Z +C X +C X +C Z +B Z +B Z +C Y +C X +B Z +C Z +A Y +C Y +A X +B Z +A X +C Y +B Z +B Y +C Z +A X +A X +C Z +B Z +B Z +C Z +C Y +C Z +C Z +C X +A Y +A Y +B Z +C Z +B Y +C X +C X +A Z +C Z +A X +A X +C X +A Y +C X +A X +A X +A X +C Y +A X +B Y +A X +B Y +A X +A X +A Y +C X +C Z +A X +C X +B Y +B Z +B Z +A Y +C Z +C X +C X +B Z +B Z +C X +B Y +A X +B Y +A X +A X +C Y +B X +C X +A Z +A Z +A X +C Z +C Y +C Z +C Y \ No newline at end of file diff --git a/2022/2/src/main.rs b/2022/2/src/main.rs new file mode 100644 index 0000000..3ba0639 --- /dev/null +++ b/2022/2/src/main.rs @@ -0,0 +1,45 @@ +use common; + +mod outcome; +mod shape; + +use outcome::Outcome; +use shape::Shape; + +fn main() { + let input_file = common::parse_args_input_file(&mut std::env::args()); + let contents = std::fs::read_to_string(input_file).expect("Couldn't read contents of input file"); + + let mut plays = std::vec::Vec::::new(); + for line in contents.lines() { + if line.eq("") { + continue; + } + let chars: std::vec::Vec = line.chars().collect(); + assert_eq!(chars.len(), 3); + plays.push(Play { + opponent: Shape::from_hint(chars[0]), + hinted_response: Shape::from_hint(chars[2]), + hinted_outcome: Outcome::from_hint(chars[2]), + }); + } + let mut score: u32 = 0; + for play in &plays { + score += play.hinted_response.score(&play.opponent); + } + println!("[PART 1] Score if played as suggested: {}", score); + + score = 0; + for play in &plays { + let shape = play.opponent.find_shape_to_achieve_outcome(&play.hinted_outcome); + score += shape.score(&play.opponent); + } + println!("[PART 2] Score if played with hinted outcomes: {}", score); +} + +#[derive(Debug)] +struct Play { + opponent: Shape, + hinted_response: Shape, + hinted_outcome: Outcome, +} diff --git a/2022/2/src/outcome.rs b/2022/2/src/outcome.rs new file mode 100644 index 0000000..033cd73 --- /dev/null +++ b/2022/2/src/outcome.rs @@ -0,0 +1,25 @@ +#[derive(Debug, PartialEq)] +pub enum Outcome { + Loss, + Draw, + Win, +} + +impl Outcome { + pub fn from_hint(c: char) -> Self { + return match c { + 'X' => Outcome::Loss, + 'Y' => Outcome::Draw, + 'Z' => Outcome::Win, + _ => unreachable!(), + }; + } + + pub fn value(&self) -> u32 { + return match self { + Self::Loss => 0, + Self::Draw => 3, + Self::Win => 6, + }; + } +} diff --git a/2022/2/src/shape.rs b/2022/2/src/shape.rs new file mode 100644 index 0000000..4f0dab4 --- /dev/null +++ b/2022/2/src/shape.rs @@ -0,0 +1,127 @@ +use crate::Outcome; + +#[derive(Clone, Debug, PartialEq)] +pub enum Shape { + Rock, + Paper, + Scissors, +} + +impl Shape { + pub fn find_shape_to_achieve_outcome(&self, outcome: &Outcome) -> Self { + return match outcome { + Outcome::Draw => self.clone(), + Outcome::Win => { + match self { + Shape::Rock => Shape::Paper, + Shape::Paper => Shape::Scissors, + Shape::Scissors => Shape::Rock, + } + }, + Outcome::Loss => { + match self { + Shape::Rock => Shape::Scissors, + Shape::Paper => Shape::Rock, + Shape::Scissors => Shape::Paper, + } + }, + }; + } + + pub fn from_hint(hint: char) -> Self { + return match hint { + 'A' | 'X' => Shape::Rock, + 'B' | 'Y' => Shape::Paper, + 'C' | 'Z' => Shape::Scissors, + _ => unreachable!(), + }; + } + + pub fn score(&self, other: &Shape) -> u32 { + let mut s = self.value(); + s += self.vs(other).value(); + return s; + } + + fn value(&self) -> u32 { + return match self { + Self::Rock => 1, + Self::Paper => 2, + Self::Scissors => 3, + }; + } + + fn vs(&self, other: &Shape) -> Outcome { + if *self == *other { + return Outcome::Draw; + } + return match self { + Shape::Rock => { + match other { + Shape::Scissors => Outcome::Win, + Shape::Paper => Outcome::Loss, + Shape::Rock => unreachable!(), + } + }, + Shape::Paper => { + match other { + Shape::Rock => Outcome::Win, + Shape::Scissors => Outcome::Loss, + Shape::Paper => unreachable!(), + } + }, + Shape::Scissors => { + match other { + Shape::Rock => Outcome::Loss, + Shape::Paper => Outcome::Win, + Shape::Scissors => unreachable!(), + } + }, + }; + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_rock_outcomes() { + let play = Shape::Rock; + assert_eq!(play.vs(Shape::Rock), Outcome::Draw); + assert_eq!(play.vs(Shape::Paper), Outcome::Loss); + assert_eq!(play.vs(Shape::Scissors), Outcome::Win); + } + + #[test] + fn test_paper_outcomes() { + let play = Shape::Paper; + assert_eq!(play.vs(Shape::Rock), Outcome::Win); + assert_eq!(play.vs(Shape::Paper), Outcome::Draw); + assert_eq!(play.vs(Shape::Scissors), Outcome::Loss); + } + + #[test] + fn test_scissor_outcomes() { + let play = Shape::Scissors; + assert_eq!(play.vs(Shape::Rock), Outcome::Loss); + assert_eq!(play.vs(Shape::Paper), Outcome::Win); + assert_eq!(play.vs(Shape::Scissors), Outcome::Draw); + } + + #[test] + fn test_score() { + assert_eq!(Shape::Paper.score(Shape::Rock), 8); + assert_eq!(Shape::Rock.score(Shape::Paper), 1); + assert_eq!(Shape::Scissors.score(Shape::Scissors), 6); + } + + #[test] + fn test_finding_shapes_for_outcome() { + assert_eq!(Shape::Rock.find_shape_to_achieve_outcome(&Outcome::Draw), Shape::Rock); + assert_eq!(Shape::Paper.find_shape_to_achieve_outcome(&Outcome::Loss), Shape::Rock); + assert_eq!(Shape::Paper.find_shape_to_achieve_outcome(&Outcome::Win), Shape::Scissors); + assert_eq!(Shape::Scissors.find_shape_to_achieve_outcome(&Outcome::Loss), Shape::Paper); + assert_eq!(Shape::Scissors.find_shape_to_achieve_outcome(&Outcome::Win), Shape::Rock); + } +} diff --git a/2022/common/Cargo.lock b/2022/common/Cargo.lock new file mode 100644 index 0000000..db83ec7 --- /dev/null +++ b/2022/common/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "common" +version = "0.1.0" diff --git a/2022/common/Cargo.toml b/2022/common/Cargo.toml new file mode 100644 index 0000000..b7723d9 --- /dev/null +++ b/2022/common/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "common" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/2022/common/src/lib.rs b/2022/common/src/lib.rs new file mode 100644 index 0000000..8a07b3f --- /dev/null +++ b/2022/common/src/lib.rs @@ -0,0 +1,16 @@ +pub fn parse_args_input_file(args: &mut std::env::Args) -> String { + let mut input_file = Some("input".to_string()); + while args.len() > 0 { + let arg = args.nth(0); + if arg.unwrap().eq("-f") { + let value = args.nth(0); + if value.is_some() { + input_file = value; + } + else { + println!("No value after argument: '-f'"); + } + } + } + return input_file.unwrap(); +}