optimized day1
This commit is contained in:
parent
7474d03451
commit
e1e03896d5
|
@ -7,51 +7,10 @@ fn process(data: &str) -> u64 {
|
||||||
let mut total: u64 = 0;
|
let mut total: u64 = 0;
|
||||||
|
|
||||||
for line in data.split('\n') {
|
for line in data.split('\n') {
|
||||||
let mut first = 0;
|
let line: Vec<char> = line.chars().collect();
|
||||||
let mut last = 0;
|
|
||||||
|
|
||||||
let mut window = Vec::with_capacity(line.len());
|
let first = 10 * find_forward(&line);
|
||||||
let mut j = 0;
|
let last = find_backward(&line);
|
||||||
|
|
||||||
for (i, c) in line.chars().enumerate() {
|
|
||||||
if (window.len() - j) >= 5 {
|
|
||||||
j += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
match c {
|
|
||||||
v @ '1'..='9' if first == 0 => {
|
|
||||||
let num = v as u8 - b'0';
|
|
||||||
first = 10 * num;
|
|
||||||
last = num;
|
|
||||||
|
|
||||||
j = i + 1;
|
|
||||||
}
|
|
||||||
v @ '1'..='9' => {
|
|
||||||
let num = v as u8 - b'0';
|
|
||||||
last = num;
|
|
||||||
|
|
||||||
j = i + 1;
|
|
||||||
}
|
|
||||||
_ => (),
|
|
||||||
}
|
|
||||||
window.push(c);
|
|
||||||
|
|
||||||
if window.len() - j >= 3 {
|
|
||||||
if let Some(digit) = get_digit(&window[j..]) {
|
|
||||||
if first == 0 {
|
|
||||||
first = 10 * digit;
|
|
||||||
}
|
|
||||||
last = digit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(digit) = get_digit(&window[j..]) {
|
|
||||||
if first == 0 {
|
|
||||||
first = 10 * digit;
|
|
||||||
}
|
|
||||||
last = digit;
|
|
||||||
}
|
|
||||||
|
|
||||||
total += first as u64 + last as u64;
|
total += first as u64 + last as u64;
|
||||||
}
|
}
|
||||||
|
@ -59,6 +18,56 @@ fn process(data: &str) -> u64 {
|
||||||
total
|
total
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn find_forward(iter: &[char]) -> u8 {
|
||||||
|
let mut start = 0;
|
||||||
|
let mut end = 0;
|
||||||
|
|
||||||
|
for c in iter.iter() {
|
||||||
|
if ('1'..='9').contains(c) {
|
||||||
|
return *c as u8 - b'0';
|
||||||
|
}
|
||||||
|
|
||||||
|
if end - start >= 5 {
|
||||||
|
start += 1;
|
||||||
|
}
|
||||||
|
end += 1;
|
||||||
|
|
||||||
|
if end - start >= 3 {
|
||||||
|
if let Some(digit) = get_digit(&iter[start..end]) {
|
||||||
|
return digit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get_digit(&iter[start..end]).unwrap_or(0)
|
||||||
|
}
|
||||||
|
fn find_backward(iter: &[char]) -> u8 {
|
||||||
|
if iter.is_empty() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
let mut start = iter.len() - 1;
|
||||||
|
let mut end = iter.len();
|
||||||
|
|
||||||
|
for c in iter.iter().rev() {
|
||||||
|
if ('1'..='9').contains(c) {
|
||||||
|
return *c as u8 - b'0';
|
||||||
|
}
|
||||||
|
if end - start >= 5 {
|
||||||
|
end -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
start -= 1;
|
||||||
|
|
||||||
|
if end - start >= 3 {
|
||||||
|
if let Some(digit) = get_digit(&iter[start..end]) {
|
||||||
|
return digit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get_digit(&iter[start..end]).unwrap_or(0)
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
for input in INPUTS.iter() {
|
for input in INPUTS.iter() {
|
||||||
println!("total = {}", process(input));
|
println!("total = {}", process(input));
|
||||||
|
|
Loading…
Reference in New Issue
Block a user