Day 2
This commit is contained in:
parent
e364357d00
commit
fea946a7df
5
src/day02/input/test1.txt
Normal file
5
src/day02/input/test1.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
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
|
135
src/day02/mod.rs
Normal file
135
src/day02/mod.rs
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use anyhow::{anyhow, Result};
|
||||||
|
|
||||||
|
use crate::instrument::instrument;
|
||||||
|
|
||||||
|
const INPUT: &str = include_str!("input/input.txt");
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Handful {
|
||||||
|
red: u32,
|
||||||
|
green: u32,
|
||||||
|
blue: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for Handful {
|
||||||
|
type Err = anyhow::Error;
|
||||||
|
fn from_str(s: &str) -> Result<Self> {
|
||||||
|
let mut red = 0;
|
||||||
|
let mut green = 0;
|
||||||
|
let mut blue = 0;
|
||||||
|
for handful in s.split(',') {
|
||||||
|
let mut handful = handful.trim().split(' ');
|
||||||
|
let num = handful
|
||||||
|
.next()
|
||||||
|
.ok_or_else(|| anyhow!("Invalid handful"))?
|
||||||
|
.parse()?;
|
||||||
|
match handful.next().ok_or_else(|| anyhow!("Invalid handful"))? {
|
||||||
|
"red" => red = num,
|
||||||
|
"green" => green = num,
|
||||||
|
"blue" => blue = num,
|
||||||
|
_ => return Err(anyhow!("Invalid handful")),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(Self { red, green, blue })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Game {
|
||||||
|
id: u32,
|
||||||
|
handfuls: Vec<Handful>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for Game {
|
||||||
|
type Err = anyhow::Error;
|
||||||
|
fn from_str(s: &str) -> Result<Self> {
|
||||||
|
let mut s = s.trim().split(':');
|
||||||
|
let id = s
|
||||||
|
.next()
|
||||||
|
.ok_or_else(|| anyhow!("Invalid game line: no ':' found"))?;
|
||||||
|
let id = id
|
||||||
|
.split(' ')
|
||||||
|
.last()
|
||||||
|
.ok_or_else(|| anyhow!("Invalid game line: no number found"))?
|
||||||
|
.parse()?;
|
||||||
|
let handfuls = s
|
||||||
|
.next()
|
||||||
|
.ok_or_else(|| anyhow!("Invalid game line: nothing after ':' found"))?;
|
||||||
|
let handfuls = handfuls
|
||||||
|
.split(';')
|
||||||
|
.map(|handful| handful.parse())
|
||||||
|
.collect::<Result<Vec<Handful>>>()?;
|
||||||
|
Ok(Self { id, handfuls })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part1(input: &str) -> Result<u32> {
|
||||||
|
let total_red = 12;
|
||||||
|
let total_green = 13;
|
||||||
|
let total_blue = 14;
|
||||||
|
|
||||||
|
let games = input
|
||||||
|
.lines()
|
||||||
|
.map(|line| line.parse())
|
||||||
|
.collect::<Result<Vec<Game>>>()?;
|
||||||
|
Ok(games
|
||||||
|
.into_iter()
|
||||||
|
.filter(|game| {
|
||||||
|
!game.handfuls.iter().any(|handful| {
|
||||||
|
handful.red > total_red || handful.green > total_green || handful.blue > total_blue
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.map(|game| game.id)
|
||||||
|
.sum())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2(input: &str) -> Result<u32> {
|
||||||
|
let games = input
|
||||||
|
.lines()
|
||||||
|
.map(|line| line.parse())
|
||||||
|
.collect::<Result<Vec<Game>>>()?;
|
||||||
|
let mut sum = 0;
|
||||||
|
for game in games {
|
||||||
|
let mut max_red = 0;
|
||||||
|
let mut max_green = 0;
|
||||||
|
let mut max_blue = 0;
|
||||||
|
for handful in game.handfuls {
|
||||||
|
if handful.red > max_red {
|
||||||
|
max_red = handful.red;
|
||||||
|
}
|
||||||
|
if handful.green > max_green {
|
||||||
|
max_green = handful.green;
|
||||||
|
}
|
||||||
|
if handful.blue > max_blue {
|
||||||
|
max_blue = handful.blue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sum += max_red * max_green * max_blue;
|
||||||
|
}
|
||||||
|
Ok(sum)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn solve() -> Result<()> {
|
||||||
|
println!("\nDay 02");
|
||||||
|
instrument!(part1(INPUT)?, part2(INPUT)?);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
const TEST_INPUT1: &str = include_str!("input/test1.txt");
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_part1() {
|
||||||
|
assert_eq!(part1(TEST_INPUT1).unwrap(), 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_part2() {
|
||||||
|
assert_eq!(part2(TEST_INPUT1).unwrap(), 2286);
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,5 @@
|
|||||||
pub mod day01;
|
pub mod day01;
|
||||||
|
pub mod day02;
|
||||||
pub mod instrument;
|
pub mod instrument;
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
@ -6,5 +7,6 @@ use anyhow::Result;
|
|||||||
fn main() -> Result<()> {
|
fn main() -> Result<()> {
|
||||||
println!("Advent of Code 2023");
|
println!("Advent of Code 2023");
|
||||||
day01::solve()?;
|
day01::solve()?;
|
||||||
|
day02::solve()?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user