add day 2
This commit is contained in:
		
							
								
								
									
										78
									
								
								2021/src/day2.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								2021/src/day2.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,78 @@
 | 
				
			|||||||
 | 
					use std::str::FromStr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use color_eyre::eyre;
 | 
				
			||||||
 | 
					use eyre::{eyre, ensure};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use crate::lib::ParseLines;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum Direction {
 | 
				
			||||||
 | 
					    Forward,
 | 
				
			||||||
 | 
					    Up,
 | 
				
			||||||
 | 
					    Down,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct MoveCmd {
 | 
				
			||||||
 | 
					    dir: Direction,
 | 
				
			||||||
 | 
					    value: i32,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl<'a> FromStr for MoveCmd {
 | 
				
			||||||
 | 
					    type Err = eyre::Report;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn from_str(s: &str) -> Result<Self, Self::Err> {
 | 
				
			||||||
 | 
					        let parts: Vec<&str> = s.split_whitespace().collect();
 | 
				
			||||||
 | 
					        ensure!(parts.len() == 2, "Could not parse: \"{}\" (Wrong number of words)", s);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let dir = match parts[0] {
 | 
				
			||||||
 | 
					            "forward" => Direction::Forward,
 | 
				
			||||||
 | 
					            "up" => Direction::Up,
 | 
				
			||||||
 | 
					            "down" => Direction::Down,
 | 
				
			||||||
 | 
					            _ => return Err(eyre!("Could not parse: \"{}\" (invalid axis)", s)),
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let value = parts[1].parse::<i32>()?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Ok(MoveCmd{dir, value})
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn part1(data: &str) -> eyre::Result<()> {
 | 
				
			||||||
 | 
					    let mut horiz = 0; // how many units forward
 | 
				
			||||||
 | 
					    let mut vert = 0; // how many units DOWN (so flipped)
 | 
				
			||||||
 | 
					    for res in data.parse_lines::<MoveCmd>() {
 | 
				
			||||||
 | 
					        let cmd = res?;
 | 
				
			||||||
 | 
					        match cmd.dir {
 | 
				
			||||||
 | 
					            Direction::Forward => horiz += cmd.value,
 | 
				
			||||||
 | 
					            Direction::Up => vert -= cmd.value,
 | 
				
			||||||
 | 
					            Direction::Down => vert += cmd.value,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    println!("One: {}", horiz * vert);
 | 
				
			||||||
 | 
					    Ok(())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn part2(data: &str) -> eyre::Result<()> {
 | 
				
			||||||
 | 
					    let mut horiz = 0;
 | 
				
			||||||
 | 
					    let mut vert = 0;
 | 
				
			||||||
 | 
					    let mut aim = 0;
 | 
				
			||||||
 | 
					    for res in data.parse_lines::<MoveCmd>() {
 | 
				
			||||||
 | 
					        let cmd = res?;
 | 
				
			||||||
 | 
					        match cmd.dir {
 | 
				
			||||||
 | 
					            Direction::Down => aim += cmd.value, // flipped again
 | 
				
			||||||
 | 
					            Direction::Up => aim -= cmd.value,
 | 
				
			||||||
 | 
					            Direction::Forward => {
 | 
				
			||||||
 | 
					                horiz += cmd.value;
 | 
				
			||||||
 | 
					                vert +=  cmd.value * aim;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    println!("Two: {}", horiz * vert);
 | 
				
			||||||
 | 
					    Ok(())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -36,7 +36,7 @@ pub trait ParseLines {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl ParseLines for String {
 | 
					impl ParseLines for str {
 | 
				
			||||||
    fn parse_lines<T: FromStr>(&self) -> LineParser<'_, T> {
 | 
					    fn parse_lines<T: FromStr>(&self) -> LineParser<'_, T> {
 | 
				
			||||||
        LineParser {
 | 
					        LineParser {
 | 
				
			||||||
            it: self.lines(),
 | 
					            it: self.lines(),
 | 
				
			||||||
@@ -45,3 +45,10 @@ impl ParseLines for String {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl ParseLines for String {
 | 
				
			||||||
 | 
					    fn parse_lines<T: FromStr>(&self) -> LineParser<'_, T> {
 | 
				
			||||||
 | 
					        self[..].parse_lines::<T>()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,13 +3,19 @@ use color_eyre::eyre;
 | 
				
			|||||||
mod lib;
 | 
					mod lib;
 | 
				
			||||||
use lib::{load, ParseLines};
 | 
					use lib::{load, ParseLines};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mod day2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn main() -> eyre::Result<()> {
 | 
					fn main() -> eyre::Result<()> {
 | 
				
			||||||
    day_one()
 | 
					    let data = load("data/02.txt")?;
 | 
				
			||||||
 | 
					    day2::part1(&data)?;
 | 
				
			||||||
 | 
					    day2::part2(&data)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[allow(dead_code)]
 | 
				
			||||||
fn day_one() -> eyre::Result<()> {
 | 
					fn day_one() -> eyre::Result<()> {
 | 
				
			||||||
    let data = load("data/01.txt")?;
 | 
					    let data = load("data/01.txt")?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -38,8 +44,3 @@ fn day_one() -> eyre::Result<()> {
 | 
				
			|||||||
    println!("Two: {}", window_increases);
 | 
					    println!("Two: {}", window_increases);
 | 
				
			||||||
    Ok(())
 | 
					    Ok(())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// fn day_two() -> eyre::Result<()> {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// }
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user