訂判斷及所需輸入
以下是虛構計價點數,不是供應商實價。逐段計法首十單位各兩點,超出各一點;整段計法則超過十後全部各一點。十二單位分別得二十二及十二,先訂算法才可比總數。
| 情況 | 輸入 JSON |
|---|---|
| 原例測試 | {"units":12,"rule":"marginal"} |
跑所附比較
程序按已列函數計,不靠「用量優惠」猜。十單位兩路都二十;十一便分成二十一及十一,示範要留這個有分別的個案。
| 路徑 | 輸出 JSON |
|---|---|
| 錯誤路徑 | {"quotedRule":"marginal","fictionalCredits":12} |
| 所需路徑 | {"quotedRule":"marginal","fictionalCredits":22} |
import assert from 'node:assert/strict';
const run=function run(i,corrected=true){
if(!Number.isInteger(i.units)||i.units<0||!['marginal','whole-band'].includes(i.rule))return {held:true};
const marginal=Math.min(i.units,10)*2+Math.max(i.units-10,0);
const whole=i.units*(i.units>10?1:2);
return {quotedRule:i.rule,fictionalCredits:corrected?(i.rule==='marginal'?marginal:whole):whole};
};
const cases=[{"input":{"units":12,"rule":"marginal"},"corrected":false,"expected":{"quotedRule":"marginal","fictionalCredits":12}},{"input":{"units":12,"rule":"marginal"},"corrected":true,"expected":{"quotedRule":"marginal","fictionalCredits":22}},{"input":{"units":10,"rule":"marginal"},"corrected":true,"expected":{"quotedRule":"marginal","fictionalCredits":20}},{"input":{"units":11,"rule":"marginal"},"corrected":true,"expected":{"quotedRule":"marginal","fictionalCredits":21}},{"input":{"units":11,"rule":"whole-band"},"corrected":true,"expected":{"quotedRule":"whole-band","fictionalCredits":11}},{"input":{"units":12,"rule":null},"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 |
|---|---|---|
| 剛好十單位 | {"units":10,"rule":"marginal"} | {"quotedRule":"marginal","fictionalCredits":20} |
| 首個超出單位 | {"units":11,"rule":"marginal"} | {"quotedRule":"marginal","fictionalCredits":21} |
| 整段計法首個超出 | {"units":11,"rule":"whole-band"} | {"quotedRule":"whole-band","fictionalCredits":11} |
| 計價規則未訂 | {"units":12,"rule":null} | {"held":true} |
十單位總數相同,可確定是逐段計嗎?
查看參考答案
不能,兩路都二十。十一單位時逐段二十一、整段十一;須取明訂規則並保留兩個測試。