diff options
author | Toby Vincent <tobyv@tobyvin.dev> | 2023-12-21 01:18:42 -0600 |
---|---|---|
committer | Toby Vincent <tobyv@tobyvin.dev> | 2023-12-21 01:18:42 -0600 |
commit | afb41b247fcc23509d63b5795dfb8c85a317c6f1 (patch) | |
tree | 49c3eeff68af10704e9d16b47e480f6ded1e2f32 /src | |
parent | 6f88481aa6242007d1815060388f530be4a13b81 (diff) |
perf(wip): attempt to improve day 18day18
Diffstat (limited to 'src')
-rw-r--r-- | src/day_18.rs | 45 |
1 files changed, 28 insertions, 17 deletions
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<Self::Answer2> { - 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::<String>(), 16).unwrap(); + let dist = isize::from_str_radix(&iter.take(5).collect::<String>(), 16).unwrap(); let code = iter.next().unwrap().to_digit(10).unwrap(); let c = match code { 0 => 'R', |