diff --git a/eval/dovodka/rol.py b/eval/dovodka/rol.py index 6f5e7779..ce1917ad 100644 --- a/eval/dovodka/rol.py +++ b/eval/dovodka/rol.py @@ -706,8 +706,19 @@ def read_texts(p: str, uid: str) -> dict: return out -def emit_read(p: str, n_units: int = 3) -> None: - """Пакет слепого чтения: ключ пишется ДО ответов, раскладка ОДНА на пару.""" +def emit_read(p: str, n_units: int = 3, panel: tuple = (), tag_: str = "") -> None: + """Пакет слепого чтения: ключ пишется ДО ответов, раскладка ОДНА на пару. + + ⚠ ПАНЕЛЬ И ИМЯ ПАКЕТА — ПАРАМЕТРЫ, И ЭТО НЕ УДОБСТВО. Слепое чтение стало ШТАТНЫМ прибором + (решение владельца 20.08: «теперь судим так всё время»), значит панелей будет много. Ключ + каждой лежит в СВОЁМ файле: пере-эмиссия с другим составом армов переписала бы раскладку уже + прочитанной панели, и ответ читателя стал бы мусором молча — класс, уже стоивший фазе вердикта. + """ + global READ_PANEL, READ_KEY # noqa: PLW0603 + if panel: + READ_PANEL = tuple(panel) + if tag_: + READ_KEY = OUT / "blind-keys-rol" / f"rol-KEY-{tag_}.json" cfg = PAIRS[p] cfg["wire"]() full = [] @@ -725,8 +736,8 @@ def emit_read(p: str, n_units: int = 3) -> None: "_что": "слепое чтение панели замера «однопроходка как роль»", "_соль": READ_SALT, "_панель": list(READ_PANEL), "_контроль": "Z0 и ZF — две генерации ОДНОЙ боевой связки"} - ans = READ_DIR / f"ОТВЕТ-{p}.md" - lay = CH.layout(p, f"ROL-ALL|{READ_SALT}", "READER", READ_PANEL) + ans = READ_DIR / f"ОТВЕТ-{p}{('-' + tag_) if tag_ else ''}.md" + lay = CH.layout(p, f"ROL-ALL|{READ_SALT}|{tag_}", "READER", READ_PANEL) body = [f"# {'КИТАЙСКАЯ' if p == 'zh' else 'АНГЛИЙСКАЯ'} ПАРА — слепое чтение\n", READ_HEAD.format(n=len(READ_PANEL), answer=ans)] for j, (uid, tx) in enumerate(take, 1): @@ -736,13 +747,15 @@ def emit_read(p: str, n_units: int = 3) -> None: body += ["\n---\n", f"## Отрывок {j}, вариант {lab}\n", tx[arm], ""] key.setdefault(p, {})[str(j)] = {"uid": uid, "метки": lay, "знаков": {a: len(tx[a]) for a in READ_PANEL}} - (READ_DIR / f"ЧТЕНИЕ-{p}.md").write_text("\n".join(body), encoding="utf-8") + (READ_DIR / f"ЧТЕНИЕ-{p}{('-' + tag_) if tag_ else ''}.md").write_text( + "\n".join(body), encoding="utf-8") if not ans.exists(): ans.write_text(f"# Ответ — пара {p}\n\nПОРЯДОК: \n\nПо вариантам:\n", encoding="utf-8") READ_KEY.write_text(json.dumps(key, ensure_ascii=False, indent=1), encoding="utf-8") print(f" {p}: глав {len(take)} · вариантов {len(READ_PANEL)} · " f"{sum(len(tx[a]) for _u, tx in take for a in READ_PANEL) // 1000} тыс. знаков") - print(f" пакет → {READ_DIR / f'ЧТЕНИЕ-{p}.md'} · ключ → {READ_KEY} (читателю НЕ давать)") + print(f" пакет → {READ_DIR}/ЧТЕНИЕ-{p}{('-' + tag_) if tag_ else ''}.md · " + f"ключ → {READ_KEY.name} (читателю НЕ давать)") def score_read() -> None: @@ -779,8 +792,11 @@ if __name__ == "__main__": elif a[0] == "--canon": canon() elif a[0] == "--emit-read": + _pan = next((x.split("=", 1)[1].split(",") for x in a if x.startswith("--panel=")), []) + _tag = next((x.split("=", 1)[1] for x in a if x.startswith("--tag=")), "") + _n = next((int(x.split("=", 1)[1]) for x in a if x.startswith("--n=")), 3) for x in ([y for y in a[1:] if y in PAIRS] or list(PAIRS)): - emit_read(x) + emit_read(x, _n, tuple(_pan), _tag) elif a[0] == "--score-read": score_read() elif a[0] == "--coverage":