fix(782-3): 8-2 시공능력 로직 「0 이면 기본」 가드 칸 — 견본 자동값 1 로도 엉뚱한 값 안 나오게(분석 635)

- 가드 칸에 범위 [0, 원문 끝] — 견본 자동값 = 0(원문 기본): E입력 [0, 1](원문 E 표 모두 1 이하) · 굴착기 싸이클입력 [0, 30](원문 3 표 13∼30초) · 디젤 해머 α입력 [0, 4.0] · 워터제트 α입력 [0, 1.20] · 펌프준설 q입력 [0, 387] · 그래브 f입력 · k입력 [0, 1.00] · 콘크리트 운반 배출 [0, 4] · 대기 [0, 10] · 하역 [0, 2]
- 범위 없는 가드 칸(트랜처 전진 · 후진거리 · 로더 주행거리 · 스테이빌라이저 혼합횟수 · 플랜트싸이클)은 1 이어도 기본의 3배 안 — 그대로
- 압쇄기 · 골재세척 q입력 뺌(원문 q 한 값 · 1 이면 60배 어긋남) · 스테이빌라이저 유효혼합폭 최대(로터폭 − 0.4, 0)(자동값 음수 막음)
- 유압 파일 해머 강관 Ta 표 「16이하」 ↔ β 표 「16 이하」 글자 맞춤(16m 이하 줄 못 찾던 흠) · 그래브 N값 고르기 「해당 없음」 끝으로(첫 값 = 표 줄)
- 지킴 시험 test_782_3 가드 칸 자동값 덧 · 기존 로직 · 표 · 키 그대로(로직_08장 새 줄만 바뀜) · check_master 전후 같음 · 계산전부 1513 멈춤 0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-04 20:09:23 +09:00
co-authored by Claude Opus 5.5
parent 53e2c22df6
commit 8ddb5bbda7
6 changed files with 130 additions and 77 deletions
@@ -234,3 +234,32 @@ def test_check_master():
for row in files[name]["줄"]:
if row["키"] >= "GC001143":
mf.run(whole, row["키"], cm.시험입력(row)) # 시험 입력으로 멈춤 없음
GUARD = __import__("re").compile(r"만약\((\w+) > 0, \1,")
def test_가드_칸_자동값(whole):
# 분석 635 — 「0 이면 기본」 가드 칸은 견본 자동값 1 로 셈해도 터무니없지 않게:
# 범위 [0, 원문 끝] 칸은 자동값 0(= 원문 기본) · 범위 없는 가드 칸은 1 이어도 기본의 10배 안
import master_auto as ma
files = cm.load([LOGIC, LOGIC13])
rows = [r for f in files.values() for r in f["줄"] if r["키"] >= "GC001143"]
loose = set()
for row in rows:
auto = ma.values(whole, row)
got = mf.run(whole, row["키"], auto)
value = got.get("결과", got.get("계"))
assert value >= 0, row["키"]
spec = {i["이름"]: i for i in row["입력"]}
for name in GUARD.findall(" ".join(ma._texts(row))):
if "범위" in spec.get(name, {}):
assert auto[name] == 0, (row["키"], name)
elif name in spec:
loose.add(name)
base = cm.시험입력(row)
zero = mf.run(whole, row["키"], {**base, name: 0})["결과"]
one = mf.run(whole, row["키"], {**base, name: 1})["결과"]
assert one / zero < 10, (row["키"], name)
assert loose == {"전진거리", "후진거리", "주행거리", "혼합횟수", "플랜트싸이클"}