diff --git a/.build.yml b/.build.yml index f6ce525..bafa4b8 100644 --- a/.build.yml +++ b/.build.yml @@ -9,7 +9,8 @@ tasks: - run_aoc: | cd advent_of_code_2023 for identity in anthonycicc acicchetti-jf; do - for day in one; do + for day in day_*; do + day="${day#*_}" for part in one two; do path="inputs/${identity}/day_${day}/${part}.txt" if [[ -f "$path" ]]; then diff --git a/.gitignore b/.gitignore index fb9dd05..cc03214 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ target/ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html -Cargo.lock +# Cargo.lock # These are backup files generated by rustfmt **/*.rs.bk @@ -15,22 +15,3 @@ Cargo.lock # MSVC Windows builds of rustc generate these, which store debugging information *.pdb - -### https://raw.github.com/github/gitignore/4488915eec0b3a45b5c63ead28f286819c0917de/Rust.gitignore - -# Generated by Cargo -# will have compiled files and executables -debug/ -target/ - -# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries -# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html -Cargo.lock - -# These are backup files generated by rustfmt -**/*.rs.bk - -# MSVC Windows builds of rustc generate these, which store debugging information -*.pdb - - diff --git a/Cargo.lock b/Cargo.lock index 9b4d95c..b3ac231 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -37,27 +37,27 @@ checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] name = "anstyle-parse" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "a3a318f1f38d2418400f8209655bfd825785afd25aa30bb7ba6cc792e4596748" dependencies = [ "windows-sys", ] [[package]] name = "anstyle-wincon" -version = "3.0.1" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", "windows-sys", @@ -65,9 +65,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.10" +version = "4.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fffed7514f420abec6d183b1d3acfd9099c79c3a10a06ade4f8203f1411272" +checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2" dependencies = [ "clap_builder", "clap_derive", @@ -75,9 +75,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.9" +version = "4.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63361bae7eef3771745f02d8d892bec2fee5f6e34af316ba556e7f97a7069ff1" +checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb" dependencies = [ "anstream", "anstyle", @@ -110,6 +110,7 @@ dependencies = [ "clap", "common", "day_01", + "day_02", "thiserror", ] @@ -135,6 +136,15 @@ dependencies = [ "thiserror", ] +[[package]] +name = "day_02" +version = "0.1.0" +dependencies = [ + "common", + "thiserror", + "winnow", +] + [[package]] name = "heck" version = "0.4.1" @@ -245,18 +255,18 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.48.5" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -269,42 +279,51 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.5" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" [[package]] name = "windows_aarch64_msvc" -version = "0.48.5" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" [[package]] name = "windows_i686_gnu" -version = "0.48.5" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" [[package]] name = "windows_i686_msvc" -version = "0.48.5" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" [[package]] name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.5" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" [[package]] name = "windows_x86_64_msvc" -version = "0.48.5" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + +[[package]] +name = "winnow" +version = "0.5.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0383266b19108dfc6314a56047aa545a1b4d1be60e799b4dbdd407b56402704b" +dependencies = [ + "memchr", +] diff --git a/Cargo.toml b/Cargo.toml index b934f05..0ae534d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,8 @@ license = "MIT" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [workspace] -members = ['common', 'cli', 'day_01'] +members = ['common', 'cli', 'day_one', "day_two"] [workspace.dependencies] -thiserror = "1" \ No newline at end of file +thiserror = "1" +winnow = "0.5" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 3fc369f..56cf81d 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -8,7 +8,8 @@ edition = "2021" [dependencies] clap = { version = "4", features = ["derive"] } common = { path = "../common" } -day_01 = { path = "../day_01" } +day_01 = { path = "../day_one" } +day_02 = { path = "../day_two" } thiserror = { workspace = true } diff --git a/cli/src/main.rs b/cli/src/main.rs index 1514204..cc38788 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -35,6 +35,10 @@ fn main() -> Result<(), Box> { println!("{}", day_01::run_part(part, input_str).unwrap().deref()); Ok(()) } + (Day::Two, part) => { + println!("{}", day_02::run_part(part, input_str).unwrap().deref()); + Ok(()) + } #[allow(unreachable_patterns)] (_, _) => { diff --git a/common/src/lib.rs b/common/src/lib.rs index 723af66..6893af0 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -3,6 +3,7 @@ use clap::ValueEnum; #[derive(ValueEnum, Clone, Copy, Debug)] pub enum Day { One, + Two, } #[derive(ValueEnum, Copy, Clone, Debug)] diff --git a/day_01/Cargo.toml b/day_one/Cargo.toml similarity index 100% rename from day_01/Cargo.toml rename to day_one/Cargo.toml diff --git a/day_01/process.sd b/day_one/process.sd similarity index 100% rename from day_01/process.sd rename to day_one/process.sd diff --git a/day_01/src/lib.rs b/day_one/src/lib.rs similarity index 100% rename from day_01/src/lib.rs rename to day_one/src/lib.rs diff --git a/day_two/Cargo.toml b/day_two/Cargo.toml new file mode 100644 index 0000000..9451a68 --- /dev/null +++ b/day_two/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "day_02" +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"} +thiserror = { workspace = true } +winnow = { workspace = true } \ No newline at end of file diff --git a/day_two/src/lib.rs b/day_two/src/lib.rs new file mode 100644 index 0000000..f900ffa --- /dev/null +++ b/day_two/src/lib.rs @@ -0,0 +1,320 @@ +use std::fmt::Display; +use std::mem; +use std::str::FromStr; + +use thiserror::Error; +use winnow::ascii::digit1; +use winnow::combinator::{alt, preceded, separated, terminated}; +use winnow::error::InputError; +use winnow::prelude::*; +use winnow::PResult; + +use common::Part; + +use crate::Color::{Blue, Green, Red}; + +#[derive(Error, Debug)] +pub enum Day02Error { + #[error("something weird happened")] + RuntimeError, + + #[error("Couldn't parse game")] + GameParseError, +} + +#[derive(Debug, PartialEq, Copy, Clone)] +enum Color { + Green(usize), + Red(usize), + Blue(usize), +} + +#[derive(Debug, Default, PartialOrd, PartialEq, Copy, Clone)] +struct Reveal { + green: usize, + red: usize, + blue: usize, +} + +#[derive(Debug, Default, PartialOrd, PartialEq)] +struct Game { + id: usize, + reveals: Vec, +} + +impl Game { + fn fits_requirements(&self, req: &Requirements) -> bool { + let max_red = self + .reveals + .iter() + .max_by(|&x, &y| x.red.cmp(&y.red)) + .expect("No max red") + .red; + let max_green = self + .reveals + .iter() + .max_by(|&x, &y| x.green.cmp(&y.green)) + .expect("No max green") + .green; + let max_blue = self + .reveals + .iter() + .max_by(|&x, &y| x.blue.cmp(&y.blue)) + .expect("No max blue") + .blue; + + max_red <= req.red && max_blue <= req.blue && max_green <= req.green + } +} + +#[derive(Debug, Default)] +struct Requirements { + red: usize, + green: usize, + blue: usize, +} + +fn parser_blue<'s>(input: &mut &'s str) -> PResult> { + terminated(digit1, " blue") + .map(|s: &str| Color::Blue(s.parse().unwrap())) + .parse_next(input) +} + +fn parse_blue(input: &mut &str) -> Color { + parser_blue(input).unwrap() +} + +fn parser_red<'s>(input: &mut &'s str) -> PResult> { + terminated(digit1, " red") + .map(|s: &str| Color::Red(s.parse().unwrap())) + .parse_next(input) +} + +fn parse_red(input: &mut &str) -> Color { + parser_red(input).unwrap() +} + +fn parser_green<'s>(input: &mut &'s str) -> PResult> { + terminated(digit1, " green") + .map(|s: &str| Color::Green(s.parse().unwrap())) + .parse_next(input) +} + +fn parse_green(input: &mut &str) -> Color { + parser_green(input).unwrap() +} + +fn parse_colors<'s>(input: &mut &'s str) -> PResult, InputError<&'s str>> { + separated(0.., alt((parser_green, parser_blue, parser_red)), ", ").parse_next(input) +} + +fn colors_into_reveal(colors: Vec) -> Reveal { + let Green(green) = colors + .iter() + .find(|&a| mem::discriminant(a) == mem::discriminant(&Color::Green(0))) + .unwrap_or(&Color::Green(0)) + else { + panic!() + }; + + let Blue(blue) = colors + .iter() + .find(|&a| mem::discriminant(a) == mem::discriminant(&Color::Blue(0))) + .unwrap_or(&Color::Blue(0)) + else { + panic!() + }; + + let Red(red) = colors + .iter() + .find(|&a| mem::discriminant(a) == mem::discriminant(&Color::Red(0))) + .unwrap_or(&Color::Red(0)) + else { + panic!() + }; + + Reveal { + red: *red, + blue: *blue, + green: *green, + } +} +fn parse_reveal<'a>(inp: &mut &'a str) -> PResult> { + parse_colors.map(colors_into_reveal).parse_next(inp) +} + +// fn parse_reveals(inp: &mut &str) -> Vec { +// separated(0.., ) +// } + +fn parse_reveals<'a>(inp: &mut &'a str) -> PResult, InputError<&'a str>> { + separated(0.., parse_reveal, "; ").parse_next(inp).clone() + // .map(parse_reveal) + // .parse_next(&mut input)?) + // separated(0.., parse_colors, "; ").map(|s: &str| parse_reveal(s)).parse_next(&mut input) +} + +fn parser_game<'s>(input: &mut &'s str) -> Game { + let game_num = preceded("Game ", digit1::<&'s str, InputError<&'s str>>) + .parse_next(input) + .unwrap(); + let colors = preceded(": ", parse_reveals).parse_next(input).unwrap(); + dbg!(&game_num, &colors); + + Game { + id: game_num.parse().unwrap(), + reveals: colors.clone(), + } +} + +impl TryFrom<&str> for Game { + type Error = Day02Error; + + fn try_from(value: &str) -> Result { + value.parse() + } +} + +impl FromStr for Game { + type Err = Day02Error; + + fn from_str(s: &str) -> Result { + let mut s = s; + Ok(parser_game(&mut s)) + } +} + +pub fn run_part(part: Part, inp: String) -> Result, Day02Error> { + match part { + Part::One => Ok(Box::new(part_01(&inp))), + Part::Two => Ok(Box::new(part_02(&inp))), + } +} + +fn part_01(inp: &str) -> usize { + let parsed_input: Vec = inp.lines().map(|x| x.try_into().unwrap()).collect(); + let requirements = Requirements { + red: 12, + green: 13, + blue: 14, + }; + parsed_input + .into_iter() + .filter(|game| game.fits_requirements(&requirements)) + .fold(0, |acc, game| acc + game.id) +} + +fn part_02(inp: &str) -> usize { + todo!() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_parse_blue() { + assert_eq!(parse_blue(&mut "5 blue"), Color::Blue(5)) + } + + #[test] + fn test_parse_reveal() { + assert_eq!( + parse_reveal(&mut "3 blue, 4 red").unwrap(), + Reveal { + green: 0, + blue: 3, + red: 4, + } + ) + } + + #[test] + fn test_parse_game() { + assert_eq!( + "Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green" + .parse::() + .unwrap(), + Game { + id: 1, + reveals: vec![ + Reveal { + blue: 3, + red: 4, + green: 0, + }, + Reveal { + red: 1, + green: 2, + blue: 6, + }, + Reveal { + green: 2, + blue: 0, + red: 0, + }, + ], + } + ) + } + + #[test] + fn test_meets_reqs() { + assert!(Game { + id: 1, + reveals: vec![ + Reveal { + blue: 3, + red: 4, + green: 0, + }, + Reveal { + red: 1, + green: 2, + blue: 6, + }, + Reveal { + green: 2, + blue: 0, + red: 0, + }, + ], + } + .fits_requirements(&Requirements { + red: 10, + blue: 10, + green: 10, + })) + } + + #[test] + fn test_does_not_meet_reqs() { + assert!( + !(Game { + id: 1, + reveals: vec![ + Reveal { + blue: 3, + red: 4, + green: 0, + }, + Reveal { + red: 1, + green: 2, + blue: 6, + }, + Reveal { + green: 2, + blue: 0, + red: 0, + }, + ], + } + .fits_requirements(&Requirements { + red: 5, + blue: 5, + green: 5, + })) + ) + } +} diff --git a/flake.lock b/flake.lock index 01d80f1..554b8bd 100644 --- a/flake.lock +++ b/flake.lock @@ -60,12 +60,12 @@ "systems": "systems" }, "locked": { - "lastModified": 1694529238, - "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=", - "rev": "ff7b65b44d01cf9ba6a71320833626af21126384", - "revCount": 87, + "lastModified": 1701680307, + "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", + "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", + "revCount": 88, "type": "tarball", - "url": "https://api.flakehub.com/f/pinned/numtide/flake-utils/0.1.87%2Brev-ff7b65b44d01cf9ba6a71320833626af21126384/018a8a74-649b-792e-a959-2f97793b1129/source.tar.gz" + "url": "https://api.flakehub.com/f/pinned/numtide/flake-utils/0.1.88%2Brev-4022d587cbbfd70fe950c1e2083a02621806a725/018c340d-3287-7c66-818b-f2f646a808e3/source.tar.gz" }, "original": { "type": "tarball", @@ -74,12 +74,12 @@ }, "nixpkgs": { "locked": { - "lastModified": 1701253981, - "narHash": "sha256-ztaDIyZ7HrTAfEEUt9AtTDNoCYxUdSd6NrRHaYOIxtk=", - "rev": "e92039b55bcd58469325ded85d4f58dd5a4eaf58", - "revCount": 554114, + "lastModified": 1701436327, + "narHash": "sha256-tRHbnoNI8SIM5O5xuxOmtSLnswEByzmnQcGGyNRjxsE=", + "rev": "91050ea1e57e50388fa87a3302ba12d188ef723a", + "revCount": 555097, "type": "tarball", - "url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.1.554114%2Brev-e92039b55bcd58469325ded85d4f58dd5a4eaf58/018c246f-3485-7920-b58c-92909d475b54/source.tar.gz" + "url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.1.555097%2Brev-91050ea1e57e50388fa87a3302ba12d188ef723a/018c3450-2363-7c34-883b-4ba70b1eb7ae/source.tar.gz" }, "original": { "type": "tarball", diff --git a/flake.nix b/flake.nix index 403579a..7fbe4d1 100644 --- a/flake.nix +++ b/flake.nix @@ -149,6 +149,7 @@ packages = [ pkgs.sd pkgs.alejandra + pkgs.just ]; }; }); diff --git a/inputs/acicchetti-jf/day_two/one.txt b/inputs/acicchetti-jf/day_two/one.txt new file mode 100644 index 0000000..fb2ad66 --- /dev/null +++ b/inputs/acicchetti-jf/day_two/one.txt @@ -0,0 +1,100 @@ +Game 1: 4 green, 7 blue; 2 blue, 4 red; 5 blue, 2 green, 2 red; 1 green, 3 red, 9 blue; 3 green, 9 blue; 7 green, 2 blue, 2 red +Game 2: 1 blue, 2 red; 1 green, 2 blue, 1 red; 1 red, 5 green; 3 red, 2 blue, 8 green; 3 blue, 2 red, 4 green; 2 blue, 4 green, 3 red +Game 3: 7 red, 7 blue, 9 green; 15 green, 4 red, 8 blue; 3 green, 12 blue, 6 red +Game 4: 4 blue, 11 green, 6 red; 4 green, 2 red; 12 red, 1 blue, 3 green +Game 5: 10 green, 4 blue, 9 red; 3 green, 15 blue, 11 red; 15 blue, 1 green, 2 red; 8 red, 8 blue, 5 green +Game 6: 5 green, 19 red; 6 green, 13 red, 2 blue; 2 blue, 16 red, 4 green; 13 red, 9 blue, 5 green +Game 7: 1 blue, 6 red, 6 green; 7 blue, 4 red; 6 green, 1 red, 11 blue; 3 green, 4 blue, 4 red; 6 green, 13 blue, 11 red +Game 8: 8 green, 2 blue; 20 green, 1 red; 1 blue, 6 red, 6 green; 9 green +Game 9: 5 red; 4 green, 3 red, 1 blue; 1 blue; 6 red, 1 blue, 9 green +Game 10: 2 green, 3 red; 18 blue, 20 green, 9 red; 7 red, 9 blue, 17 green +Game 11: 15 green, 7 blue, 9 red; 7 blue, 10 green, 7 red; 5 red, 3 blue, 10 green; 5 blue, 12 green; 14 green, 8 blue, 5 red; 7 blue, 2 red, 5 green +Game 12: 3 green, 1 red, 8 blue; 9 blue, 3 red, 3 green; 4 blue, 1 green; 2 red, 3 green, 1 blue; 4 red, 7 blue, 3 green +Game 13: 14 green, 1 red; 4 green; 2 green, 1 blue; 14 green; 13 green, 1 red, 1 blue; 1 blue, 1 red, 5 green +Game 14: 1 blue, 6 red, 13 green; 5 red, 10 blue, 3 green; 19 green, 1 red, 14 blue; 4 red, 17 green, 9 blue; 12 green, 10 blue, 7 red +Game 15: 10 red, 2 blue, 18 green; 17 green, 3 blue, 7 red; 18 blue, 8 red, 12 green; 6 blue, 6 green, 12 red +Game 16: 14 blue, 5 green, 12 red; 7 green, 3 red, 9 blue; 4 green, 1 red, 8 blue; 9 red, 19 green, 12 blue; 12 blue, 7 red, 6 green; 5 blue, 3 green, 6 red +Game 17: 1 green, 1 blue, 15 red; 1 blue, 3 green, 12 red; 9 blue, 2 green, 10 red +Game 18: 12 red, 7 green, 7 blue; 3 blue, 8 red, 1 green; 2 green, 17 red +Game 19: 1 red, 7 blue, 17 green; 11 red, 15 blue; 11 blue, 18 green; 6 blue, 14 green, 14 red; 16 blue, 8 red, 8 green; 17 green, 9 red, 1 blue +Game 20: 11 green; 1 blue, 4 green, 7 red; 7 green; 3 red, 1 blue, 6 green +Game 21: 18 blue, 6 green, 10 red; 12 blue; 9 blue, 2 green, 9 red; 9 red, 20 blue, 1 green; 8 blue, 6 red; 19 blue, 1 green, 4 red +Game 22: 4 blue, 16 red, 3 green; 7 blue, 3 green, 12 red; 10 red, 7 green, 10 blue; 7 red, 11 blue, 4 green; 3 blue, 1 green, 16 red +Game 23: 5 green, 8 red, 1 blue; 2 red, 5 blue, 3 green; 2 green, 17 blue, 4 red; 2 blue, 2 red; 7 red, 1 green, 14 blue; 4 red, 8 blue +Game 24: 1 blue, 3 green, 1 red; 3 blue, 11 green, 15 red; 3 blue, 2 red, 12 green; 9 green, 6 red, 2 blue; 15 green, 12 red, 3 blue; 13 green, 1 blue, 13 red +Game 25: 6 blue, 5 red, 10 green; 9 red, 3 blue, 3 green; 6 blue, 11 red, 15 green; 7 green, 10 red, 4 blue; 2 red, 20 blue, 11 green +Game 26: 3 blue, 5 red, 10 green; 7 green, 6 red; 7 green, 1 red, 3 blue; 10 green, 4 red, 3 blue; 4 red, 7 green, 3 blue; 8 green, 4 red +Game 27: 16 green, 6 blue, 4 red; 3 red, 6 blue, 7 green; 10 green; 6 green, 1 red +Game 28: 5 green, 5 red, 2 blue; 1 blue, 9 red, 6 green; 2 blue, 3 red; 1 blue, 1 green, 5 red; 4 green, 3 red; 9 green, 1 blue, 14 red +Game 29: 1 red, 2 green, 13 blue; 1 green, 2 red, 9 blue; 12 red; 3 blue, 5 red +Game 30: 8 blue, 3 red, 9 green; 10 green, 9 blue; 9 green, 12 blue; 3 blue, 2 red, 4 green; 8 blue, 9 green; 1 red, 12 blue, 6 green +Game 31: 8 red, 16 blue; 2 red, 1 green, 1 blue; 5 red, 8 blue, 1 green +Game 32: 3 green, 5 blue, 8 red; 10 blue, 1 red, 3 green; 9 green, 3 blue, 2 red; 2 blue, 1 red, 14 green; 3 blue, 10 red, 16 green +Game 33: 1 red, 3 green, 2 blue; 15 blue, 1 green; 1 green, 1 red, 10 blue +Game 34: 4 green, 7 blue; 2 blue, 12 green; 6 red, 14 green, 7 blue +Game 35: 9 blue, 1 green; 2 green, 6 blue, 11 red; 1 green, 10 red, 1 blue +Game 36: 5 blue, 1 green, 2 red; 11 blue, 3 green, 5 red; 2 green, 14 blue, 2 red; 3 green, 5 blue, 5 red; 13 blue, 2 green, 5 red; 3 green +Game 37: 4 blue, 2 red, 8 green; 1 blue, 9 green, 4 red; 1 red, 4 green, 1 blue; 16 green, 3 blue, 4 red +Game 38: 9 blue, 9 green; 1 green, 3 blue; 8 blue, 6 red, 5 green; 1 green, 9 red, 1 blue +Game 39: 1 red, 17 green; 1 blue, 7 green, 7 red; 6 red, 4 blue +Game 40: 1 blue, 2 red; 10 blue, 4 green, 2 red; 1 green, 11 blue, 3 red; 4 blue, 2 green; 3 blue, 4 red +Game 41: 7 red, 4 blue, 4 green; 10 red, 11 blue, 1 green; 6 red, 6 blue, 4 green; 13 blue, 3 red, 7 green; 9 green, 12 blue, 14 red; 9 blue, 12 red, 10 green +Game 42: 3 blue, 1 red, 11 green; 4 blue, 9 green, 8 red; 3 red, 5 blue, 1 green +Game 43: 2 green, 17 blue, 9 red; 16 red, 12 blue, 2 green; 12 red, 12 blue, 7 green; 17 red, 16 blue, 7 green +Game 44: 2 red, 3 green, 5 blue; 5 red, 5 blue, 7 green; 2 red, 5 blue, 5 green; 6 red, 5 blue, 2 green +Game 45: 9 green, 1 blue; 1 red, 5 green, 2 blue; 2 blue, 4 green, 9 red; 13 green, 7 red, 1 blue; 3 blue, 4 green +Game 46: 5 green, 7 red; 8 green, 5 blue, 1 red; 1 blue, 7 red, 17 green +Game 47: 1 green, 17 blue; 9 blue, 1 green; 1 blue, 1 red +Game 48: 1 red, 6 green, 7 blue; 9 green, 1 red, 2 blue; 10 blue, 6 green, 1 red; 1 red, 4 green, 9 blue; 6 blue, 3 green, 1 red +Game 49: 1 red, 1 blue, 16 green; 3 red, 1 green; 16 green; 2 blue, 8 red, 19 green; 20 green, 9 red; 8 green, 6 red +Game 50: 1 green, 2 blue; 2 red, 3 blue; 4 red, 2 blue; 1 green; 3 blue; 3 blue, 2 green, 1 red +Game 51: 6 blue, 5 green; 6 red, 5 green; 6 green, 6 blue, 16 red; 10 red, 10 green, 1 blue +Game 52: 4 red, 5 green, 1 blue; 15 green, 1 blue; 8 green, 5 blue, 5 red; 4 blue, 11 green, 1 red +Game 53: 5 green, 3 blue, 5 red; 2 red, 4 blue, 1 green; 1 red, 2 green; 11 red +Game 54: 7 green, 16 blue, 5 red; 5 green; 10 blue, 6 green, 5 red; 3 green +Game 55: 3 green; 16 green, 1 blue; 13 green, 19 blue, 1 red; 13 green, 18 blue +Game 56: 9 green; 3 blue, 1 red, 10 green; 1 red, 4 blue, 9 green +Game 57: 14 blue, 2 red, 3 green; 1 red, 8 blue, 7 green; 1 green, 3 red, 15 blue; 5 green, 12 blue; 4 green, 15 blue +Game 58: 9 red, 5 green; 10 green, 11 red, 1 blue; 12 green, 17 red, 1 blue; 1 blue, 1 green, 17 red; 14 red, 1 blue, 16 green +Game 59: 2 red, 12 blue, 10 green; 6 green, 1 red, 14 blue; 14 blue, 9 green, 2 red; 12 green, 14 blue, 2 red +Game 60: 5 blue, 8 green; 1 red, 6 green, 7 blue; 1 blue +Game 61: 5 red, 2 blue, 5 green; 2 blue, 11 green; 1 blue, 2 red, 14 green; 3 green; 4 red, 13 green; 2 blue, 6 green, 1 red +Game 62: 1 red, 1 blue, 2 green; 3 red, 1 blue, 2 green; 1 blue, 10 red; 6 red, 1 blue +Game 63: 7 red, 6 blue, 4 green; 2 blue, 5 green, 8 red; 5 blue, 4 green, 10 red; 4 blue, 7 red, 10 green; 5 blue, 10 green, 8 red; 4 blue, 10 green, 3 red +Game 64: 6 red, 7 green, 15 blue; 8 blue, 16 green, 3 red; 11 green, 12 blue; 4 red, 17 blue, 8 green +Game 65: 2 blue, 7 green; 2 red, 8 blue; 2 green, 1 red, 5 blue; 1 green, 2 blue; 19 green, 7 blue; 2 red, 3 blue, 14 green +Game 66: 15 green, 7 blue; 9 blue, 3 green, 16 red; 1 red, 1 blue, 16 green; 18 red, 8 blue, 11 green +Game 67: 1 blue, 1 green, 2 red; 5 green, 8 red, 2 blue; 7 red, 1 blue +Game 68: 3 blue, 10 red; 13 red, 1 green; 5 blue, 5 red; 2 blue, 1 green, 16 red; 16 red, 3 blue +Game 69: 7 red, 1 blue, 3 green; 14 green, 2 blue; 3 green, 2 blue; 4 red, 1 green, 1 blue; 10 red, 14 green, 2 blue +Game 70: 10 green, 12 red; 5 red, 7 green; 1 blue, 6 red, 11 green +Game 71: 16 green, 13 red, 10 blue; 7 red, 7 blue, 15 green; 17 green, 13 red, 1 blue; 5 blue, 8 green, 11 red; 7 red, 1 blue, 15 green; 15 green, 4 blue, 2 red +Game 72: 3 blue, 3 red; 2 blue, 3 red, 1 green; 1 red, 1 blue, 3 green; 1 green, 2 blue, 3 red; 3 blue, 1 green, 1 red; 1 blue, 4 red +Game 73: 10 blue, 11 red, 5 green; 6 green, 9 blue, 4 red; 10 red, 5 green, 9 blue +Game 74: 6 green, 17 blue; 1 red, 1 blue, 11 green; 2 blue, 1 red, 3 green +Game 75: 11 red, 11 green, 3 blue; 11 red, 1 blue, 6 green; 4 green, 3 blue, 8 red +Game 76: 3 green, 3 blue, 12 red; 3 blue, 15 green, 3 red; 4 red, 15 green, 2 blue +Game 77: 13 blue, 11 red, 1 green; 3 red, 12 green, 12 blue; 7 red, 15 green, 4 blue; 5 red, 2 green, 3 blue +Game 78: 4 red, 8 blue, 2 green; 7 blue, 3 green, 7 red; 3 green, 13 blue; 3 red, 4 green +Game 79: 7 blue, 13 red, 8 green; 7 green, 15 red, 9 blue; 2 green, 8 red, 10 blue; 13 blue, 20 red, 7 green; 11 red, 2 green, 14 blue +Game 80: 12 red; 2 blue, 15 red, 3 green; 1 blue, 1 green, 2 red; 1 green; 1 green, 3 blue, 13 red; 1 green, 2 blue, 1 red +Game 81: 11 blue; 6 blue, 8 green, 4 red; 7 blue, 1 red, 1 green +Game 82: 9 blue, 1 red; 3 blue, 1 red, 3 green; 8 blue, 8 green, 2 red; 5 blue +Game 83: 7 blue, 13 red; 4 blue, 2 green, 3 red; 15 blue, 9 red, 1 green; 14 red, 1 green, 12 blue +Game 84: 8 blue, 1 green, 20 red; 9 green, 20 red, 18 blue; 16 red, 15 blue, 5 green; 15 red, 10 green, 16 blue; 11 green, 14 red, 12 blue +Game 85: 1 red, 2 blue, 9 green; 13 green, 3 blue, 5 red; 1 green, 1 red, 3 blue; 8 green, 2 blue, 1 red +Game 86: 10 red, 6 blue, 11 green; 1 red, 11 green; 7 blue, 6 red, 11 green +Game 87: 14 red, 4 blue, 4 green; 14 red, 4 blue, 7 green; 12 red, 11 green, 5 blue; 5 blue, 12 red +Game 88: 3 green, 4 blue, 11 red; 3 green, 4 blue, 3 red; 10 red, 3 green; 3 blue, 2 red, 2 green +Game 89: 4 blue, 2 red, 3 green; 3 green, 7 red, 13 blue; 1 green, 6 blue +Game 90: 7 red; 5 blue, 11 red, 8 green; 8 red, 3 green, 2 blue +Game 91: 2 blue; 4 red; 2 blue, 4 green; 3 green, 1 blue, 1 red +Game 92: 7 blue, 10 green; 9 green, 9 blue, 7 red; 6 green; 12 red, 1 blue, 4 green; 5 red, 1 green, 13 blue +Game 93: 7 green, 6 red, 1 blue; 3 red, 6 green, 8 blue; 1 blue, 6 green; 6 red, 15 blue, 4 green; 10 blue, 2 green, 6 red; 3 green, 5 red, 6 blue +Game 94: 5 red, 1 green, 15 blue; 1 blue, 6 red; 2 red, 6 blue, 2 green +Game 95: 9 blue, 4 red, 17 green; 15 green, 9 red, 10 blue; 1 blue, 13 green, 12 red +Game 96: 1 blue, 12 green, 1 red; 3 blue, 1 green, 5 red; 2 blue, 8 red, 10 green +Game 97: 18 blue, 7 red, 11 green; 6 red, 3 blue, 14 green; 1 red, 13 blue, 4 green +Game 98: 5 blue, 2 green, 8 red; 12 red; 13 red, 4 blue, 4 green; 7 red, 11 blue; 10 blue, 2 green, 2 red; 6 red, 12 blue +Game 99: 4 green, 2 blue, 4 red; 9 blue, 11 red, 1 green; 5 green +Game 100: 2 blue, 12 green; 6 green, 1 red, 12 blue; 1 green, 5 blue, 1 red; 1 red, 12 green, 6 blue; 16 blue, 3 green diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..5892079 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +channel = "nightly" +components = [ "rustfmt", "clippy", "rust-analyzer"]