Skip to content

Commit 8d7c6ec

Browse files
committed
Merge branch 'master' into day04, adding the Answer struct
2 parents 01554b9 + d812551 commit 8d7c6ec

File tree

4 files changed

+88
-55
lines changed

4 files changed

+88
-55
lines changed

src/helpers.rs

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
33
use {
44
std::fs::File,
5-
std::io::{self, BufRead},
5+
std::io::{BufRead, BufReader, Lines},
6+
std::iter::Flatten,
67
std::path::Path,
78
};
89

@@ -13,12 +14,18 @@ pub fn solve_day(day: u8) {
1314
/// macro takes a `dayXX` module and displays its `dayXX::pt1` and `dayXX::pt2` solutions
1415
macro_rules! solve {
1516
($dayXX:ident) => {{
16-
let (answer1, time1) = crate::solutions::$dayXX::pt1(&filename);
17-
let (answer2, time2) = crate::solutions::$dayXX::pt2(&filename);
17+
let answer1 = crate::solutions::$dayXX::pt1(&filename);
18+
let answer2 = crate::solutions::$dayXX::pt2(&filename);
1819

1920
println!("Day {day:02}");
20-
println!(" part 1: {answer1}, elapsed time: {time1} ms");
21-
println!(" part 2: {answer2}, elapsed time: {time2} ms");
21+
println!(
22+
" part 1: {}, elapsed time: {} ms",
23+
answer1.answer, answer1.time
24+
);
25+
println!(
26+
" part 2: {}, elapsed time: {} ms",
27+
answer2.answer, answer2.time
28+
);
2229
println!("");
2330
}};
2431
}
@@ -54,10 +61,35 @@ pub fn solve_day(day: u8) {
5461
}
5562
}
5663

57-
/// returns an iterator over each line in the input file
58-
pub fn read_lines<P>(filename: P) -> std::io::Lines<std::io::BufReader<std::fs::File>>
64+
/// struct to store the answer of a challenge
65+
pub struct Answer {
66+
answer: u32,
67+
time: u32,
68+
}
69+
70+
impl Answer {
71+
pub fn new(answer: u32, time: u32) -> Self {
72+
Answer { answer, time }
73+
}
74+
}
75+
76+
/// returns an iterator over each line in the input file, ignoring lines that failed to be read
77+
pub fn read_lines<P>(filename: P) -> Flatten<Lines<BufReader<File>>>
5978
where
6079
P: AsRef<Path>,
6180
{
62-
io::BufReader::new(File::open(filename).expect("not able to open file")).lines()
81+
BufReader::new(File::open(filename).expect("not able to open file"))
82+
.lines()
83+
.flatten()
84+
}
85+
86+
#[cfg(test)]
87+
mod tests {
88+
use super::Answer;
89+
90+
impl Answer {
91+
pub fn answer(&self) -> u32 {
92+
self.answer
93+
}
94+
}
6395
}

src/solutions/day01.rs

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,19 @@
44
//!
55
//! https://adventofcode.com/2022/day/1
66
7-
use {crate::helpers::read_lines, std::time::SystemTime};
7+
use {
8+
crate::helpers::{read_lines, Answer},
9+
std::time::SystemTime,
10+
};
811

9-
pub fn pt1(filename: &str) -> (u32, u32) {
12+
/// solves the part 1 of day 01 and return its result and elapsed time
13+
pub fn pt1(filename: &str) -> Answer {
1014
let time = SystemTime::now();
1115

1216
let mut biggest = 0;
1317
let mut current = 0;
1418

15-
read_lines(filename).flatten().for_each(|line| {
19+
read_lines(filename).for_each(|line| {
1620
match line.as_str() {
1721
// if empty line, compare current block with biggest found until then
1822
"" => {
@@ -26,21 +30,19 @@ pub fn pt1(filename: &str) -> (u32, u32) {
2630

2731
biggest = biggest.max(current);
2832

29-
let answer = biggest;
30-
let time = time.elapsed().unwrap().as_millis() as u32;
31-
32-
(answer, time)
33+
Answer::new(biggest, time.elapsed().unwrap().as_millis() as u32)
3334
}
3435

35-
pub fn pt2(filename: &str) -> (u32, u32) {
36+
/// solves the part 2 of day 01 and return its result and elapsed time
37+
pub fn pt2(filename: &str) -> Answer {
3638
let time = SystemTime::now();
3739

3840
// we want to find the sum of the 3 biggest blocks
3941
let mut biggest = vec![0, 0, 0];
4042
let mut current = 0;
4143

4244
// iterating through each line of the file
43-
read_lines(filename).flatten().for_each(|line| {
45+
read_lines(filename).for_each(|line| {
4446
match line.as_str() {
4547
// if empty line, compare current block with 3 biggest known
4648
"" => {
@@ -72,10 +74,10 @@ pub fn pt2(filename: &str) -> (u32, u32) {
7274
biggest[2] = current;
7375
}
7476

75-
let answer = biggest.iter().sum();
76-
let time = time.elapsed().unwrap().as_millis() as u32;
77-
78-
(answer, time)
77+
Answer::new(
78+
biggest.iter().sum(),
79+
time.elapsed().unwrap().as_millis() as u32,
80+
)
7981
}
8082

8183
#[cfg(test)]
@@ -86,13 +88,13 @@ mod tests {
8688

8789
#[test]
8890
fn pt01() {
89-
let (answer, _) = pt1(FILENAME);
90-
assert_eq!(24000, answer);
91+
let answer = pt1(FILENAME);
92+
assert_eq!(24000, answer.answer());
9193
}
9294

9395
#[test]
9496
fn pt02() {
95-
let (answer, _) = pt2(FILENAME);
96-
assert_eq!(45000, answer);
97+
let answer = pt2(FILENAME);
98+
assert_eq!(45000, answer.answer());
9799
}
98100
}

src/solutions/day02.rs

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,32 +4,31 @@
44
//!
55
//! https://adventofcode.com/2022/day/2
66
7-
use {crate::helpers::read_lines, std::time::SystemTime};
7+
use {
8+
crate::helpers::{read_lines, Answer},
9+
std::time::SystemTime,
10+
};
811

9-
pub fn pt1(filename: &str) -> (u32, u32) {
12+
/// solves the part 1 of day 02 and return its result and elapsed time
13+
pub fn pt1(filename: &str) -> Answer {
1014
let time = SystemTime::now();
1115

1216
let answer = read_lines(filename)
13-
.flatten()
1417
.map(|line| RoundMoves::from_line(line).total_points())
1518
.sum();
1619

17-
let time = time.elapsed().unwrap().as_millis() as u32;
18-
19-
(answer, time)
20+
Answer::new(answer, time.elapsed().unwrap().as_millis() as u32)
2021
}
2122

22-
pub fn pt2(filename: &str) -> (u32, u32) {
23+
/// solves the part 2 of day 02 and return its result and elapsed time
24+
pub fn pt2(filename: &str) -> Answer {
2325
let time = SystemTime::now();
2426

2527
let answer = read_lines(filename)
26-
.flatten()
2728
.map(|line| RoundOutcome::from_line(line).total_points())
2829
.sum();
2930

30-
let time = time.elapsed().unwrap().as_millis() as u32;
31-
32-
(answer, time)
31+
Answer::new(answer, time.elapsed().unwrap().as_millis() as u32)
3332
}
3433

3534
#[derive(Debug)]
@@ -206,13 +205,13 @@ mod tests {
206205

207206
#[test]
208207
fn pt01() {
209-
let (answer, _) = pt1(FILENAME);
210-
assert_eq!(15, answer);
208+
let answer = pt1(FILENAME);
209+
assert_eq!(15, answer.answer());
211210
}
212211

213212
#[test]
214213
fn pt02() {
215-
let (answer, _) = pt2(FILENAME);
216-
assert_eq!(12, answer);
214+
let answer = pt2(FILENAME);
215+
assert_eq!(12, answer.answer());
217216
}
218217
}

src/solutions/day03.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,24 @@
44
//!
55
//! https://adventofcode.com/2022/day/3
66
7-
use {crate::helpers::read_lines, std::time::SystemTime};
7+
use {
8+
crate::helpers::{read_lines, Answer},
9+
std::time::SystemTime,
10+
};
811

9-
pub fn pt1(filename: &str) -> (u32, u32) {
12+
/// solves the part 1 of day 03 and return its result and elapsed time
13+
pub fn pt1(filename: &str) -> Answer {
1014
let time = SystemTime::now();
1115

1216
let answer = read_lines(filename)
13-
.flatten()
1417
.map(|line| Rucksack::from_line(line).value_of_common())
1518
.sum();
1619

17-
let time = time.elapsed().unwrap().as_millis() as u32;
18-
19-
(answer, time)
20+
Answer::new(answer, time.elapsed().unwrap().as_millis() as u32)
2021
}
2122

22-
pub fn pt2(filename: &str) -> (u32, u32) {
23+
/// solves the part 2 of day 03 and return its result and elapsed time
24+
pub fn pt2(filename: &str) -> Answer {
2325
let time = SystemTime::now();
2426

2527
let mut current_group = Group {
@@ -32,7 +34,7 @@ pub fn pt2(filename: &str) -> (u32, u32) {
3234

3335
let mut answer = 0;
3436

35-
for line in read_lines(filename).flatten() {
37+
for line in read_lines(filename) {
3638
match current_index {
3739
1 => {
3840
current_group.first = line;
@@ -52,9 +54,7 @@ pub fn pt2(filename: &str) -> (u32, u32) {
5254
}
5355
}
5456

55-
let time = time.elapsed().unwrap().as_millis() as u32;
56-
57-
(answer, time)
57+
Answer::new(answer, time.elapsed().unwrap().as_millis() as u32)
5858
}
5959

6060
/// represents a Rucksack and the content on its 1st and 2nd compartments
@@ -136,14 +136,14 @@ mod tests {
136136

137137
#[test]
138138
fn pt01() {
139-
let (answer, _) = pt1(FILENAME);
140-
assert_eq!(157, answer);
139+
let answer = pt1(FILENAME);
140+
assert_eq!(157, answer.answer());
141141
}
142142

143143
#[test]
144144
fn pt02() {
145-
let (answer, _) = pt2(FILENAME);
146-
assert_eq!(70, answer);
145+
let answer = pt2(FILENAME);
146+
assert_eq!(70, answer.answer());
147147
}
148148

149149
#[test]

0 commit comments

Comments
 (0)