Mindcraft's picture
Publish frozen reproduction executor image source
17d5066 verified
Raw
History Blame Contribute Delete
1.59 kB
#!/usr/bin/env python3
"""Apply one exhaustive registered reducer to accepted complete numeric inputs."""
from __future__ import annotations
import argparse
import dataclasses
import json
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
from repro_control.reducers import (
reduce_c1,
reduce_c2,
reduce_c3,
reduce_c4_maze,
reduce_c4_sudoku,
reduce_c5,
)
from repro_control.hashing import atomic_write_json
def plain(value):
if dataclasses.is_dataclass(value):
return {field.name: plain(getattr(value, field.name)) for field in dataclasses.fields(value)}
if isinstance(value, dict):
return {str(key): plain(item) for key, item in value.items()}
if isinstance(value, (list, tuple)):
return [plain(item) for item in value]
return value
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--claim", choices=("c1", "c2", "c3", "c4-sudoku", "c4-maze", "c5"), required=True)
parser.add_argument("--input", type=Path, required=True)
parser.add_argument("--output", type=Path, required=True)
args = parser.parse_args()
value = json.loads(args.input.read_text())
reducers = {
"c1": reduce_c1,
"c2": reduce_c2,
"c3": reduce_c3,
"c4-sudoku": reduce_c4_sudoku,
"c4-maze": reduce_c4_maze,
"c5": reduce_c5,
}
result = reducers[args.claim](**value)
atomic_write_json(args.output, plain(result))
return 0
if __name__ == "__main__":
raise SystemExit(main())