Make the blind-reading panel and packet name parameters now that reading is the standing instrument

This commit is contained in:
Claude (backend session) 2026-08-20 19:56:14 +03:00
parent 3075566104
commit 276c85b4be

View file

@ -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":