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::, _>>()?; 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?))? )) }