const INPUT: &str = include_str!("../inputs/02"); fn get_instructions() -> impl Iterator { INPUT .lines() .filter_map(|s| s.split_once(' ')) .filter_map(|(op, n)| n.parse::().ok().map(|n| (op, n))) } fn part_1() -> isize { let x: isize = get_instructions() .filter(|(op, _)| *op == "forward") .map(|(_, n)| n) .sum(); let y: isize = get_instructions() .filter_map(|(op, n)| match op { "up" => Some(-n), "down" => Some(n), _ => None, }) .sum(); x * y } fn part_2() -> isize { let mut x = 0isize; let mut depth = 0isize; let mut aim = 0isize; for (op, n) in get_instructions() { match op { "forward" => { x += n; depth += n * aim; } "down" => aim += n, "up" => aim -= n, _ => unreachable!(), } } x * depth } pub fn main() { println!("Day 2:"); println!(" Part 1: {}", part_1()); println!(" Part 2: {}", part_2()); }