Skip to content

Instantly share code, notes, and snippets.

@tbarusseau
Created December 1, 2023 11:52
Show Gist options
  • Save tbarusseau/49f3e69b26caac869677d24a07af8bfc to your computer and use it in GitHub Desktop.
Save tbarusseau/49f3e69b26caac869677d24a07af8bfc to your computer and use it in GitHub Desktop.
fn find_side_digit(digits: &[&str], line: &str, left: bool) -> usize {
let map = digits.iter().enumerate().flat_map(|(i, d)| {
if left {
if let Some(min_index) = line.find(d) {
Some((min_index, i % 9 + 1))
} else {
None
}
} else {
if let Some(max_index) = line.rfind(d) {
Some((max_index, i % 9 + 1))
} else {
None
}
}
});
let extreme = if left {
map.min_by(|(i1, _), (i2, _)| i1.cmp(i2))
} else {
map.max_by(|(i1, _), (i2, _)| i1.cmp(i2))
};
extreme.map(|(_, v)| v).unwrap()
}
fn compute_solution(input: &str, digits: &[&str]) -> usize {
input
.trim_end()
.lines()
.map(|line| {
let min = find_side_digit(digits, line, true);
let max = find_side_digit(digits, line, false);
min * 10 + max
})
.sum()
}
fn solve_part1(input: &str) -> Box<dyn std::fmt::Display> {
let digits = &["1", "2", "3", "4", "5", "6", "7", "8", "9"];
Box::new(compute_solution(input, digits))
}
fn solve_part2(input: &str) -> Box<dyn std::fmt::Display> {
let digits = &[
"1", "2", "3", "4", "5", "6", "7", "8", "9", "one", "two", "three", "four", "five", "six",
"seven", "eight", "nine",
];
Box::new(compute_solution(input, digits))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment