summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock47
-rw-r--r--Cargo.toml1
-rw-r--r--src/bin/day2.rs78
3 files changed, 126 insertions, 0 deletions
diff --git a/Cargo.lock b/Cargo.lock
index c0c9382..25dadba 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5,3 +5,50 @@ version = 3
[[package]]
name = "advent"
version = "0.1.0"
+dependencies = [
+ "regex",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "memchr"
+version = "2.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
+
+[[package]]
+name = "regex"
+version = "1.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
diff --git a/Cargo.toml b/Cargo.toml
index bb0c0e0..02de396 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -5,3 +5,4 @@ authors = ["Reiner Herrmann <reiner@reiner-h.de>"]
edition = "2021"
[dependencies]
+regex = "1"
diff --git a/src/bin/day2.rs b/src/bin/day2.rs
new file mode 100644
index 0000000..1f4a1d3
--- /dev/null
+++ b/src/bin/day2.rs
@@ -0,0 +1,78 @@
+use std::collections::HashMap;
+use regex::Regex;
+
+static DAY: u8 = 2;
+
+fn main() {
+ let input = advent::read_lines(DAY);
+ println!("{DAY}a: {}", sum_possible(&input));
+ println!("{DAY}b: {}", 0);
+}
+
+struct Game {
+ id: usize,
+ infos: Vec<HashMap<String, usize>>,
+}
+
+impl Game {
+ fn new(input: &str) -> Game {
+ let re = Regex::new("^Game ([0-9]+): (.*)").unwrap();
+ let caps = re.captures(input).unwrap();
+
+ let id = caps[1].parse().unwrap();
+ let mut infos = Vec::new();
+ for info in caps[2].split("; ") {
+ let mut color_amount = HashMap::new();
+ for color_info in info.split(", ") {
+ let (amount, color) = color_info.split_once(' ').unwrap();
+ let amount = amount.parse().unwrap();
+ color_amount.insert(color.to_string(), amount);
+ }
+ infos.push(color_amount);
+ }
+ Game { id, infos }
+ }
+
+ fn is_possible(&self, bagged: &HashMap<String, usize>) -> bool {
+ for info in &self.infos {
+ for (color, amount) in info {
+ if bagged[color] < *amount {
+ return false
+ }
+ }
+ }
+ true
+ }
+}
+
+fn sum_possible(input: &[String]) -> usize {
+ let games = input.iter()
+ .map(|x| Game::new(x))
+ .collect::<Vec<Game>>();
+ let bag_content = HashMap::from([
+ ("red".to_string(), 12),
+ ("green".to_string(), 13),
+ ("blue".to_string(), 14),
+ ]);
+ games.iter()
+ .filter(|x| x.is_possible(&bag_content))
+ .map(|x| x.id)
+ .sum()
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test() {
+ let input = [
+ "Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green",
+ "Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue",
+ "Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red",
+ "Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red",
+ "Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green",
+ ].iter().map(|&x| String::from(x)).collect::<Vec<_>>();
+ assert_eq!(sum_possible(&input), 8);
+ }
+}