[TASK] Solved Day 1 (but not very pretty)

This commit is contained in:
2023-12-01 23:36:11 +01:00
parent 446422e0d2
commit feef5b4740
3 changed files with 57 additions and 20 deletions

View File

@@ -2,6 +2,19 @@ use crate::day_solver::DaySolver;
use super::util;
const NUMBERS: [[&'static str; 2]; 10] = [
["0", "zero"],
["1", "one"],
["2", "two"],
["3", "three"],
["4", "four"],
["5", "five"],
["6", "six"],
["7", "seven"],
["8", "eight"],
["9", "nine"]
];
pub struct Day1 {
lines: Vec<String>
}
@@ -9,7 +22,7 @@ pub struct Day1 {
impl Day1 {
pub fn create() -> Self {
let lines = util::read_file("input/day1_example2.txt");
let lines = util::read_file("input/day1.txt");
// let lines = util::read_file("input/dayX.txt");
// Put the input into the day struct
@@ -20,6 +33,7 @@ impl Day1 {
fn solve(lines: &Vec<String>) -> u32 {
lines.iter()
.filter(|l| l.chars().any(|c| c.is_numeric()))
.map(|l| {
let nrs: Vec<u8> = l.chars()
.filter(|c| c.is_numeric())
@@ -28,6 +42,38 @@ impl Day1 {
u32::from(nrs.first().unwrap().to_owned()) * 10 + u32::from(nrs.last().unwrap().to_owned())
}).sum::<u32>()
}
fn find_first_number(line: &String) -> u32 {
let mut min_idx = line.len();
let mut num_at_idx: u32 = 0;
for (n, nr_strings) in NUMBERS.iter().enumerate() {
for nr_string in nr_strings {
if let Some(i) = line.find(nr_string) {
if i < min_idx {
num_at_idx = n as u32;
min_idx = i;
}
}
}
}
num_at_idx
}
fn find_last_number(line: &String) -> u32 {
let mut max_idx = 0usize;
let mut num_at_idx = 0u32;
for (n, nr_strings) in NUMBERS.iter().enumerate() {
for nr_string in nr_strings {
if let Some(i) = line.rfind(nr_string) {
if i >= max_idx {
num_at_idx = n as u32;
max_idx = i;
}
}
}
}
num_at_idx
}
}
impl DaySolver for Day1 {
@@ -38,17 +84,8 @@ impl DaySolver for Day1 {
}
fn solve_part2(&mut self) -> String {
return Self::solve(&self.lines.iter().map(
|l| l
.replace("one", "1")
.replace("two", "2")
.replace("three", "3")
.replace("four", "4")
.replace("five", "5")
.replace("six", "6")
.replace("seven", "7")
.replace("eight", "8")
.replace("nine", "9")
).collect()).to_string()
self.lines.iter().map(
|l| Self::find_first_number(l) * 10 + Self::find_last_number(l)
).sum::<u32>().to_string()
}
}

View File

@@ -87,13 +87,12 @@ fn solve(day: u8, silent: bool) -> AocBenchResult {
match solver {
Some(mut s) => {
// let(part1, pt1_time) = bench(|| s.solve_part1());
// part1_time = pt1_time;
//
// if !silent {
// println!("Day {} Part 1: {}", day, part1);
// }
part1_time = 0;
let(part1, pt1_time) = bench(|| s.solve_part1());
part1_time = pt1_time;
if !silent {
println!("Day {} Part 1: {}", day, part1);
}
let (part2, pt2_time) = bench(|| s.solve_part2());
part2_time = pt2_time;
if !silent {

View File

@@ -54,6 +54,7 @@ impl<T: Clone + Sized> Grid<T> {
&self.data[idx]
}
#[allow(dead_code)]
pub fn set(&mut self, x: &usize, y: &usize, v: T) {
let idx = self.idx(x, y);
self.data[idx] = v;