Rust Day 1 More optimizations

This commit is contained in:
Tobias Berger 2023-12-02 00:15:50 +01:00
parent bfa1b624f8
commit 769f4ea485
Signed by: toby
GPG key ID: 2D05EFAB764D6A88
3 changed files with 29 additions and 17 deletions

11
rust/.cargo/config.toml Normal file
View file

@ -0,0 +1,11 @@
[build]
rustc-wrapper = "/usr/bin/sccache"
[target.x86_64-unknown-linux-gnu]
linker = "clang"
rustflags = [
"-C",
"link-arg=-fuse-ld=/usr/bin/mold",
"-C",
"target-cpu=native",
] # , "-Z", "threads=16"

View file

@ -1,6 +1,7 @@
[package]
name = "advent-of-code"
version = "23.1.2"
edition = "2021"
[profile.release]
strip = "symbols"

View file

@ -1,42 +1,42 @@
use std::cmp::Reverse;
const DIGIT_PATTERNS: [&str; 10] = [
"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
const DIGIT_PATTERNS: [(char, &str); 10] = [
('0', "zero"),
('1', "one"),
('2', "two"),
('3', "three"),
('4', "four"),
('5', "five"),
('6', "six"),
('7', "seven"),
('8', "eight"),
('9', "nine"),
];
#[cfg_attr(test, derive(Debug))]
struct DigitIndices {
digit: usize,
digit: u8,
first_index: usize,
last_index: usize,
}
pub(crate) fn part_2(input: &'static str) -> usize {
pub(crate) fn part_2(input: &'static str) -> u32 {
input
.lines()
.map(|line| {
let digit_indices = DIGIT_PATTERNS
.iter()
.enumerate()
.filter_map(|(digit, pattern)| {
// SAFETY: Generating a char from a number like this is guaranteed to be in ASCII range
let first_index_digit = line
.find(unsafe {
char::from_u32(digit as u32 + b'0' as u32).unwrap_unchecked()
})
.map(Reverse);
let first_index_digit = line.find(*digit).map(Reverse);
let first_index_str = line.find(pattern).map(Reverse);
let Reverse(first_index) = Option::max(first_index_digit, first_index_str)?;
// SAFETY: Generating a char from a number like this is guaranteed to be in ASCII range
let last_index_digit = line.rfind([unsafe {
char::from_u32(digit as u32 + b'0' as u32).unwrap_unchecked()
}]);
let last_index_digit = line.rfind(*digit);
let last_index_str = line.rfind(pattern);
let last_index = Option::max(last_index_digit, last_index_str)?;
Some(DigitIndices {
digit,
digit: unsafe { digit.to_digit(10).unwrap_unchecked() } as u8,
first_index,
last_index,
})
@ -58,7 +58,7 @@ pub(crate) fn part_2(input: &'static str) -> usize {
}
.digit;
(first_digit * 10) + last_digit
(first_digit as u32 * 10) + last_digit as u32
})
.sum()
}