From 02380bb7d11d51239da734393dd4854097d2b833 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Wed, 4 Nov 2026 19:06:36 +0900 Subject: [PATCH] =?UTF-8?q?fix(781-2):=20=EC=98=88=EC=8B=9C=201=20?= =?UTF-8?q?=EA=B7=BC=EA=B1=B0=20=3D=20=EA=B1=B4=EC=84=A4=20=EA=B3=B5?= =?UTF-8?q?=ED=86=B5=201-2-7=20=EC=9D=B8=EB=A0=A5=EC=9A=B4=EB=B0=98(?= =?UTF-8?q?=EC=A7=80=EA=B2=8C)=20=E2=80=94=20=EC=A1=B0=ED=95=AD=20?= =?UTF-8?q?=EA=B0=99=EC=9D=8C=20=EB=8D=A4=20=C2=B7=20=EC=A1=B0=ED=95=AD=20?= =?UTF-8?q?=EC=A0=90=EC=88=98=20=C2=B7=20=EA=B7=BC=EA=B1=B0=20=EC=B9=A9=20?= =?UTF-8?q?=ED=88=B4=ED=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fit: 인용 조항 같음 로직에 이름 1위와 같은 덤(fuse) · 조항 가중 1.5 → 2.0 — 북부청 임도 단산10 1위 GF000214 야면석 채집 → GC001140 인력운반(지게) · 골든 1위 162 → 163(사람 120 · 새 43) · 다른 점 틀림 0 → 1(N006 정답표가 짐작 GF000280 인 줄 — 새 로직이 맞는 근거) - 화면: 근거 칩 툴팁 로직 null 일 때 「null · 기초 없음」 → 「기초 없음」 - test_628: 예시1 시험을 새 뜻(근거 GC001140 · 기초 없음 표지 없음)으로 · 표지 수 19 → 18(공통 1-2-7 인용 블록은 여덟 파일 중 단산10 하나) · 우리 지문표 없으면 만들고 시작 Co-Authored-By: Claude Sonnet 5.5 --- M02_MasterTemplete/M02_Hopyo_Fit.py | 10 ++++++- .../M02_MasterTemplete_Hopyo_WizardSk.ts | 3 +- .../tester/test_628_hopyo_clause_part.py | 28 ++++++++++--------- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/M02_MasterTemplete/M02_Hopyo_Fit.py b/M02_MasterTemplete/M02_Hopyo_Fit.py index c740422ce..147df4691 100644 --- a/M02_MasterTemplete/M02_Hopyo_Fit.py +++ b/M02_MasterTemplete/M02_Hopyo_Fit.py @@ -40,7 +40,7 @@ W = { "율": 0.3, "단위": 0.5, "조건": 0.6, - "조항": 1.5, + "조항": 2.0, "이름": 0.6, } BETA = 1.0 @@ -256,6 +256,14 @@ def sure(e: dict, pool: list[tuple]) -> bool: def fuse(e: dict, pool: list[tuple], border: list[str]) -> list[str]: """지문 점수 + BETA × 이름 · 근거 차례 덤 → 위 다섯.""" bonus = {k: RB[i] for i, k in enumerate(border[:5])} + for ( + _, + k, + ch, + _, + ) in pool: # 인용 조항 같음 = 이름 1위와 같은 덤(782 · 이름이 다른 로직을 가리켜도) + if (ch.get("조항") or 0) >= 1.0: + bonus[k] = max(bonus.get(k, 0), RB[0]) cand = {k: s for s, k, _, _ in pool} by = {o["로직"]: o for o in prepared() or []} table = hopyo_basis.ours() diff --git a/M02_MasterTemplete/M02_MasterTemplete_Hopyo_WizardSk.ts b/M02_MasterTemplete/M02_MasterTemplete_Hopyo_WizardSk.ts index af7986578..41cdc5eeb 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_Hopyo_WizardSk.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_Hopyo_WizardSk.ts @@ -230,7 +230,8 @@ export function sangeunStep( const verdict = createBadge(word, word === GOOD ? "success" : "info"); verdict.dataset.skVerdict = String(b.번); const basis = b.근거 ? createBadge(`${L("M02_SkBasisTag")} ${b.근거.이름 ?? b.근거.로직}`, "neutral") : "—"; // prettier-ignore - if (basis instanceof HTMLElement) basis.title = `${b.근거!.로직} · ${b.근거!.판정 ?? ""}`; + if (basis instanceof HTMLElement) + basis.title = [b.근거!.로직, b.근거!.판정].filter(Boolean).join(" · "); const made = b.만든 ? createBadge(b.만든, "success") : "—"; const ok = canConfirm(b, picks); const sure = createToggle({ diff --git a/resources/tester/test_628_hopyo_clause_part.py b/resources/tester/test_628_hopyo_clause_part.py index 0dba667cd..53aea3f57 100644 --- a/resources/tester/test_628_hopyo_clause_part.py +++ b/resources/tester/test_628_hopyo_clause_part.py @@ -3,8 +3,8 @@ 책 낱말(임도 · 사방 = 옛 책 · 건설 부문 낱말) · 부문 풀이(북부청임도 단산10 → 건설 공통 1-2-7 · 영월 「건설표준품셈 9-1」 → 번호 뜻 안 맞음 = (옛)) · 임도 옛 번호 → 대응표 현행 번호 · -조항 견줌은 책 + 부문 · 예시 1(단산10 근거 = 「기초 없음 — 건설 공통 1-2-7 운반」 · -줄 금액 94,227.7 그대로) · 번호만 같은 다른 부문 · 옛 번호 로직이 1위 · 다섯 안에 안 듦 +조항 견줌은 책 + 부문 · 예시 1(단산10 근거 = 건설 공통 1-2-7 인력운반(지게) GC001140 · +782-1 새 로직 · 줄 금액 94,227.7 그대로) · 번호만 같은 다른 부문 · 옛 번호 로직이 1위 · 다섯 안에 안 듦 (봉화 깬잡석채집 · 영월 콘크리트소운반) · 여덟 파일 표지 수. 읽기만 · 서버 없음 · master_data 그대로. """ @@ -19,6 +19,7 @@ from M01_MasterData import M01_MasterData_Store as m01 from M02_MasterTemplete import M02_Hopyo_Basis as hb from M02_MasterTemplete import M02_Hopyo_Fit as fit from M02_MasterTemplete import M02_Hopyo_Match as hm +from M02_MasterTemplete import M02_Hopyo_Ours as ours from M02_MasterTemplete import M02_Hopyo_ReadEst as est from M02_MasterTemplete import M02_Hopyo_Sangeun as sangeun from M02_MasterTemplete import M02_Hopyo_SkUnit as skunit @@ -26,7 +27,11 @@ from M02_MasterTemplete import M02_Hopyo_Units as units from M02_MasterTemplete import M02_Hopyo_Verdict as verdict from resources.tester import helper_m02_hopyo_golden as golden -NO_BASIS = "근거 조항 우리 기초에 없음 — 건설품셈 공통 1-2-7 운반" + +@pytest.fixture(scope="module", autouse=True) +def _ours_ready(): + if not ours.ready(): # 맞춤셈은 우리 지문표가 있어야 돎(판이 바뀌면 다시) + ours.build() def _block(tag: str, no: int) -> dict: @@ -69,20 +74,17 @@ def test_조항_견줌_부문(): assert hb.clause([["건설품셈", "1-2-7"]], ours[code])[0] == 1.0 # 부문 모름 = 그대로 -def test_예시1_기초_없음(): +def test_예시1_근거_인력운반_지게(): block, line = _unit("북부청임도", 10) + assert hb.no_basis(block["출처"]) is None # 782-1 로직이 생겨 기초 없음 아님 got = verdict.block(block, line, hm.targets()) - assert got["기초없음"]["판정"] == "기초 없음" - assert NO_BASIS in got["판정"]["꼬리표"] - assert all(c["글"] == verdict.OUTSIDE for c in got["후보"] if c["판정"] != "맞음") + assert "기초없음" not in got + assert got["차례"][0] == "GC001140" # 지게(사람 줄) — 1141 기계설비 · 1142 벽돌 아님 maker = sangeun.Maker.__new__(sangeun.Maker) maker.first, maker.blocks, maker.whole = {10: line}, {10: block}, m01.loaded()[1] maker.cache = {fit.unit_key(line): got} - assert maker.basis(10) == { - "로직": None, - "이름": "기초 없음 — 건설 공통 1-2-7 운반", - "판정": "기초 없음", - } + basis = maker.basis(10) + assert basis["로직"] == "GC001140" and basis["이름"].startswith("인력운반(지게)") judged = skunit.judge(block, units.Units(), lambda sub: None, None, "㎡") assert judged["판정"] == "옮길 수 있음" and judged["우리금액"] == pytest.approx(94227.7, abs=1) rows = [r for r in judged["더한줄"] if r.get("요소") == "LB000002"] @@ -113,5 +115,5 @@ def test_여덟_파일_표지_수(): for tag in golden.FILES: for block in golden.read(tag)["단산"]: seen[(hb.no_basis(block["출처"]) or {}).get("판정")] += 1 - assert seen["기초 없음"] == 19 + assert seen["기초 없음"] == 18 # 782-1 로 북부청 임도 단산10(공통 1-2-7) 하나 빠짐 assert seen["옛 번호"] == 121