"""
Solution: measure prompt changes on the questions you tune on AND on held-out ones (Lab 05, Exercise 9).
"""


def passes(checks: dict[str, float]) -> bool:
    return all(v == 1 for v in checks.values())


def score(run: dict[str, dict[str, float]]) -> int:
    return sum(passes(checks) for checks in run.values())


def mean_gain(before: list[dict], after: list[dict]) -> float:
    avg = lambda runs: sum(score(r) for r in runs) / len(runs)
    return round(avg(after) - avg(before), 2)


def moved(before: list[dict], after: list[dict]) -> dict[str, tuple[int, int]]:
    count = lambda runs, q: sum(passes(r[q]) for r in runs)
    out = {}
    for q in before[0]:
        b, a = count(before, q), count(after, q)
        if b != a:
            out[q] = (b, a)
    return out


def verdict(test_gain: float, new_gain: float, min_gain: float = 0.5) -> str:
    if new_gain >= min_gain:
        return "carries over"
    if test_gain >= min_gain:
        return "fits the test"
    return "no effect"
