advent-of-code/2023/day01/src/zero_alloc.rs
2023-12-03 15:14:43 +01:00

43 lines
1.5 KiB
Rust

pub fn part2(input: &str) -> u64 {
let sum = input
.lines()
.map(|line| {
let bytes = line.as_bytes();
let mut i = 0;
let mut first = None;
let mut last = b'_';
let mut insert = |byte| {
if first.is_none() {
first = Some(byte);
}
last = byte;
};
while i < bytes.len() {
match bytes[i] {
b @ b'0'..=b'9' => insert(b),
b'o' if bytes.get(i..(i + 3)) == Some(b"one") => insert(b'1'),
b't' if bytes.get(i..(i + 3)) == Some(b"two") => insert(b'2'),
b't' if bytes.get(i..(i + 5)) == Some(b"three") => insert(b'3'),
b'f' if bytes.get(i..(i + 4)) == Some(b"four") => insert(b'4'),
b'f' if bytes.get(i..(i + 4)) == Some(b"five") => insert(b'5'),
b's' if bytes.get(i..(i + 3)) == Some(b"six") => insert(b'6'),
b's' if bytes.get(i..(i + 5)) == Some(b"seven") => insert(b'7'),
b'e' if bytes.get(i..(i + 5)) == Some(b"eight") => insert(b'8'),
b'n' if bytes.get(i..(i + 4)) == Some(b"nine") => insert(b'9'),
_ => {}
}
i += 1;
}
let first = (first.unwrap() - b'0') as u64;
let last = (last - b'0') as u64;
first * 10 + last
})
.sum::<u64>();
sum
}