diff --git a/2021/rust/Cargo.lock b/2021/rust/Cargo.lock index b21cc6a..85b8dd2 100644 --- a/2021/rust/Cargo.lock +++ b/2021/rust/Cargo.lock @@ -2,6 +2,41 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "aho-corasick" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +dependencies = [ + "memchr", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "regex" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" + [[package]] name = "rust" version = "0.1.0" +dependencies = [ + "regex", +] diff --git a/2021/rust/Cargo.toml b/2021/rust/Cargo.toml index 1ec6963..4cf2c0f 100644 --- a/2021/rust/Cargo.toml +++ b/2021/rust/Cargo.toml @@ -6,3 +6,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +regex = "1" diff --git a/2021/rust/inputs/day02.txt b/2021/rust/inputs/day02.txt new file mode 100644 index 0000000..171b7da --- /dev/null +++ b/2021/rust/inputs/day02.txt @@ -0,0 +1,1000 @@ +forward 6 +down 8 +down 5 +down 9 +forward 2 +down 5 +down 5 +forward 1 +forward 7 +down 8 +up 2 +down 4 +up 8 +down 8 +forward 3 +forward 4 +down 1 +forward 5 +up 7 +down 7 +down 8 +forward 2 +up 3 +forward 1 +forward 6 +forward 9 +forward 7 +forward 8 +forward 2 +forward 3 +up 2 +up 8 +down 1 +forward 7 +down 7 +down 2 +forward 6 +down 1 +forward 5 +down 3 +forward 6 +down 7 +up 1 +up 3 +forward 7 +forward 6 +forward 8 +down 4 +down 2 +up 5 +down 2 +forward 2 +up 5 +forward 6 +down 3 +down 1 +down 5 +forward 6 +up 6 +down 7 +down 8 +down 2 +forward 3 +down 5 +down 4 +forward 7 +forward 9 +up 9 +up 8 +up 4 +forward 8 +forward 5 +down 4 +up 2 +forward 9 +up 5 +down 5 +up 9 +forward 2 +forward 3 +down 6 +down 8 +forward 8 +up 5 +down 5 +forward 7 +forward 6 +forward 8 +up 3 +forward 3 +forward 1 +up 8 +down 8 +down 2 +down 4 +up 7 +up 2 +up 9 +up 4 +forward 6 +down 8 +down 1 +forward 6 +forward 6 +down 4 +down 2 +up 7 +down 9 +down 9 +up 2 +up 7 +down 4 +down 2 +forward 1 +down 1 +up 5 +up 5 +forward 9 +up 3 +down 7 +forward 7 +down 4 +down 8 +up 1 +down 4 +down 7 +forward 5 +up 9 +forward 5 +forward 1 +forward 8 +forward 6 +forward 5 +forward 1 +down 4 +down 6 +forward 5 +forward 2 +forward 3 +down 1 +up 2 +up 9 +forward 4 +up 8 +down 7 +down 8 +up 7 +down 2 +forward 7 +up 1 +forward 5 +forward 1 +forward 8 +forward 1 +up 8 +down 6 +down 7 +forward 2 +down 8 +down 8 +forward 8 +up 8 +down 6 +down 7 +down 4 +down 7 +forward 6 +up 3 +forward 3 +down 2 +down 8 +down 3 +down 9 +forward 9 +forward 7 +down 6 +down 4 +forward 6 +down 2 +down 7 +up 7 +up 8 +forward 2 +forward 8 +down 3 +up 2 +forward 9 +down 2 +up 3 +down 1 +down 1 +down 4 +down 8 +up 2 +up 8 +forward 2 +forward 1 +up 1 +forward 7 +down 8 +down 1 +down 7 +up 3 +down 3 +forward 8 +forward 2 +forward 7 +down 2 +up 9 +up 3 +up 5 +down 4 +up 3 +forward 4 +up 5 +down 9 +down 9 +forward 2 +forward 2 +down 2 +down 8 +down 3 +down 5 +forward 6 +down 6 +up 5 +down 2 +down 4 +down 9 +down 3 +forward 7 +down 1 +forward 1 +down 4 +up 1 +down 9 +forward 5 +up 2 +down 3 +forward 8 +forward 9 +up 9 +down 2 +forward 8 +down 4 +down 5 +forward 6 +forward 5 +forward 4 +down 6 +down 9 +down 2 +forward 9 +down 4 +up 8 +up 9 +up 2 +up 5 +up 5 +forward 9 +up 1 +forward 6 +forward 7 +forward 8 +forward 9 +up 2 +forward 3 +forward 4 +forward 6 +forward 9 +up 5 +up 5 +down 3 +forward 1 +forward 3 +forward 2 +forward 3 +forward 6 +forward 7 +down 4 +down 2 +down 1 +forward 2 +down 5 +forward 3 +forward 6 +down 8 +down 9 +forward 4 +forward 6 +down 6 +down 6 +forward 3 +down 6 +down 8 +down 1 +forward 7 +forward 9 +down 2 +down 5 +forward 1 +forward 3 +down 2 +forward 1 +down 8 +down 1 +forward 4 +down 8 +forward 5 +forward 1 +down 7 +down 7 +forward 3 +forward 1 +forward 6 +forward 7 +forward 5 +up 1 +forward 2 +down 9 +forward 3 +up 1 +forward 2 +down 1 +down 6 +down 3 +forward 7 +down 5 +down 4 +down 1 +forward 9 +forward 9 +down 5 +forward 7 +forward 3 +forward 5 +down 1 +forward 6 +down 8 +up 2 +forward 6 +down 3 +forward 2 +forward 9 +forward 4 +down 1 +down 3 +forward 9 +forward 3 +forward 8 +forward 9 +up 3 +up 1 +forward 1 +forward 2 +down 8 +down 9 +down 2 +down 1 +down 3 +down 2 +forward 9 +forward 7 +down 5 +forward 1 +forward 6 +forward 3 +forward 9 +down 2 +forward 8 +down 5 +down 1 +forward 5 +forward 3 +down 6 +forward 6 +down 8 +forward 2 +up 5 +forward 1 +down 2 +down 6 +forward 9 +forward 7 +down 1 +down 3 +down 6 +up 3 +down 4 +forward 8 +forward 1 +forward 7 +down 2 +down 5 +down 9 +forward 6 +down 5 +forward 5 +up 1 +down 5 +forward 8 +up 9 +forward 2 +down 6 +forward 2 +forward 7 +up 2 +down 9 +down 7 +up 7 +down 6 +up 5 +forward 1 +down 8 +forward 8 +forward 1 +forward 7 +down 9 +down 6 +forward 3 +down 6 +down 1 +down 1 +down 1 +down 3 +down 7 +down 7 +down 3 +down 5 +forward 4 +down 4 +forward 7 +forward 5 +down 9 +down 9 +forward 7 +down 3 +down 9 +down 4 +forward 3 +down 7 +down 2 +forward 2 +down 6 +forward 9 +forward 9 +forward 5 +up 4 +down 7 +down 2 +up 9 +up 4 +forward 8 +forward 1 +down 8 +up 5 +down 4 +down 3 +forward 2 +down 7 +down 2 +down 1 +down 9 +forward 7 +forward 7 +up 8 +up 4 +down 3 +down 8 +forward 6 +forward 5 +forward 5 +forward 5 +down 3 +down 8 +forward 4 +forward 7 +forward 1 +up 3 +up 9 +down 6 +up 4 +down 7 +forward 8 +forward 4 +forward 3 +up 8 +up 3 +down 3 +forward 6 +down 2 +forward 7 +forward 4 +forward 8 +down 3 +down 9 +down 9 +down 2 +forward 8 +up 4 +down 3 +forward 8 +forward 5 +forward 7 +down 6 +up 9 +forward 3 +down 2 +forward 5 +forward 2 +down 7 +forward 6 +forward 2 +up 9 +down 1 +down 1 +forward 4 +up 1 +forward 9 +down 3 +down 4 +down 2 +forward 3 +forward 3 +forward 3 +up 7 +up 8 +down 5 +forward 1 +forward 7 +up 9 +up 3 +down 3 +down 8 +forward 6 +up 5 +up 5 +forward 4 +down 2 +down 8 +down 1 +forward 6 +down 3 +forward 3 +forward 6 +forward 1 +up 3 +up 1 +down 5 +down 2 +down 7 +down 1 +forward 9 +down 4 +down 8 +forward 9 +forward 7 +forward 8 +down 1 +down 2 +up 7 +down 5 +down 2 +down 1 +up 4 +up 8 +up 7 +down 4 +forward 3 +down 2 +down 2 +forward 5 +forward 4 +down 8 +up 4 +forward 4 +up 1 +down 3 +down 9 +down 9 +down 3 +up 8 +forward 1 +forward 6 +down 6 +down 2 +forward 8 +down 3 +forward 8 +forward 2 +forward 9 +up 3 +forward 6 +down 5 +forward 6 +forward 2 +up 7 +down 9 +forward 2 +up 2 +forward 7 +down 1 +down 5 +down 6 +forward 8 +down 6 +forward 4 +forward 1 +forward 3 +forward 4 +up 4 +forward 4 +down 4 +forward 2 +forward 5 +forward 2 +forward 5 +down 9 +up 2 +up 1 +down 2 +up 4 +up 5 +forward 2 +down 3 +down 9 +forward 3 +down 8 +down 9 +forward 5 +down 3 +forward 5 +down 3 +up 8 +forward 7 +forward 1 +down 2 +down 7 +forward 3 +down 8 +forward 9 +down 4 +down 1 +down 7 +down 4 +up 5 +forward 1 +down 4 +forward 1 +forward 8 +up 1 +up 5 +up 2 +up 2 +down 4 +down 7 +forward 2 +down 8 +up 8 +down 9 +down 3 +down 6 +down 3 +down 1 +forward 7 +up 8 +forward 5 +up 5 +down 8 +down 1 +down 8 +down 6 +down 5 +forward 2 +up 5 +down 6 +forward 9 +up 6 +down 5 +down 7 +up 9 +down 1 +forward 4 +up 6 +forward 2 +down 5 +down 5 +forward 2 +up 6 +forward 1 +down 8 +forward 4 +up 8 +down 3 +forward 8 +down 8 +forward 5 +down 6 +down 3 +forward 1 +down 4 +down 8 +up 1 +down 1 +down 2 +up 9 +forward 2 +forward 3 +down 7 +down 2 +forward 7 +up 8 +down 2 +down 8 +down 9 +up 1 +down 5 +down 5 +down 4 +down 8 +down 9 +up 5 +forward 2 +down 4 +down 3 +down 2 +forward 5 +forward 8 +down 8 +down 1 +forward 9 +down 5 +forward 5 +down 2 +up 3 +up 9 +down 1 +down 9 +forward 7 +up 7 +forward 3 +up 6 +forward 8 +down 2 +down 1 +down 7 +forward 5 +down 8 +down 4 +forward 7 +forward 4 +down 6 +forward 9 +down 3 +forward 2 +down 3 +down 1 +down 1 +up 1 +up 3 +down 6 +forward 3 +up 9 +down 4 +up 2 +down 3 +up 1 +down 8 +down 5 +forward 7 +forward 2 +forward 9 +down 8 +down 5 +down 6 +up 3 +forward 2 +up 8 +down 4 +forward 7 +down 8 +down 6 +down 4 +forward 7 +up 9 +down 4 +forward 2 +forward 5 +down 3 +up 6 +up 6 +down 2 +down 4 +forward 8 +forward 5 +forward 3 +forward 5 +down 5 +down 5 +down 6 +forward 3 +forward 7 +forward 1 +down 8 +down 5 +forward 7 +up 7 +down 9 +down 9 +down 9 +up 6 +down 2 +down 3 +forward 1 +up 7 +up 8 +forward 5 +down 1 +down 3 +down 3 +forward 5 +down 7 +down 1 +up 2 +down 2 +down 3 +forward 7 +down 9 +forward 6 +down 5 +forward 2 +down 5 +forward 6 +up 3 +down 8 +up 2 +forward 5 +forward 1 +forward 5 +forward 8 +forward 6 +forward 9 +forward 6 +up 6 +up 5 +down 8 +down 3 +down 5 +down 2 +forward 9 +forward 8 +down 1 +up 1 +up 6 +down 6 +forward 4 +down 3 +forward 6 +forward 1 +up 5 +down 6 +up 9 +down 7 +down 2 +down 9 +down 5 +forward 5 +up 2 +forward 8 +down 2 +down 8 +forward 6 +down 4 +forward 8 +down 7 +down 8 +down 1 +forward 3 +down 6 +down 9 +down 3 +forward 3 +down 8 +forward 8 +down 7 +forward 6 +forward 8 +down 8 +up 7 +down 1 +forward 2 +forward 3 +down 5 +up 8 +down 3 +down 4 +down 7 +forward 9 +forward 7 +forward 1 +down 3 +forward 9 +down 8 +forward 2 +down 2 +down 9 +down 4 +down 3 +up 6 +up 9 +down 3 +down 2 +forward 5 +down 3 +down 2 +down 8 +forward 6 +forward 5 +up 4 +forward 9 +forward 8 +forward 9 +down 2 +forward 2 +up 6 +forward 1 +down 5 +forward 2 +down 8 +up 2 +up 3 +down 3 +up 2 +up 1 +up 5 +forward 1 +forward 2 +down 8 +up 3 +down 9 +forward 7 +up 5 +down 4 +down 4 +up 3 +forward 2 +up 5 +down 4 +down 4 +up 5 +forward 8 +down 8 +down 6 +forward 7 +down 1 +down 3 +down 1 +forward 3 +down 5 +down 3 +forward 3 +up 2 +forward 2 +down 9 +up 8 +forward 8 +up 8 +forward 1 +forward 9 +forward 3 +down 8 +down 3 +forward 8 +forward 4 +down 2 +forward 2 +down 2 +down 5 +down 7 +down 5 +forward 8 +up 3 +forward 1 +down 1 +forward 3 +down 9 +forward 2 +forward 2 +forward 7 +down 7 +down 2 +forward 9 +up 5 +up 7 +forward 8 +forward 1 +down 7 +down 8 +down 3 +forward 6 diff --git a/2021/rust/inputs/scratch.txt b/2021/rust/inputs/scratch.txt new file mode 100644 index 0000000..b7172ac --- /dev/null +++ b/2021/rust/inputs/scratch.txt @@ -0,0 +1,6 @@ +forward 5 +down 5 +forward 8 +up 3 +down 8 +forward 2 diff --git a/2021/rust/src/main.rs b/2021/rust/src/main.rs index 205b69c..6a78bb8 100644 --- a/2021/rust/src/main.rs +++ b/2021/rust/src/main.rs @@ -3,5 +3,5 @@ mod solutions; fn main() { - solutions::day01::run(); + solutions::day02::run(); } diff --git a/2021/rust/src/solutions/day01.rs b/2021/rust/src/solutions/day01.rs index 22a777e..ec4a7b0 100644 --- a/2021/rust/src/solutions/day01.rs +++ b/2021/rust/src/solutions/day01.rs @@ -1,9 +1,9 @@ use crate::utils; -use crate::utils::Day; +use crate::utils::Source; pub fn run() -> () { - let data = parse_data(utils::read_lines(Day(1))); + let data = parse_data(utils::read_lines(Source::Day(1))); println!("Day 1"); println!("Part 1: {}", solve1(&data)); @@ -40,4 +40,4 @@ fn parse_data(lines: Vec) -> Vec { .map(|x| x.parse()) .collect::, _>>() .expect("Failed to parse int") -} \ No newline at end of file +} diff --git a/2021/rust/src/solutions/day02.rs b/2021/rust/src/solutions/day02.rs new file mode 100644 index 0000000..40d261b --- /dev/null +++ b/2021/rust/src/solutions/day02.rs @@ -0,0 +1,58 @@ +use regex::{Captures, Regex}; +use crate::utils; +use crate::utils::Source; + + +pub fn run() -> () { + let data = parse_data(utils::read_lines(Source::Day(2))); + + println!("Day 2"); + println!("Part 1: {}", solve1(&data)); + println!("Part 2: {}", solve2(&data)); +} + +enum Command { + Forward(i32), + Down(i32), + Up(i32), +} + +fn solve1(lines: &Vec) -> i32 { + let (x, depth) = lines.iter() + .fold((0, 0), |(x, depth), next| match next { + Command::Forward(val) => (x + val, depth), + Command::Down(val) => (x, depth + val), + Command::Up(val) => (x, depth - val), + }); + x * depth +} + +fn solve2(lines: &Vec) -> i32 { + let (x, depth, aim) = lines.iter() + .fold((0, 0, 0), |(x, depth, aim), next| match next { + Command::Forward(val) => (x + val, depth + (aim * val), aim), + Command::Down(val) => (x, depth, aim + val), + Command::Up(val) => (x, depth, aim - val), + }); + x * depth +} + +fn parse_data(lines: Vec) -> Vec { + let re = Regex::new(r"^(\w+) (\d+)$").unwrap(); + + lines.iter() + .map(|line| re.captures(line).unwrap()) + .map(to_command) + .collect::>() +} + +fn to_command(cap: Captures) -> Command { + let left = cap.get(1).unwrap().as_str(); + let right = cap.get(2).unwrap().as_str().parse().unwrap(); + match left { + "forward" => Command::Forward(right), + "up" => Command::Up(right), + "down" => Command::Down(right), + _ => panic!("Unknown command") + } +} diff --git a/2021/rust/src/solutions/mod.rs b/2021/rust/src/solutions/mod.rs index 12b8f18..28326d5 100644 --- a/2021/rust/src/solutions/mod.rs +++ b/2021/rust/src/solutions/mod.rs @@ -1 +1,2 @@ pub mod day01; +pub mod day02; diff --git a/2021/rust/src/utils.rs b/2021/rust/src/utils.rs index a2b4fd9..d1151c9 100644 --- a/2021/rust/src/utils.rs +++ b/2021/rust/src/utils.rs @@ -3,14 +3,18 @@ use std::io::{BufRead, BufReader}; use std::path::Path; -#[repr(transparent)] -pub struct Day(pub i32); +pub enum Source { Scratch, Day(i32) } -pub fn read_lines(day: Day) -> Vec { - assert!(1 <= day.0 && day.0 < 25); - _read_lines(format!("inputs/day{:0>2}.txt", day.0)) - .expect(format!("Failed to load day {}", day.0).as_str()) +pub fn read_lines(source: Source) -> Vec { + let path = match source { + Source::Scratch => "inputs/scratch.txt".to_string(), + Source::Day(day) => { + assert!(1 <= day && day < 25); + format!("inputs/day{:0>2}.txt", day) + } + }; + _read_lines(&path).expect(format!("Failed to load from {}", &path).as_str()) } fn _read_lines

(filename: P) -> std::io::Result>