From 5c4e9a9e9d6442c9ead55d0be573ef1c4caa0ee7 Mon Sep 17 00:00:00 2001 From: Johannes Date: Thu, 25 May 2023 23:01:57 +0200 Subject: [PATCH] Day 17 parsing --- input/day17.txt | 8 +++++ src/main.rs | 3 +- src/tasks/day17.rs | 74 ++++++++++++++++++++++++++++++++++++++++++++++ src/tasks/mod.rs | 1 + 4 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 input/day17.txt create mode 100644 src/tasks/day17.rs diff --git a/input/day17.txt b/input/day17.txt new file mode 100644 index 0000000..293b5af --- /dev/null +++ b/input/day17.txt @@ -0,0 +1,8 @@ +x=495, y=2..7 +y=7, x=495..501 +x=501, y=3..7 +x=498, y=2..4 +x=506, y=1..2 +x=498, y=10..13 +x=504, y=10..13 +y=13, x=498..504 diff --git a/src/main.rs b/src/main.rs index 3ffc2c2..0d0825e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,3 @@ fn main() { - // aoc_2018::tasks::day24::task1(); - aoc_2018::tasks::day23::task2(); + aoc_2018::tasks::day17::task1(); } diff --git a/src/tasks/day17.rs b/src/tasks/day17.rs new file mode 100644 index 0000000..d593fb4 --- /dev/null +++ b/src/tasks/day17.rs @@ -0,0 +1,74 @@ +use itertools::Itertools; +use regex::Regex; + +use crate::utils; +use std::collections::{HashMap, HashSet}; + +fn horizontal(line: &str) -> Option<(i32, i32, i32)> { + let regex = Regex::new(r"y=(?P\d+), x=(?P\d+)..(?P\d+)").unwrap(); + regex.captures(line).map(|m| { + ( + m.name("y").unwrap().as_str().parse::().unwrap(), + m.name("x1").unwrap().as_str().parse::().unwrap(), + m.name("x2").unwrap().as_str().parse::().unwrap(), + ) + }) +} + +fn vertical(line: &str) -> Option<(i32, i32, i32)> { + let regex = Regex::new(r"x=(?P\d+), y=(?P\d+)..(?P\d+)").unwrap(); + regex.captures(line).map(|m| { + ( + m.name("y").unwrap().as_str().parse::().unwrap(), + m.name("x1").unwrap().as_str().parse::().unwrap(), + m.name("x2").unwrap().as_str().parse::().unwrap(), + ) + }) +} +pub fn task1() { + let input = utils::read_file("input/day17.txt"); + let clay_tiles: HashSet = input.lines().fold(HashSet::new(), |mut tiles, line| { + if let Some((x, y1, y2)) = vertical(line) { + for y in y1..=y2 { + tiles.insert(Pos(x, y)); + } + } + if let Some((y, x1, x2)) = horizontal(line) { + for x in x1..=x2 { + tiles.insert(Pos(x, y)); + } + } + tiles + }); + let (x_min, x_max) = clay_tiles + .iter() + .map(|p| p.0) + .minmax() + .into_option() + .unwrap(); + let (y_min, y_max) = clay_tiles + .iter() + .map(|p| p.1) + .minmax() + .into_option() + .unwrap(); + + dbg!(x_min); + dbg!(x_max); + dbg!(y_min); + dbg!(y_max); +} + +#[derive(PartialEq, Eq, Hash)] +struct Pos(i32, i32); + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn part1() { + assert_eq!(horizontal("y=10, x=5..20"), Some((10, 5, 20))); + assert_eq!(vertical("x=10, y=5..20"), Some((10, 5, 20))); + } +} diff --git a/src/tasks/mod.rs b/src/tasks/mod.rs index f4df0bd..fc77a7e 100644 --- a/src/tasks/mod.rs +++ b/src/tasks/mod.rs @@ -13,6 +13,7 @@ pub mod day12; pub mod day13; pub mod day14; pub mod day15; +pub mod day17; pub mod day20; pub mod day22; pub mod day23;