// ★ 择路排序器【自洽吗】—— TIE_TOL=5 是【容差】,而容差不传递。 // 一个不传递的比较器交给 Array.sort,结果是【实现定义】的:ranked[0] 可以不是极大元。 // 本表逐字写过:「『碰巧成立』和『守着』是两回事」。⇒ 跑出来。 import { DYNASTIES, computeAxes, getDynasty, AXES } from '../src/dynasties.js'; import { SUB_REGISTRY } from '../src/talents.js'; const SUBS = SUB_REGISTRY.map((s) => s.id); const TIE_TOL = 5; const clamp = (n, lo, hi) => Math.max(lo, Math.min(hi, n)); const xuanOf = (c) => (c && c.xuan) || { seat: 0, kemu: [], key: [] }; function lexCompare(a, b, val) { const ka = xuanOf(a).key || [], kb = xuanOf(b).key || []; const n = Math.min(ka.length, kb.length); for (let i = 0; i < n; i++) { const va = val(ka[i]), vb = val(kb[i]); if (Math.abs(va - vb) > TIE_TOL) return vb - va; } return 0; } let lexNonTrans = 0, cells = 0, tieNonEquiv = 0, tieNonEquivCells = 0; for (let m = 0; m < (1 << 16); m++) { const subs = []; for (let i = 0; i < 16; i++) if (m & (1 << i)) subs.push(SUBS[i]); const axes = computeAxes(subs); for (const wang of [0, 29, 30, 54, 55, 74, 75, 100]) for (const d of DYNASTIES) { const val = (k) => (k === 'wang' ? wang : k === 'lao' ? 0 : clamp(Number(axes[k] || 0), 0, 100)); const open = d.channels.filter((c) => Object.entries(c.gate || {}).every(([k, need]) => val(k) >= need)); if (open.length < 3) continue; cells++; const ceilOf = (c) => c.ceiling?.tier ?? 5; const tierOf = (c) => { const kemu = xuanOf(c).kemu || []; let n = 0; for (const k of kemu) { if (val(k.axis) >= k.need) n++; else break; } return clamp((xuanOf(c).seat || 0) + n, 0, ceilOf(c)); }; // ①【lexCompare 的「均」传递吗】A≈B、B≈C ⇒ A≈C ? for (const A of open) for (const B of open) for (const C of open) { if (A === B || B === C || A === C) continue; if (lexCompare(A, B, val) === 0 && lexCompare(B, C, val) === 0 && lexCompare(A, C, val) !== 0) lexNonTrans++; } // ②【老板判据的打平集合,内部两两真的都同 tier 同 ceiling 吗】(= 是等价关系吗) const best = open.slice().sort((a, b) => tierOf(b) - tierOf(a) || ceilOf(b) - ceilOf(a) || lexCompare(a, b, val) || 0)[0]; const tie = open.filter((c) => tierOf(c) === tierOf(best) && ceilOf(c) === ceilOf(best)); let bad = 0; for (const A of tie) for (const B of tie) if (A !== B && (tierOf(A) !== tierOf(B) || ceilOf(A) !== ceilOf(B))) bad++; tieNonEquiv += bad; if (bad) tieNonEquivCells++; } } const N = (n) => n.toLocaleString(); console.log(`\n扫了 ${N(cells)} 个【≥3 条路开着】的格子`); console.log(`①【lexCompare 的「均」不传递】的三元组:${N(lexNonTrans)} 次`); console.log(` ⇒ 容差关系 |a−b|≤5 【不是等价关系】。而 idx 的成员资格【是拿它定义的】。`); console.log(`②【老板判据(同 tier 同 ceiling)】内部不自洽:${N(tieNonEquiv)} 次(${N(tieNonEquivCells)} 格)`); console.log(` ⇒ 相等【是】等价关系。老板的判据是良定义的,我上一刀那个不是。`);