From e023b2ad45e8eb624b15a9301a3a96fbb9442e92 Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Thu, 2 Dec 2021 09:19:49 +0200 Subject: Day 2 --- inputs/day_2.txt | 1000 +++++++++++++++++++++++++++++++++++++++++++++++ src/bin/day_1.rs | 10 +- src/bin/day_2.rs | 100 +++++ src/bin/day_2_part_2.rs | 124 ++++++ src/parsers.rs | 17 - 5 files changed, 1231 insertions(+), 20 deletions(-) create mode 100644 inputs/day_2.txt create mode 100644 src/bin/day_2.rs create mode 100644 src/bin/day_2_part_2.rs diff --git a/inputs/day_2.txt b/inputs/day_2.txt new file mode 100644 index 0000000..917f466 --- /dev/null +++ b/inputs/day_2.txt @@ -0,0 +1,1000 @@ +forward 2 +forward 6 +forward 8 +forward 7 +down 5 +forward 8 +forward 9 +down 2 +forward 6 +down 9 +forward 1 +forward 8 +forward 6 +forward 7 +down 4 +down 5 +forward 1 +up 5 +down 7 +down 7 +down 1 +up 2 +forward 3 +forward 2 +forward 2 +forward 5 +up 5 +forward 4 +forward 9 +forward 6 +down 4 +down 9 +down 2 +up 6 +forward 9 +up 7 +forward 7 +forward 5 +up 3 +forward 4 +forward 9 +up 5 +down 3 +up 6 +down 5 +down 4 +up 6 +forward 9 +forward 6 +down 9 +up 3 +down 7 +up 1 +forward 8 +forward 3 +forward 8 +up 6 +forward 7 +forward 5 +forward 8 +up 2 +forward 2 +forward 7 +forward 7 +down 1 +forward 7 +up 7 +down 3 +forward 9 +down 5 +down 2 +forward 5 +forward 1 +forward 4 +forward 6 +up 2 +up 7 +forward 2 +forward 6 +forward 7 +down 9 +up 8 +down 9 +down 3 +up 8 +down 3 +down 2 +up 6 +forward 3 +forward 9 +down 4 +forward 5 +down 6 +up 8 +forward 1 +down 6 +down 6 +forward 5 +down 6 +forward 8 +up 7 +down 3 +forward 7 +forward 3 +forward 1 +forward 4 +forward 4 +down 3 +up 9 +up 5 +forward 1 +down 2 +up 4 +forward 7 +up 4 +down 3 +down 5 +down 8 +forward 4 +up 8 +forward 7 +up 3 +up 4 +up 9 +forward 1 +forward 1 +down 6 +forward 1 +down 8 +up 4 +forward 9 +forward 9 +down 6 +forward 9 +forward 8 +down 2 +up 3 +up 3 +down 9 +forward 7 +forward 8 +down 4 +forward 1 +up 3 +forward 3 +down 3 +down 9 +down 5 +up 7 +up 2 +forward 7 +forward 2 +forward 5 +forward 4 +down 7 +forward 7 +up 1 +up 3 +down 6 +down 4 +forward 9 +forward 8 +down 5 +down 4 +down 1 +down 5 +forward 9 +forward 8 +down 3 +forward 5 +forward 3 +forward 6 +down 6 +forward 3 +up 9 +forward 4 +down 7 +forward 3 +forward 7 +forward 1 +forward 5 +down 1 +forward 1 +down 6 +up 7 +down 3 +forward 2 +down 4 +forward 6 +up 6 +forward 8 +forward 8 +down 5 +up 4 +forward 7 +forward 6 +up 4 +forward 6 +down 1 +forward 6 +forward 2 +up 4 +down 6 +down 7 +forward 4 +down 4 +forward 1 +down 3 +forward 5 +forward 5 +forward 9 +forward 3 +up 7 +down 7 +forward 7 +forward 5 +down 1 +down 1 +forward 3 +down 8 +forward 1 +forward 2 +forward 9 +forward 1 +forward 3 +down 3 +up 4 +forward 5 +down 1 +forward 3 +up 7 +forward 3 +forward 6 +up 6 +up 3 +forward 9 +forward 5 +down 2 +up 4 +up 3 +forward 3 +forward 7 +down 1 +forward 5 +forward 5 +down 1 +forward 4 +forward 2 +down 1 +down 9 +down 7 +up 1 +forward 2 +down 2 +forward 3 +forward 8 +forward 4 +forward 6 +down 4 +down 1 +forward 5 +forward 1 +forward 7 +down 8 +forward 9 +down 6 +forward 3 +up 5 +up 1 +up 7 +down 5 +forward 7 +forward 5 +forward 5 +up 1 +forward 8 +down 8 +down 7 +forward 9 +forward 9 +down 3 +forward 7 +forward 2 +down 1 +down 6 +down 1 +forward 7 +down 3 +forward 1 +forward 1 +forward 6 +forward 6 +up 9 +down 3 +forward 9 +down 8 +forward 4 +up 6 +down 4 +down 7 +forward 5 +up 3 +forward 1 +forward 8 +up 6 +up 3 +down 2 +forward 2 +forward 5 +forward 1 +down 8 +down 8 +down 3 +forward 5 +forward 4 +forward 4 +forward 5 +up 5 +forward 2 +forward 5 +up 5 +forward 6 +forward 6 +forward 9 +up 5 +forward 4 +up 4 +forward 8 +down 8 +forward 5 +forward 2 +forward 4 +forward 3 +forward 1 +down 1 +down 9 +down 2 +forward 4 +down 3 +down 6 +forward 2 +up 7 +forward 6 +down 4 +up 9 +down 1 +forward 8 +forward 1 +forward 1 +down 9 +down 3 +down 2 +down 7 +up 5 +down 7 +up 9 +down 8 +down 7 +forward 9 +forward 7 +up 4 +forward 5 +up 9 +down 4 +forward 1 +forward 9 +down 7 +up 9 +forward 6 +forward 4 +up 8 +down 2 +forward 1 +up 6 +up 5 +down 4 +forward 8 +down 3 +down 5 +down 6 +up 1 +up 9 +up 7 +up 5 +forward 1 +forward 3 +down 7 +forward 9 +forward 2 +forward 6 +down 4 +down 7 +forward 3 +down 1 +up 5 +forward 3 +down 3 +down 1 +forward 1 +forward 4 +forward 8 +down 4 +down 1 +forward 3 +down 7 +up 9 +down 8 +down 1 +forward 2 +down 6 +down 9 +down 9 +forward 2 +forward 8 +up 2 +down 5 +down 9 +forward 1 +up 9 +down 7 +forward 8 +down 7 +up 4 +forward 8 +down 8 +down 7 +forward 6 +up 7 +down 4 +down 9 +forward 9 +up 8 +down 8 +down 8 +down 8 +down 5 +forward 2 +up 9 +down 2 +up 7 +down 7 +down 3 +down 6 +forward 9 +forward 1 +down 1 +down 5 +up 4 +down 5 +forward 5 +up 2 +forward 5 +down 5 +forward 1 +forward 9 +down 9 +forward 3 +forward 3 +down 8 +down 2 +down 8 +forward 8 +forward 7 +up 6 +down 4 +down 5 +forward 8 +forward 4 +forward 7 +forward 1 +down 9 +down 4 +down 2 +forward 5 +down 3 +down 7 +down 5 +forward 8 +up 1 +down 4 +down 7 +down 7 +forward 2 +up 5 +forward 5 +up 2 +up 4 +down 9 +forward 7 +forward 6 +forward 6 +down 2 +forward 7 +forward 7 +down 7 +forward 8 +down 2 +up 9 +down 1 +forward 9 +down 9 +forward 3 +down 9 +down 2 +forward 9 +forward 8 +down 7 +up 2 +forward 8 +forward 1 +up 2 +down 7 +up 7 +down 8 +up 1 +up 4 +up 2 +up 3 +down 7 +forward 1 +down 8 +down 4 +down 2 +down 4 +up 8 +forward 8 +down 2 +up 5 +up 4 +forward 7 +up 1 +forward 3 +down 8 +down 4 +forward 4 +down 8 +forward 2 +down 1 +up 9 +forward 9 +down 4 +up 2 +down 8 +up 9 +forward 6 +down 7 +up 7 +forward 9 +forward 1 +down 8 +forward 5 +down 9 +forward 6 +down 9 +forward 9 +forward 1 +down 8 +up 4 +forward 9 +forward 3 +down 9 +up 8 +forward 4 +up 8 +forward 7 +down 7 +up 6 +down 7 +down 2 +down 7 +forward 3 +forward 2 +down 6 +down 2 +down 7 +up 4 +forward 5 +down 5 +forward 2 +up 3 +up 8 +forward 8 +forward 1 +forward 7 +down 7 +down 2 +forward 1 +down 7 +down 7 +up 2 +up 7 +up 7 +forward 4 +down 5 +forward 5 +forward 7 +forward 7 +down 7 +down 8 +forward 8 +forward 8 +up 3 +up 9 +forward 2 +down 7 +up 3 +up 1 +up 1 +down 9 +up 5 +down 6 +up 8 +up 3 +up 5 +forward 7 +forward 3 +forward 8 +forward 4 +up 1 +forward 2 +forward 1 +up 5 +forward 9 +forward 8 +down 7 +up 1 +forward 7 +down 8 +forward 1 +forward 9 +forward 9 +forward 9 +forward 8 +down 1 +forward 8 +forward 7 +up 9 +up 3 +forward 8 +forward 2 +up 2 +down 7 +down 6 +forward 4 +forward 3 +forward 6 +up 7 +down 9 +forward 1 +forward 4 +down 1 +forward 4 +up 3 +down 8 +forward 1 +up 6 +forward 8 +forward 2 +forward 1 +forward 8 +forward 4 +down 7 +forward 4 +forward 6 +down 2 +up 4 +forward 4 +forward 3 +down 5 +forward 8 +forward 4 +forward 5 +forward 7 +forward 6 +forward 5 +forward 9 +down 4 +down 9 +forward 6 +up 7 +down 6 +down 3 +down 2 +up 9 +forward 7 +down 4 +down 5 +forward 2 +forward 3 +forward 2 +forward 9 +forward 7 +forward 8 +down 9 +down 7 +down 9 +down 7 +forward 5 +forward 2 +down 5 +forward 6 +down 1 +down 2 +down 6 +forward 9 +down 3 +up 6 +down 4 +down 5 +forward 3 +forward 7 +down 8 +forward 2 +forward 5 +down 9 +down 3 +up 5 +down 6 +forward 6 +up 3 +down 6 +down 1 +down 8 +down 5 +down 3 +forward 3 +up 6 +up 7 +forward 8 +forward 9 +forward 2 +forward 6 +forward 2 +forward 3 +down 7 +down 3 +down 3 +down 6 +down 2 +forward 4 +forward 3 +forward 8 +up 1 +down 9 +forward 5 +up 3 +down 7 +down 6 +forward 8 +forward 1 +up 6 +forward 3 +forward 1 +up 9 +forward 6 +forward 3 +down 9 +down 4 +down 9 +forward 5 +down 8 +down 3 +forward 1 +forward 1 +down 9 +down 6 +down 3 +up 7 +down 3 +forward 5 +down 2 +forward 7 +forward 2 +forward 5 +up 7 +forward 4 +forward 4 +up 3 +down 6 +down 7 +up 1 +down 6 +forward 1 +forward 9 +down 7 +down 8 +forward 5 +down 1 +down 9 +up 5 +up 4 +up 3 +forward 6 +down 6 +forward 4 +forward 8 +up 6 +up 2 +down 9 +forward 2 +forward 5 +forward 1 +forward 3 +forward 9 +up 3 +forward 2 +forward 1 +forward 3 +forward 3 +up 9 +forward 3 +forward 7 +down 6 +forward 2 +down 8 +up 9 +forward 8 +forward 5 +forward 2 +up 8 +down 9 +up 5 +forward 3 +down 4 +forward 1 +up 9 +down 4 +down 5 +up 4 +down 6 +down 4 +down 6 +down 4 +forward 4 +down 2 +down 1 +down 6 +forward 2 +down 1 +down 3 +forward 4 +down 3 +down 5 +down 5 +up 1 +up 4 +down 4 +down 4 +down 5 +down 4 +down 5 +forward 5 +down 8 +down 5 +down 5 +down 9 +up 1 +up 5 +forward 5 +down 1 +down 9 +down 4 +down 3 +forward 3 +down 2 +forward 9 +down 3 +forward 1 +down 9 +down 5 +up 7 +forward 3 +forward 1 +forward 2 +down 5 +forward 8 +down 3 +down 3 +forward 6 +down 8 +down 3 +down 8 +up 9 +forward 3 +down 6 +forward 4 +down 6 +down 4 +up 5 +forward 1 +up 6 +up 2 +forward 2 +down 8 +forward 7 +forward 8 +down 6 +down 7 +forward 7 +up 3 +forward 3 +up 6 +forward 3 +down 1 +down 7 +forward 9 +forward 5 +up 1 +forward 7 +forward 1 +down 3 +forward 1 +up 4 +up 2 +up 1 +down 8 +forward 9 +forward 3 +forward 4 +up 7 +forward 5 +down 1 +down 8 +down 3 +down 4 +down 6 +down 5 +forward 4 +down 4 +down 2 +down 4 +down 3 +down 3 +forward 4 +up 3 +forward 6 +down 7 +forward 4 +up 2 +down 7 +forward 8 +up 9 +forward 6 +forward 8 +down 1 +down 6 +forward 6 +down 6 +down 9 +up 8 +forward 8 +up 5 +forward 6 +forward 9 +forward 4 +up 2 +forward 3 +down 7 +down 8 +down 4 +up 8 +forward 8 +forward 1 +up 5 +up 4 +up 1 +down 9 +down 9 +up 2 +forward 9 +down 7 +down 2 +up 2 +down 1 +forward 6 +forward 2 +down 5 +down 8 +forward 6 +down 2 +down 3 +forward 6 +forward 7 +up 8 +down 4 +forward 5 +down 9 +down 2 +down 7 +down 9 +down 5 +forward 9 +forward 2 +down 6 +forward 7 +up 6 +forward 3 +up 2 +forward 9 +forward 2 diff --git a/src/bin/day_1.rs b/src/bin/day_1.rs index ca2e242..62ab045 100644 --- a/src/bin/day_1.rs +++ b/src/bin/day_1.rs @@ -1,5 +1,9 @@ -use aoc2021::parsers; -use nom::{character::complete::line_ending, combinator::map, multi::separated_list1, IResult}; +use nom::{ + character::complete::{line_ending, u64 as nom_u64}, + combinator::map, + multi::separated_list1, + IResult, +}; use std::fs; fn main() -> Result<(), Box> { @@ -39,7 +43,7 @@ fn parse_sonar_scan(input: &str) -> IResult<&str, Vec> { } fn parse_depth(input: &str) -> IResult<&str, Depth> { - map(parsers::u64, Depth)(input) + map(nom_u64, Depth)(input) } #[derive(Default, Debug)] diff --git a/src/bin/day_2.rs b/src/bin/day_2.rs new file mode 100644 index 0000000..08d01c3 --- /dev/null +++ b/src/bin/day_2.rs @@ -0,0 +1,100 @@ +use nom::{ + branch::alt, + bytes::complete::tag, + character::complete::{i64 as nom_i64, line_ending, space1}, + combinator::{map, value}, + multi::separated_list1, + sequence::tuple, + IResult, +}; +use std::fs; + +fn main() -> Result<(), Box> { + let input = fs::read_to_string("inputs/day_2.txt")?; + let route = parse_route(&input).unwrap().1; + + let mut position = Position::default(); + for instruction in &route { + position.advance(&instruction); + } + dbg!(position.horizontal.0 * position.depth.0); + + Ok(()) +} + +#[derive(Debug)] +struct Route(Vec); + +impl<'a> IntoIterator for &'a Route { + type Item = &'a Instruction; + type IntoIter = std::slice::Iter<'a, Instruction>; + fn into_iter(self) -> ::IntoIter { + self.0.iter() + } +} + +#[derive(Debug)] +struct Instruction { + direction: Direction, + distance: Distance, +} + +#[derive(Debug, Clone)] +enum Direction { + Forward, + Up, + Down, +} +#[derive( + Default, + Debug, + Clone, + Copy, + derive_more::Add, + derive_more::AddAssign, + derive_more::Sub, + derive_more::SubAssign, +)] +struct Distance(i64); + +#[derive(Default, Debug)] +struct Position { + horizontal: Distance, + depth: Distance, +} + +impl Position { + fn advance(&mut self, instruction: &Instruction) { + match instruction.direction { + Direction::Forward => self.horizontal += instruction.distance, + Direction::Down => self.depth += instruction.distance, + Direction::Up => self.depth -= instruction.distance, + } + } +} + +fn parse_route(input: &str) -> IResult<&str, Route> { + map(separated_list1(line_ending, parse_instruction), Route)(input) +} + +fn parse_instruction(input: &str) -> IResult<&str, Instruction> { + map( + tuple((parse_direction, space1, parse_distance)), + |(direction, _, distance)| Instruction { + direction, + distance, + }, + )(input) +} + +fn parse_direction(input: &str) -> IResult<&str, Direction> { + alt(( + value(Direction::Forward, tag("forward")), + value(Direction::Up, tag("up")), + value(Direction::Down, tag("down")), + ))(input) +} + +fn parse_distance(input: &str) -> IResult<&str, Distance> { + map(nom_i64, Distance)(input) +} diff --git a/src/bin/day_2_part_2.rs b/src/bin/day_2_part_2.rs new file mode 100644 index 0000000..de5b334 --- /dev/null +++ b/src/bin/day_2_part_2.rs @@ -0,0 +1,124 @@ +use nom::{ + branch::alt, + bytes::complete::tag, + character::complete::{i64 as nom_i64, line_ending, space1}, + combinator::map, + multi::separated_list1, + sequence::tuple, + IResult, +}; +use std::fs; + +fn main() -> Result<(), Box> { + let input = fs::read_to_string("inputs/day_2.txt")?; + let route = parse_route(&input).unwrap().1; + + let mut position = Position::default(); + for instruction in &route { + position.advance(&instruction); + } + dbg!(position.horizontal.0 * position.depth.0); + + Ok(()) +} + +#[derive(Debug)] +struct Route(Vec); + +impl<'a> IntoIterator for &'a Route { + type Item = &'a Instruction; + type IntoIter = std::slice::Iter<'a, Instruction>; + fn into_iter(self) -> ::IntoIter { + self.0.iter() + } +} + +#[derive(Debug)] +enum Instruction { + Forward(Distance), + Up(Aim), + Down(Aim), +} + +#[derive( + Default, + Debug, + Clone, + Copy, + derive_more::Add, + derive_more::AddAssign, + derive_more::Sub, + derive_more::SubAssign, +)] +struct Distance(i64); +#[derive( + Default, + Debug, + Clone, + Copy, + derive_more::Add, + derive_more::AddAssign, + derive_more::Sub, + derive_more::SubAssign, +)] +struct Aim(i64); + +impl std::ops::Mul for Aim { + type Output = Distance; + fn mul(self, other: Distance) -> Distance { + Distance(self.0 * other.0) + } +} + +#[derive(Default, Debug)] +struct Position { + horizontal: Distance, + depth: Distance, + aim: Aim, +} + +impl Position { + fn advance(&mut self, instruction: &Instruction) { + match instruction { + Instruction::Forward(distance) => { + self.horizontal += *distance; + self.depth += self.aim * *distance; + } + Instruction::Down(aim) => self.aim += *aim, + Instruction::Up(aim) => self.aim -= *aim, + } + } +} + +fn parse_route(input: &str) -> IResult<&str, Route> { + map(separated_list1(line_ending, parse_instruction), Route)(input) +} + +fn parse_instruction(input: &str) -> IResult<&str, Instruction> { + alt((parse_forward, parse_up, parse_down))(input) +} + +fn parse_forward(input: &str) -> IResult<&str, Instruction> { + map( + tuple((tag("forward"), space1, parse_distance)), + |(_, _, distance)| Instruction::Forward(distance), + )(input) +} +fn parse_up(input: &str) -> IResult<&str, Instruction> { + map(tuple((tag("up"), space1, parse_aim)), |(_, _, aim)| { + Instruction::Up(aim) + })(input) +} +fn parse_down(input: &str) -> IResult<&str, Instruction> { + map(tuple((tag("down"), space1, parse_aim)), |(_, _, aim)| { + Instruction::Down(aim) + })(input) +} + +fn parse_distance(input: &str) -> IResult<&str, Distance> { + map(nom_i64, Distance)(input) +} + +fn parse_aim(input: &str) -> IResult<&str, Aim> { + map(nom_i64, Aim)(input) +} diff --git a/src/parsers.rs b/src/parsers.rs index 7e8ecc9..8b13789 100644 --- a/src/parsers.rs +++ b/src/parsers.rs @@ -1,18 +1 @@ -use nom::{character::complete::digit1, combinator::map_res, IResult}; -use std::str::FromStr; -pub fn u64(input: &str) -> IResult<&str, u64> { - map_res(digit1, u64::from_str)(input) -} - -pub fn i64(input: &str) -> IResult<&str, i64> { - map_res(digit1, i64::from_str)(input) -} - -pub fn u32(input: &str) -> IResult<&str, u32> { - map_res(digit1, u32::from_str)(input) -} - -pub fn i32(input: &str) -> IResult<&str, i32> { - map_res(digit1, i32::from_str)(input) -} -- cgit v1.2.3