day03: simplify digit parsing and remove invalid character handling
Weirdly improves speed of part1 but hurts speed of part2 🤷
This commit is contained in:
@@ -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] |
|
||||
|
||||
@@ -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<const N: usize>(input: &str) -> Result<u64> {
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user