From afb41b247fcc23509d63b5795dfb8c85a317c6f1 Mon Sep 17 00:00:00 2001 From: Toby Vincent Date: Thu, 21 Dec 2023 01:18:42 -0600 Subject: perf(wip): attempt to improve day 18 --- src/day_18.rs | 45 ++++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/day_18.rs b/src/day_18.rs index 1ed5100..aa2bdf1 100644 --- a/src/day_18.rs +++ b/src/day_18.rs @@ -71,15 +71,15 @@ impl Solution for Day18 { } fn part_2(input: &str) -> anyhow::Result { - let mut pos = (0_isize, 0_isize); - let mut trenches = vec![(pos, 'S')]; + let mut trenches = vec![]; + let mut pos = (0_isize, 0_isize); + let mut dir = 'D'; let mut b = 0; - let mut dir = 'S'; for line in input.lines() { let (c, len) = parse_code(line); - b += len; + b += len as usize; if "DU".contains(c) && dir != c { dir = c; @@ -88,17 +88,28 @@ impl Solution for Day18 { } } - for _ in 0..len { - match c { - 'U' => pos.0 -= 1, - 'D' => pos.0 += 1, - 'L' => pos.1 -= 1, - 'R' => pos.1 += 1, - c => return Err(anyhow::format_err!("Invalid character: {c}")), - }; - - trenches.push((pos, dir)); - } + // for _ in 0..len { + // match c { + // 'U' => pos.0 -= 1, + // 'D' => pos.0 += 1, + // 'L' => pos.1 -= 1, + // 'R' => pos.1 += 1, + // c => return Err(anyhow::format_err!("Invalid character: {c}")), + // }; + // + // trenches.push((pos, dir)); + // } + trenches.push(((pos.0, pos.1), dir)); + + match c { + 'U' => (1..len).for_each(|n| trenches.push(((pos.0 - n, pos.1), dir))), + 'D' => (1..len).for_each(|n| trenches.push(((pos.0 + n, pos.1), dir))), + 'L' => trenches.push(((pos.0, pos.1 - len), dir)), + 'R' => trenches.push(((pos.0, pos.1 + len), dir)), + c => return Err(anyhow::format_err!("Invalid character: {c}")), + }; + + pos = *trenches.last().map(|(p, _)| p).unwrap(); } trenches.sort(); @@ -122,7 +133,7 @@ impl Solution for Day18 { } } -fn parse_code(s: &str) -> (char, usize) { +fn parse_code(s: &str) -> (char, isize) { let iter = &mut s .split_whitespace() .nth(2) @@ -132,7 +143,7 @@ fn parse_code(s: &str) -> (char, usize) { .strip_suffix(')') .unwrap() .chars(); - let dist = usize::from_str_radix(&iter.take(5).collect::(), 16).unwrap(); + let dist = isize::from_str_radix(&iter.take(5).collect::(), 16).unwrap(); let code = iter.next().unwrap().to_digit(10).unwrap(); let c = match code { 0 => 'R', -- cgit v1.2.3-70-g09d2