AoC-2023/src/bin/day04.rs

37 lines
1.2 KiB
Rust
Raw Permalink Normal View History

2023-12-04 16:03:07 -06:00
use {color_eyre::eyre::ContextCompat, color_eyre::Result, std::io::stdin};
fn main() -> Result<()> {
Ok(println!(
"{}",
stdin()
.lines()
.map(|ln| -> Result<_> {
let ln = ln?;
let (winning, nums) = ln
.split_once(':')
.context("Invalid record: missing ':' separator")?
.1
.split_once('|')
.context("Invalid record: missing '|' separator")?;
let winning = winning
.split_whitespace()
.map(str::parse)
.collect::<Result<Box<[u64]>, _>>()?;
let n = nums
.split_whitespace()
.map(str::parse)
.map(|item| item.map(|item| winning.contains(&item)))
.try_fold::<_, _, Result<_>>(0, |acc, x| Ok(acc + x? as u64))?;
if n != 0 {
Ok(2_u64.pow(u32::try_from(n)?.saturating_sub(1)))
} else {
Ok(0)
}
})
.try_fold::<_, _, Result<_>>(0, |acc, x| Ok(acc + x?))?
))
}