fn parse_input(input: &str) -> Vec<(&str, i64)> { input.lines().map(|l| l.split(" ").collect()).map ( |v: Vec<&str>| (v[0], v[1].parse::().expect("err parsing int"))).collect() } fn plot(input: Vec<(&str, i64)>) -> i64 { input.iter().fold(vec![0,0], |acc: Vec, v| match v.0 { "up" => vec!(acc[0] - v.1, acc[1]), "down" => vec!(acc[0] + v.1, acc[1]), "forward" => vec!(acc[0], acc[1] + v.1), _ => {println!("unhandled dir {}", v.0); acc}, }).iter().product::() } fn plot_aim(input: Vec<(&str, i64)>) -> i64 { let v = input.iter().fold(vec![0,0,0], |acc: Vec, v| match v.0 { "up" => vec!(acc[0], acc[1], acc[2] - v.1), "down" => vec!(acc[0], acc[1], acc[2] + v.1), "forward" => vec!(acc[0] + v.1, acc[1] + (v.1 * acc[2]), acc[2]), _ => {println!("unhandled dir {}", v.0); acc}, }); v[0] * v[1] } #[cfg(test)] mod tests { use super::*; #[test] fn part_1(){ println!("Part 1 Solution: {}", plot(parse_input( include_str!("../input/day02.txt")))); } #[test] fn part_2(){ println!("Part 2 Solution: {}", plot_aim(parse_input( include_str!("../input/day02.txt")))); } }