-use std::{fs, io::BufReader};
+use std::io::BufRead;
use crate::*;
-pub fn day01() -> String {
- let f = fs::File::open("data/day01.input").unwrap();
- let (ids1, ids2) = day01::read_location_ids_as_sorted(BufReader::new(f));
+pub fn day01(reader: &mut dyn BufRead) -> String {
+ let (ids1, ids2) = day01::read_location_ids_as_sorted(reader);
format!(
"part1: {}, part2: {}",
day01::sum_distances(&ids1, &ids2),
)
}
-pub fn day02() -> String {
- let f = fs::File::open("data/day02.input").unwrap();
- let reports = day02::read_reports(BufReader::new(f));
+pub fn day02(reader: &mut dyn BufRead) -> String {
+ let reports = day02::read_reports(reader);
format!(
"part1: {}, part2: {}",
day02::nb_of_safe_reports(&reports),
)
}
-pub fn day03() -> String {
- let f = fs::File::open("data/day03.input").unwrap();
- let program = day03::read_program(BufReader::new(f));
+pub fn day03(reader: &mut dyn BufRead) -> String {
+ let program = day03::read_program(reader);
format!(
"part1: {}, part2: {}",
day03::execute_corrupted_program(&program),
)
}
-pub fn day04() -> String {
- let f = fs::File::open("data/day04.input").unwrap();
- let word_search = day04::read_word_search(BufReader::new(f));
+pub fn day04(reader: &mut dyn BufRead) -> String {
+ let word_search = day04::read_word_search(reader);
format!(
"part1: {}, part2: {}",
day04::nb_of_word_occurences(&word_search, "XMAS"),
)
}
-pub fn day05() -> String {
- let f = fs::File::open("data/day05.input").unwrap();
- let (ordering, updates) = day05::read_ordering_and_updates(BufReader::new(f));
+pub fn day05(reader: &mut dyn BufRead) -> String {
+ let (ordering, updates) = day05::read_ordering_and_updates(reader);
format!(
"part1: {}, part2: {}",
day05::sum_of_mid_page_from_valid_updates(&ordering, &updates),
)
}
-pub fn day06() -> String {
- let f = fs::File::open("data/day06.input").unwrap();
- let (map, guard_pos) = day06::read_map(BufReader::new(f));
+pub fn day06(reader: &mut dyn BufRead) -> String {
+ let (map, guard_pos) = day06::read_map(reader);
format!(
"part1: {}, part2: {}",
day06::nb_position_visited_by_guard(&map, guard_pos),
)
}
-pub fn day07() -> String {
- let f = fs::File::open("data/day07.input").unwrap();
- let equations = day07::read(BufReader::new(f));
+pub fn day07(reader: &mut dyn BufRead) -> String {
+ let equations = day07::read(reader);
format!(
"part1: {}, part2: {}",
day07::sum_valid_equations(&equations),
)
}
-pub fn day08() -> String {
- let f = fs::File::open("data/day08.input").unwrap();
- let antennae = day08::read(BufReader::new(f));
+pub fn day08(reader: &mut dyn BufRead) -> String {
+ let antennae = day08::read(reader);
format!(
"part1: {}, part2: {}",
day08::nb_antinodes(&antennae, day08::AntinodeMode::TwoPerPair),
day08::nb_antinodes(&antennae, day08::AntinodeMode::Unlimited),
)
}
+
+pub fn day09(reader: &mut dyn BufRead) -> String {
+ format!("part1: {}, part2: {}", 0, 0,)
+}
-use std::time::Instant;
+use std::{
+ fs,
+ io::{BufRead, Read},
+ time::Instant,
+};
use clap::Parser;
use rayon::prelude::*;
mod day06;
mod day07;
mod day08;
-// mod day09;
+mod day09;
// mod day10;
// mod day11;
// mod day12;
fn main() {
println!("https://adventofcode.com/2024");
- let days: Vec<fn() -> String> = vec![
+ let days: Vec<fn(&mut dyn BufRead) -> String> = vec![
days::day01,
days::day02,
days::day03,
days::day06,
days::day07,
days::day08,
- // days::day09,
+ days::day09,
// days::day10,
// days::day11,
// days::day12,
}
}
-fn do_day(days: &[fn() -> String], day: usize) {
+fn do_day(days: &[fn(&mut dyn BufRead) -> String], day: usize) {
+ let filepath = format!("data/day{:02}.input", day);
+ let mut f = fs::File::open(&filepath).unwrap_or_else(|error| {
+ println!(
+ "Cannot find file {}. Did you place the input files in the 'data' directory?\nError:{}",
+ filepath, error
+ );
+ panic!();
+ });
+
+ // We read the whole file to avoid measuring I/O time.
+ let mut buffer = Vec::new();
+ f.read_to_end(&mut buffer).unwrap();
+
let now = Instant::now();
println!(
"Result of day {:02}: {} (time: {})",
day,
- days[day - 1](),
+ days[day - 1](&mut buffer.as_slice()),
format_micros(now.elapsed().as_micros())
);
}