aoc2021/src/day02.rs

37 lines
1.2 KiB
Rust

fn parse_input(input: &str) -> Vec<(&str, i64)> {
input.lines().map(|l| l.split(" ").collect()).map ( |v: Vec<&str>| (v[0], v[1].parse::<i64>().expect("err parsing int"))).collect()
}
fn plot(input: Vec<(&str, i64)>) -> i64 {
input.iter().fold(vec![0,0], |acc: Vec<i64>, 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::<i64>()
}
fn plot_aim(input: Vec<(&str, i64)>) -> i64 {
let v = input.iter().fold(vec![0,0,0], |acc: Vec<i64>, 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"))));
}
}