Wow, I sure did. I was tired last night. I'll edit my solution in and fix my error.
capitalpb
joined 10 months ago
Solved part one in about thirty seconds. But wow, either my brain is just tired at this hour or I'm lacking in skill, but part two is harder than any other year has been on the first day. Anyway, I managed to solve it, but I absolutely hate it, and will definitely be coming back to try to clean this one up.
https://github.com/capitalpb/advent_of_code_2023/blob/main/src/solvers/day01.rs
impl Solver for Day01 {
fn star_one(&self, input: &str) -> String {
let mut result = 0;
for line in input.lines() {
let line = line
.chars()
.filter(|ch| ch.is_ascii_digit())
.collect::>();
let first = line.first().unwrap();
let last = line.last().unwrap();
let number = format!("{first}{last}").parse::().unwrap();
result += number;
}
result.to_string()
}
fn star_two(&self, input: &str) -> String {
let mut result = 0;
for line in input.lines() {
let mut first = None;
let mut last = None;
while first == None {
for index in 0..line.len() {
let line_slice = &line[index..];
if line_slice.starts_with("one") || line_slice.starts_with("1") {
first = Some(1);
} else if line_slice.starts_with("two") || line_slice.starts_with("2") {
first = Some(2);
} else if line_slice.starts_with("three") || line_slice.starts_with("3") {
first = Some(3);
} else if line_slice.starts_with("four") || line_slice.starts_with("4") {
first = Some(4);
} else if line_slice.starts_with("five") || line_slice.starts_with("5") {
first = Some(5);
} else if line_slice.starts_with("six") || line_slice.starts_with("6") {
first = Some(6);
} else if line_slice.starts_with("seven") || line_slice.starts_with("7") {
first = Some(7);
} else if line_slice.starts_with("eight") || line_slice.starts_with("8") {
first = Some(8);
} else if line_slice.starts_with("nine") || line_slice.starts_with("9") {
first = Some(9);
}
if first.is_some() {
break;
}
}
}
while last == None {
for index in (0..line.len()).rev() {
let line_slice = &line[index..];
if line_slice.starts_with("one") || line_slice.starts_with("1") {
last = Some(1);
} else if line_slice.starts_with("two") || line_slice.starts_with("2") {
last = Some(2);
} else if line_slice.starts_with("three") || line_slice.starts_with("3") {
last = Some(3);
} else if line_slice.starts_with("four") || line_slice.starts_with("4") {
last = Some(4);
} else if line_slice.starts_with("five") || line_slice.starts_with("5") {
last = Some(5);
} else if line_slice.starts_with("six") || line_slice.starts_with("6") {
last = Some(6);
} else if line_slice.starts_with("seven") || line_slice.starts_with("7") {
last = Some(7);
} else if line_slice.starts_with("eight") || line_slice.starts_with("8") {
last = Some(8);
} else if line_slice.starts_with("nine") || line_slice.starts_with("9") {
last = Some(9);
}
if last.is_some() {
break;
}
}
}
result += format!("{}{}", first.unwrap(), last.unwrap())
.parse::()
.unwrap();
}
result.to_string()
}
}
Not too tricky today. Part 2 wasn't as big of a curveball as yesterday thankfully. I don't think it's the cleanest code I've ever written, but hey - the whole point of this is to get better at Rust, so I'll definitely be learning as I go, and coming back at the end to clean a lot of these up. I think for this one I'd like to look into a parsing crate like nom to clean up all the spliting and unwrapping in the two from() methods.
https://github.com/capitalpb/advent_of_code_2023/blob/main/src/solvers/day02.rs