summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Wernick <justin@worthe-it.co.za>2021-12-02 09:19:49 +0200
committerJustin Wernick <justin@worthe-it.co.za>2021-12-02 09:19:49 +0200
commite023b2ad45e8eb624b15a9301a3a96fbb9442e92 (patch)
tree7d13c3f75d008cfe09e943b778712021b1948a7a
parente132e55fee2822f6eeb1e47a69491e69b22bb41f (diff)
Day 2
-rw-r--r--inputs/day_2.txt1000
-rw-r--r--src/bin/day_1.rs10
-rw-r--r--src/bin/day_2.rs100
-rw-r--r--src/bin/day_2_part_2.rs124
-rw-r--r--src/parsers.rs17
5 files changed, 1231 insertions, 20 deletions
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<dyn std::error::Error>> {
@@ -39,7 +43,7 @@ fn parse_sonar_scan(input: &str) -> IResult<&str, Vec<Depth>> {
}
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<dyn std::error::Error>> {
+ 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<Instruction>);
+
+impl<'a> IntoIterator for &'a Route {
+ type Item = &'a Instruction;
+ type IntoIter = std::slice::Iter<'a, Instruction>;
+ fn into_iter(self) -> <Self as IntoIterator>::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<dyn std::error::Error>> {
+ 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<Instruction>);
+
+impl<'a> IntoIterator for &'a Route {
+ type Item = &'a Instruction;
+ type IntoIter = std::slice::Iter<'a, Instruction>;
+ fn into_iter(self) -> <Self as IntoIterator>::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<Distance> 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)
-}