diff --git a/src/main.ts b/src/main.ts index 77870ab..22e1b47 100644 --- a/src/main.ts +++ b/src/main.ts @@ -74,10 +74,10 @@ app.innerHTML = ` 显影 - 14% + 15% 留下多少原文词语 - + @@ -86,7 +86,14 @@ app.innerHTML = ` 100% 结果相对原文的总长度 - + diff --git a/src/mosaic.test.ts b/src/mosaic.test.ts index dd0bb1a..82627a6 100644 --- a/src/mosaic.test.ts +++ b/src/mosaic.test.ts @@ -36,6 +36,14 @@ describe('selectKeywords', () => { expect(candidates.some((candidate) => candidate.selected)).toBe(true) }) + + it('显影 0% 不保留词语,100% 保留全部候选词', () => { + const hidden = selectKeywords(SOURCE, 0, 1) + const revealed = selectKeywords(SOURCE, 100, 1) + + expect(hidden.some((candidate) => candidate.selected)).toBe(false) + expect(revealed.every((candidate) => candidate.selected)).toBe(true) + }) }) describe('generateMosaic', () => { @@ -74,6 +82,22 @@ describe('generateMosaic', () => { expect(ratio).toBeLessThanOrEqual(1.03) }) + it('支持将体量压缩到 10% 或膨胀到 1000%', () => { + const compressed = generateMosaic(SOURCE, [], { + volume: 10, + disorder: 0, + seed: 42, + }) + const expanded = generateMosaic(SOURCE, [], { + volume: 1000, + disorder: 0, + seed: 42, + }) + + expect(compressed.outputLength).toBe(Math.round(compressed.inputLength * 0.1)) + expect(expanded.outputLength).toBe(expanded.inputLength * 10) + }) + it('相同种子可复现,不同种子会重新侵蚀', () => { const candidates = selectKeywords(SOURCE, 14, 1) const first = generateMosaic(SOURCE, candidates, { diff --git a/src/mosaic.ts b/src/mosaic.ts index 113490e..dcce973 100644 --- a/src/mosaic.ts +++ b/src/mosaic.ts @@ -345,13 +345,13 @@ export function selectKeywords( return candidates } - const desiredCount = Math.min( - candidates.length, - Math.max( - candidates.length >= 4 ? 2 : 1, - Math.round(candidates.length * (retention / 100)), - ), - ) + const desiredCount = + retention <= 0 + ? 0 + : Math.min( + candidates.length, + Math.max(1, Math.ceil(candidates.length * (retention / 100))), + ) const ranked = [...candidates].sort( (left, right) => right.score - left.score || left.start - right.start, )