From de1e4b5b4f3ac8df80a5bc91cd2e905be471049e Mon Sep 17 00:00:00 2001 From: Tyler Hallada Date: Wed, 3 Dec 2025 22:46:02 -0500 Subject: [PATCH] day03: simplify digit parsing and remove invalid character handling Weirdly improves speed of part1 but hurts speed of part2 :shrug: --- README.md | 2 +- src/day03/mod.rs | 28 +++------------------------- 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 5006c27..52b72a8 100644 --- a/README.md +++ b/README.md @@ -34,4 +34,4 @@ Timings are given as: [lower-bound **best-estimate** upper-bound] |-----|--------|--------| | 01 | [101.34 µs **101.95 µs** 102.61 µs] | [105.90 µs **106.40 µs** 106.95 µs] | | 02 | [2.0990 ms **2.1113 ms** 2.1236 ms] | [2.0954 ms **2.1055 ms** 2.1157 ms] | -| 03 | [40.624 µs **40.836 µs** 41.063 µs]] | [165.81 µs **166.73 µs** 167.61 µs] | +| 03 | [38.717 µs **39.002 µs** 39.311 µs] | [175.35 µs **176.59 µs** 177.92 µs] | diff --git a/src/day03/mod.rs b/src/day03/mod.rs index 67bef69..f732048 100644 --- a/src/day03/mod.rs +++ b/src/day03/mod.rs @@ -1,4 +1,4 @@ -use color_eyre::{Result, eyre::eyre}; +use color_eyre::Result; use tracing::{debug, instrument}; pub const INPUT: &str = include_str!("input/input.txt"); @@ -20,20 +20,10 @@ impl Default for Battery { fn largest_output_joltage(input: &str) -> Result { let mut output_joltage: u64 = 0; - for (line_num, line) in input.trim().split('\n').enumerate() { + for line in input.trim().split('\n') { let mut batteries: [Battery; N] = [Battery::default(); N]; let line_len = line.len(); - for (column, c) in line.bytes().enumerate() { - let joltage = (c as char).to_digit(10).ok_or_else(|| { - eyre!( - "Invalid character '{}' at line {}, column {}:\n {}\n {}^", - c as char, - line_num + 1, - column + 1, - line, - " ".repeat(column) - ) - })? as u8; + for (column, joltage) in line.bytes().map(|c| c - b'0').enumerate() { let min = N.saturating_sub(line_len - column); for i in min..N { if joltage > batteries[i].joltage { @@ -70,18 +60,6 @@ mod tests { const TEST_INPUT1: &str = include_str!("input/test1.txt"); - #[test] - fn test_invalid_character_error() { - let input = "1234\n5678\n1234x678\n9012"; - let result = part1(input); - assert!(result.is_err()); - let error_msg = result.unwrap_err().to_string(); - assert_eq!( - error_msg, - "Invalid character 'x' at line 3, column 5:\n 1234x678\n ^" - ); - } - #[test] fn test_part1() { assert_eq!(part1(TEST_INPUT1).unwrap(), 357);