pub fn solve(puzzle: String) -> u64 { let mut iters: Vec<_> = puzzle .lines() .map(|line| line.split_whitespace()) .collect(); std::iter::from_fn(move || { let column: Option> = iters .iter_mut() .map(|it| it.next()) .collect::>>(); let column = column?; Some(( column[..column.len() - 1].iter().map(|v| v.parse::().unwrap()).collect::>(), *column.last().unwrap(), )) }).map(|(vals, op)| { match op { "+" => vals.iter().sum::(), "*" => vals.iter().product::(), _ => unreachable!(), } }).sum::() }