Pass is_real_data to parsers

As in Haskell, we'll need this for some awkward problems.
This commit is contained in:
George Thomas 2026-01-12 22:27:41 +00:00
parent ea3900dd93
commit be0bfd0545
9 changed files with 12 additions and 12 deletions

View File

@ -29,7 +29,7 @@ fn main() {
println!(" {}", puzzle.number()); println!(" {}", puzzle.number());
let input = fs::read_to_string(format!("../inputs/{}/{}", t, puzzle.number())) let input = fs::read_to_string(format!("../inputs/{}/{}", t, puzzle.number()))
.expect("no input file"); .expect("no input file");
puzzle.with_parts(&input, &|n, run| { puzzle.with_parts(*is_real_data, &input, &|n, run| {
let expected = let expected =
fs::read_to_string(format!("../outputs/{}/{}/{}", t, puzzle.number(), n)) fs::read_to_string(format!("../outputs/{}/{}/{}", t, puzzle.number(), n))
.expect("no golden file"); .expect("no golden file");
@ -53,14 +53,14 @@ fn main() {
pub trait SomePuzzle { pub trait SomePuzzle {
fn number(&self) -> u32; fn number(&self) -> u32;
fn with_parts(&self, input: &str, f: &dyn Fn(usize, &dyn Fn() -> String)); fn with_parts(&self, is_real_data: bool, input: &str, f: &dyn Fn(usize, &dyn Fn() -> String));
} }
impl<Input, const N: usize> SomePuzzle for Puzzle<Input, { N }> { impl<Input, const N: usize> SomePuzzle for Puzzle<Input, { N }> {
fn number(&self) -> u32 { fn number(&self) -> u32 {
self.number self.number
} }
fn with_parts(&self, s: &str, f: &dyn Fn(usize, &dyn Fn() -> String)) { fn with_parts(&self, is_real_data: bool, s: &str, f: &dyn Fn(usize, &dyn Fn() -> String)) {
let input = (self.parser)(s); let input = (self.parser)(is_real_data, s);
for (i, p) in self.parts.iter().enumerate() { for (i, p) in self.parts.iter().enumerate() {
f(i + 1, &|| p(&input)); f(i + 1, &|| p(&input));
} }

View File

@ -1,5 +1,5 @@
pub struct Puzzle<Input, const N: usize> { pub struct Puzzle<Input, const N: usize> {
pub number: u32, pub number: u32,
pub parser: fn(&str) -> Input, pub parser: fn(bool, &str) -> Input,
pub parts: [fn(&Input) -> String; N], pub parts: [fn(&Input) -> String; N],
} }

View File

@ -11,7 +11,7 @@ use nom::{
pub const PUZZLE: Puzzle<Vec<(Direction, i32)>, 2> = Puzzle { pub const PUZZLE: Puzzle<Vec<(Direction, i32)>, 2> = Puzzle {
number: 1, number: 1,
parser: |input| { parser: |_, input| {
terminated::<_, _, Error<&str>, _, _>( terminated::<_, _, Error<&str>, _, _>(
terminated( terminated(
separated_list1( separated_list1(

View File

@ -10,7 +10,7 @@ use nom::{
pub const PUZZLE: Puzzle<Vec<(usize, usize)>, 2> = Puzzle { pub const PUZZLE: Puzzle<Vec<(usize, usize)>, 2> = Puzzle {
number: 2, number: 2,
parser: |input| { parser: |_, input| {
terminated::<_, _, Error<&str>, _, _>( terminated::<_, _, Error<&str>, _, _>(
terminated( terminated(
separated_list1(char(','), separated_pair(usize, char('-'), usize)), separated_list1(char(','), separated_pair(usize, char('-'), usize)),

View File

@ -10,7 +10,7 @@ use nom::{
pub const PUZZLE: Puzzle<Vec<Vec<u8>>, 2> = Puzzle { pub const PUZZLE: Puzzle<Vec<Vec<u8>>, 2> = Puzzle {
number: 3, number: 3,
parser: |input| { parser: |_, input| {
terminated::<_, _, Error<&str>, _, _>( terminated::<_, _, Error<&str>, _, _>(
terminated( terminated(
separated_list1( separated_list1(

View File

@ -11,7 +11,7 @@ use nom::{
pub const PUZZLE: Puzzle<Vec<Vec<InTile>>, 2> = Puzzle { pub const PUZZLE: Puzzle<Vec<Vec<InTile>>, 2> = Puzzle {
number: 4, number: 4,
parser: |input| { parser: |_, input| {
terminated::<_, _, Error<&str>, _, _>( terminated::<_, _, Error<&str>, _, _>(
terminated( terminated(
separated_list1( separated_list1(

View File

@ -11,7 +11,7 @@ use nom::{
pub const PUZZLE: Puzzle<(Vec<Range>, Vec<usize>), 2> = Puzzle { pub const PUZZLE: Puzzle<(Vec<Range>, Vec<usize>), 2> = Puzzle {
number: 5, number: 5,
parser: |input| { parser: |_, input| {
terminated::<_, _, Error<&str>, _, _>( terminated::<_, _, Error<&str>, _, _>(
separated_pair( separated_pair(
separated_list1( separated_list1(

View File

@ -13,7 +13,7 @@ use std::ops::{Add, Mul};
pub const PUZZLE: Puzzle<(Vec<Op>, Vec<Vec<Option<u8>>>), 2> = Puzzle { pub const PUZZLE: Puzzle<(Vec<Op>, Vec<Vec<Option<u8>>>), 2> = Puzzle {
number: 6, number: 6,
parser: |input| { parser: |_, input| {
terminated::<_, _, Error<&str>, _, _>( terminated::<_, _, Error<&str>, _, _>(
( (
terminated( terminated(

View File

@ -13,7 +13,7 @@ use std::collections::{HashMap, HashSet};
pub const PUZZLE: Puzzle<(usize, Vec<HashSet<usize>>), 2> = Puzzle { pub const PUZZLE: Puzzle<(usize, Vec<HashSet<usize>>), 2> = Puzzle {
number: 7, number: 7,
parser: |input| { parser: |_, input| {
terminated::<_, _, Error<&str>, _, _>( terminated::<_, _, Error<&str>, _, _>(
terminated( terminated(
( (