Day 2
This commit is contained in:
parent
0483fa50ef
commit
2cf807f941
80
src/bin/day02.rs
Normal file
80
src/bin/day02.rs
Normal file
|
@ -0,0 +1,80 @@
|
|||
use color_eyre::{
|
||||
eyre::{bail, ContextCompat},
|
||||
Report, Result,
|
||||
};
|
||||
use std::io::stdin;
|
||||
|
||||
fn n_colour_pair(input: &str) -> Result<(u64, &str)> {
|
||||
let (n, c) = input
|
||||
.trim()
|
||||
.split_once(' ')
|
||||
.context("Invalid poll format; expected: <num> <colour>")?;
|
||||
|
||||
Ok((n.parse()?, c))
|
||||
}
|
||||
|
||||
fn part1(id: u64, game: &str) -> Result<u64> {
|
||||
let and_reducer = |acc, x| Ok(acc && x?);
|
||||
|
||||
Ok(game
|
||||
.split(';')
|
||||
.map(|game| -> Result<bool> {
|
||||
game.split(',')
|
||||
.map(|poll| -> Result<bool> {
|
||||
let (count, colour) = n_colour_pair(poll)?;
|
||||
Ok(match colour {
|
||||
"red" if count <= 12 => true,
|
||||
"green" if count <= 13 => true,
|
||||
"blue" if count <= 14 => true,
|
||||
"red" | "green" | "blue" => false,
|
||||
c => {
|
||||
bail!("Invalid colour: {c}, expected red, green or blue")
|
||||
}
|
||||
})
|
||||
})
|
||||
.try_fold(true, and_reducer)
|
||||
})
|
||||
.try_fold(true, and_reducer)?
|
||||
.then_some(id)
|
||||
.unwrap_or_default())
|
||||
}
|
||||
|
||||
fn part2(_: u64, game: &str) -> Result<u64> {
|
||||
game.split([',', ';'])
|
||||
.try_fold([0; 3], |mut acc, seg| {
|
||||
let (count, colour) = n_colour_pair(seg)?;
|
||||
let i = match colour {
|
||||
"red" => 0,
|
||||
"green" => 1,
|
||||
"blue" => 2,
|
||||
c => bail!("Invalid colour: {c}, expected red, green or blue"),
|
||||
};
|
||||
|
||||
acc[i] = acc[i].max(count);
|
||||
Ok(acc)
|
||||
})
|
||||
.map(|arr| arr.iter().product())
|
||||
}
|
||||
|
||||
fn main() -> Result<()> {
|
||||
//let part = part1;
|
||||
let part = part2;
|
||||
|
||||
Ok(println!(
|
||||
"{}",
|
||||
stdin()
|
||||
.lines()
|
||||
.map(|ln| {
|
||||
ln.map_err(Report::from).and_then(|ln| {
|
||||
let (id, game) = ln.split_once(':').context("Invalid ID")?;
|
||||
let id: u64 = id
|
||||
.strip_prefix("Game ")
|
||||
.context("ID should start with \"Game \"")?
|
||||
.parse()?;
|
||||
|
||||
part(id, game)
|
||||
})
|
||||
})
|
||||
.try_fold::<_, _, Result<u64>>(0, |acc, x| Ok(acc + x?))?
|
||||
))
|
||||
}
|
Loading…
Reference in a new issue