summaryrefslogtreecommitdiffstats
path: root/src/day_18.rs
diff options
context:
space:
mode:
authorToby Vincent <tobyv@tobyvin.dev>2023-12-21 01:18:42 -0600
committerToby Vincent <tobyv@tobyvin.dev>2023-12-21 01:18:42 -0600
commitafb41b247fcc23509d63b5795dfb8c85a317c6f1 (patch)
tree49c3eeff68af10704e9d16b47e480f6ded1e2f32 /src/day_18.rs
parent6f88481aa6242007d1815060388f530be4a13b81 (diff)
perf(wip): attempt to improve day 18day18
Diffstat (limited to 'src/day_18.rs')
-rw-r--r--src/day_18.rs45
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',