2025-12-09 19:17:25 +00:00
|
|
|
mod puzzle;
|
|
|
|
|
mod puzzles;
|
|
|
|
|
use crate::puzzle::Puzzle;
|
|
|
|
|
use puzzles::day1;
|
2025-12-10 10:51:30 +00:00
|
|
|
use puzzles::day2;
|
2025-12-19 14:51:36 +00:00
|
|
|
use puzzles::day3;
|
2025-12-22 19:00:09 +00:00
|
|
|
use puzzles::day4;
|
2025-12-09 19:17:25 +00:00
|
|
|
use std::fs;
|
|
|
|
|
|
2025-12-22 19:00:09 +00:00
|
|
|
const PUZZLES: [&dyn SomePuzzle; 4] = [&day1::PUZZLE, &day2::PUZZLE, &day3::PUZZLE, &day4::PUZZLE];
|
2025-12-09 19:17:25 +00:00
|
|
|
|
2025-12-02 16:42:44 +00:00
|
|
|
fn main() {
|
2025-12-09 19:17:25 +00:00
|
|
|
[false, true].iter().for_each(|is_real_data| {
|
|
|
|
|
let t = if *is_real_data { "real" } else { "examples" };
|
|
|
|
|
println!("{}", t);
|
|
|
|
|
PUZZLES.into_iter().for_each(|puzzle| {
|
|
|
|
|
println!(" {}", puzzle.number());
|
|
|
|
|
let input = fs::read_to_string(format!("../inputs/{}/{}", t, puzzle.number()))
|
|
|
|
|
.expect("no input file");
|
|
|
|
|
puzzle.run(&input).iter().zip(1..).for_each(|(output, n)| {
|
|
|
|
|
let expected =
|
|
|
|
|
fs::read_to_string(format!("../outputs/{}/{}/{}", t, puzzle.number(), n))
|
|
|
|
|
.expect("no golden file");
|
|
|
|
|
print!(" {}: ", n);
|
|
|
|
|
if expected == *output {
|
|
|
|
|
println!("OK");
|
|
|
|
|
} else {
|
|
|
|
|
println!(
|
|
|
|
|
"expected {}, got {}",
|
|
|
|
|
expected.trim_end(),
|
|
|
|
|
output.trim_end()
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub trait SomePuzzle {
|
|
|
|
|
fn number(&self) -> u32;
|
|
|
|
|
fn run(&self, input: &str) -> Vec<String>;
|
|
|
|
|
}
|
2025-12-16 17:38:53 +00:00
|
|
|
impl<Input, const N: usize> SomePuzzle for Puzzle<Input, { N }> {
|
2025-12-09 19:17:25 +00:00
|
|
|
fn number(&self) -> u32 {
|
|
|
|
|
self.number
|
|
|
|
|
}
|
|
|
|
|
fn run(&self, s: &str) -> Vec<String> {
|
|
|
|
|
let input = (self.parser)(s);
|
2025-12-16 17:38:53 +00:00
|
|
|
self.parts.map(|p| p(&input) + "\n").to_vec()
|
2025-12-09 19:17:25 +00:00
|
|
|
}
|
2025-12-02 16:42:44 +00:00
|
|
|
}
|