37 lines
1.2 KiB
Rust
37 lines
1.2 KiB
Rust
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?))?
|
|
))
|
|
}
|