訂判斷及所需輸入
第零及十分鐘觸發,每輪十二分鐘。題內排隊規則第二輪十二才開始、二十四完;重疊路徑十就開始、二十二完。跳過規則只跑第一輪,第十要明記已跳。
| 情況 | 輸入 JSON |
|---|---|
| 原例測試 | {"policy":"queue","triggers":[0,10],"duration":12} |
跑所附比較
固定本地排程器真正建立各輪原定、開始及完成時間,只訂本例應怎樣執行,不代表平台功能或正式效能。
| 路徑 | 輸出 JSON |
|---|---|
| 錯誤路徑 | {"runs":[{"scheduled":0,"start":0,"finish":12},{"scheduled":10,"start":10,"finish":22}],"skipped":[]} |
| 所需路徑 | {"runs":[{"scheduled":0,"start":0,"finish":12},{"scheduled":10,"start":12,"finish":24}],"skipped":[]} |
import assert from 'node:assert/strict';
const run=function run(i,corrected=true){
if(!['queue','skip','overlap'].includes(i.policy))return {held:true};
const runs=[],skipped=[];let busyUntil=-Infinity;
for(const scheduled of i.triggers){const policy=corrected?i.policy:'overlap';if(policy==='skip'&&scheduled<busyUntil){skipped.push(scheduled);continue;}
const start=policy==='queue'?Math.max(scheduled,busyUntil):scheduled;const finish=start+i.duration;runs.push({scheduled,start,finish});busyUntil=Math.max(busyUntil,finish);}
return {runs,skipped};
};
const cases=[{"input":{"policy":"queue","triggers":[0,10],"duration":12},"corrected":false,"expected":{"runs":[{"scheduled":0,"start":0,"finish":12},{"scheduled":10,"start":10,"finish":22}],"skipped":[]}},{"input":{"policy":"queue","triggers":[0,10],"duration":12},"corrected":true,"expected":{"runs":[{"scheduled":0,"start":0,"finish":12},{"scheduled":10,"start":12,"finish":24}],"skipped":[]}},{"input":{"policy":"skip","triggers":[0,10],"duration":12},"corrected":true,"expected":{"runs":[{"scheduled":0,"start":0,"finish":12}],"skipped":[10]}},{"input":{"policy":"queue","triggers":[0,10],"duration":10},"corrected":true,"expected":{"runs":[{"scheduled":0,"start":0,"finish":10},{"scheduled":10,"start":10,"finish":20}],"skipped":[]}},{"input":{"policy":null,"triggers":[0,10],"duration":12},"corrected":true,"expected":{"held":true}}];
for(const test of cases){const actual=await run(test.input,test.corrected);assert.deepEqual(actual,test.expected);console.log(actual);}
按邊界依據作判斷
若每輪剛好十分鐘,下輪十可開始而不重疊;規則欠缺便先停,不計所謂應有輸出。
- 核重疊時如何處理
- 跑題內觸發紀錄
- 核各輪及已跳觸發
只說有排程,未代表會排隊。
| 條件 | 輸入 JSON | 預期輸出 JSON |
|---|---|---|
| 正忙時明訂跳過 | {"policy":"skip","triggers":[0,10],"duration":12} | {"runs":[{"scheduled":0,"start":0,"finish":12}],"skipped":[10]} |
| 剛完便可開始下一輪 | {"policy":"queue","triggers":[0,10],"duration":10} | {"runs":[{"scheduled":0,"start":0,"finish":10},{"scheduled":10,"start":10,"finish":20}],"skipped":[]} |
| 重疊處理未訂 | {"policy":null,"triggers":[0,10],"duration":12} | {"held":true} |
原例排隊後,第二輪在哪段時間?
查看參考答案
十二至二十四,對原定十的觸發。十至二十二是重疊規則的結果。