garnet/rust/main.rs

71 lines
2.1 KiB
Rust
Raw Normal View History

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;
2026-01-07 14:05:58 +00:00
use puzzles::day5;
2026-01-09 13:39:14 +00:00
use puzzles::day6;
2025-12-09 19:17:25 +00:00
use std::fs;
use std::time::{Duration, Instant};
2025-12-09 19:17:25 +00:00
2026-01-09 13:39:14 +00:00
const PUZZLES: [&dyn SomePuzzle; 6] = [
2026-01-07 14:05:58 +00:00
&day1::PUZZLE,
&day2::PUZZLE,
&day3::PUZZLE,
&day4::PUZZLE,
&day5::PUZZLE,
2026-01-09 13:39:14 +00:00
&day6::PUZZLE,
2026-01-07 14:05:58 +00:00
];
2025-12-09 19:17:25 +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.with_parts(&input, &|n, run| {
2025-12-23 11:31:41 +00:00
let expected =
fs::read_to_string(format!("../outputs/{}/{}/{}", t, puzzle.number(), n))
2025-12-09 19:17:25 +00:00
.expect("no golden file");
2025-12-23 11:31:22 +00:00
let expected = expected.trim_end();
let start = Instant::now();
let output = run();
let elapsed = start.elapsed();
println!(
" {}: {}",
n,
if expected == output {
2025-12-23 15:11:52 +00:00
let mut s = String::from("OK");
if elapsed > Duration::from_millis(10) {
2025-12-23 15:13:25 +00:00
s.push_str(&format!(" ({:?})", elapsed));
}
2025-12-23 15:11:52 +00:00
s
} else {
format!("expected {}, got {}", expected, output)
}
);
2025-12-09 19:17:25 +00:00
});
});
})
}
pub trait SomePuzzle {
fn number(&self) -> u32;
fn with_parts(&self, input: &str, f: &dyn Fn(usize, &dyn Fn() -> String));
2025-12-09 19:17:25 +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 with_parts(&self, s: &str, f: &dyn Fn(usize, &dyn Fn() -> String)) {
2025-12-09 19:17:25 +00:00
let input = (self.parser)(s);
for (i, p) in self.parts.iter().enumerate() {
2025-12-23 11:31:22 +00:00
f(i + 1, &|| p(&input));
}
2025-12-09 19:17:25 +00:00
}
}