Skip to content
Snippets Groups Projects
Commit 92da9ee7 authored by Falk Rehse's avatar Falk Rehse
Browse files

Day 2

parent e696092d
No related branches found
No related tags found
No related merge requests found
......@@ -5,3 +5,50 @@ version = 3
[[package]]
name = "advent-of-code-23"
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"
......@@ -6,3 +6,4 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
regex = "1.10.2"
pub struct Game {
pub rounds: Vec<Round>,
pub id: u32,
}
pub struct Round {
pub red: u32,
pub green: u32,
pub blue: u32,
}
mod game;
use crate::util::*;
use game::Game;
use self::game::Round;
pub fn solve_from_str(input: &str) -> u32 {
input
.lines()
.map(|line| parse_game(line))
.filter_map(|game| id_if_possible(&game))
.sum()
}
fn parse_game(line: &str) -> Game {
let input: Vec<&str> = line.split(":").collect();
let id = regex_positive_number(input[0]);
let mut rounds = Vec::new();
let results: Vec<&str> = input[1].split(";").collect();
for result in results {
let colors: Vec<&str> = result.split(",").collect();
let mut red = 0;
let mut green = 0;
let mut blue = 0;
for color in colors {
if color.contains("red") {
red = regex_positive_number(color);
}
if color.contains("green") {
green = regex_positive_number(color);
}
if color.contains("blue") {
blue = regex_positive_number(color);
}
}
let round = Round { red, green, blue };
rounds.push(round);
}
Game { rounds, id }
}
fn id_if_possible(game: &Game) -> Option<u32> {
for round in &game.rounds {
if round.red > 12 {
return None;
}
if round.green > 13 {
return None;
}
if round.blue > 14 {
return None;
}
}
Some(game.id)
}
pub struct Game {
pub rounds: Vec<Round>,
pub id: u32,
}
pub struct Round {
pub red: u32,
pub green: u32,
pub blue: u32,
}
mod game;
use crate::util::*;
use game::Game;
use self::game::Round;
pub fn solve_from_str(input: &str) -> u32 {
input
.lines()
.map(|line| parse_game(line))
.map(|game| minimum_power(&game))
.sum()
}
fn parse_game(line: &str) -> Game {
let input: Vec<&str> = line.split(":").collect();
let id = regex_positive_number(input[0]);
let mut rounds = Vec::new();
let results: Vec<&str> = input[1].split(";").collect();
for result in results {
let colors: Vec<&str> = result.split(",").collect();
let mut red = 0;
let mut green = 0;
let mut blue = 0;
for color in colors {
if color.contains("red") {
red = regex_positive_number(color);
}
if color.contains("green") {
green = regex_positive_number(color);
}
if color.contains("blue") {
blue = regex_positive_number(color);
}
}
let round = Round { red, green, blue };
rounds.push(round);
}
Game { rounds, id }
}
fn minimum_power(game: &Game) -> u32 {
game.rounds.iter().map(|round| round.red).max().unwrap()
* game.rounds.iter().map(|round| round.green).max().unwrap()
* game.rounds.iter().map(|round| round.blue).max().unwrap()
}
mod day_1_1;
mod day_1_2;
mod day_2_1;
mod day_2_2;
mod util;
use std::fs;
fn main() {
let input = fs::read_to_string("input").expect("Could not read input!");
let solution = day_1_2::solve_from_str(input.as_str());
let solution = day_2_2::solve_from_str(input.as_str());
println!("Solution: {}", solution);
}
use regex::Regex;
pub fn regex_positive_number(input: &str) -> u32 {
let re = Regex::new(r"(?<number>\d+)").unwrap();
let captures = re.captures(input).expect("Regex did not find a positive number!");
str::parse(&captures["number"]).expect("Regex did not parse as u32!")
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment