訂判斷及所需輸入
本例三份假設報價採不同單位。名冊有十二帳戶,指定月份八個有活躍標記;題內同時使用紀錄已列齊變化,最多三個不同帳戶。若報價按具名帳戶收席位,就須用十二,不能換成三。
| 情況 | 輸入 JSON |
|---|---|
| 原例測試 | {"basis":"named","traceComplete":true,"accounts":[{"id":1,"active":true},{"id":2,"active":true},{"id":3,"active":true},{"id":4,"active":true},{"id":5,"active":true},{"id":6,"active":true},{"id":7,"active":true},{"id":8,"active":true},{"id":9,"active":false},{"id":10,"active":false},{"id":11,"active":false},{"id":12,"active":false}],"samples":[{"accounts":[1,2]},{"accounts":[1,2,3]}]} |
跑所附比較
數量旁須寫計法。這些是題內比較資料,並非客戶用量結果。真正示範要先訂清收費單位及紀錄是否完整,才可據此判斷高峰。
| 路徑 | 輸出 JSON |
|---|---|
| 錯誤路徑 | {"basis":"named","count":3} |
| 所需路徑 | {"basis":"named","count":12} |
import assert from 'node:assert/strict';
const run=function run(i,corrected=true){
if(!['named','active','concurrent'].includes(i.basis))return {held:true,reason:'unit-basis-missing'};
if(corrected&&i.basis==='concurrent'&&i.traceComplete!==true)return {held:true,reason:'concurrency-trace-incomplete'};
const named=i.accounts.length,active=i.accounts.filter(a=>a.active).length;
const concurrent=Math.max(0,...i.samples.map(s=>new Set(s.accounts).size));
return {basis:i.basis,count:corrected?({named,active,concurrent})[i.basis]:concurrent};
};
const cases=[{"input":{"basis":"named","traceComplete":true,"accounts":[{"id":1,"active":true},{"id":2,"active":true},{"id":3,"active":true},{"id":4,"active":true},{"id":5,"active":true},{"id":6,"active":true},{"id":7,"active":true},{"id":8,"active":true},{"id":9,"active":false},{"id":10,"active":false},{"id":11,"active":false},{"id":12,"active":false}],"samples":[{"accounts":[1,2]},{"accounts":[1,2,3]}]},"corrected":false,"expected":{"basis":"named","count":3}},{"input":{"basis":"named","traceComplete":true,"accounts":[{"id":1,"active":true},{"id":2,"active":true},{"id":3,"active":true},{"id":4,"active":true},{"id":5,"active":true},{"id":6,"active":true},{"id":7,"active":true},{"id":8,"active":true},{"id":9,"active":false},{"id":10,"active":false},{"id":11,"active":false},{"id":12,"active":false}],"samples":[{"accounts":[1,2]},{"accounts":[1,2,3]}]},"corrected":true,"expected":{"basis":"named","count":12}},{"input":{"basis":"active","accounts":[{"id":1,"active":true},{"id":2,"active":false}],"samples":[{"accounts":[1]}]},"corrected":true,"expected":{"basis":"active","count":1}},{"input":{"basis":null,"accounts":[],"samples":[]},"corrected":true,"expected":{"held":true,"reason":"unit-basis-missing"}},{"input":{"basis":"concurrent","traceComplete":false,"accounts":[{"id":1,"active":true},{"id":2,"active":true}],"samples":[{"accounts":[1,2]}]},"corrected":true,"expected":{"held":true,"reason":"concurrency-trace-incomplete"}},{"input":{"basis":"concurrent","traceComplete":true,"accounts":[{"id":1,"active":true},{"id":2,"active":true}],"samples":[{"accounts":[1,1,2]},{"accounts":[1]}]},"corrected":true,"expected":{"basis":"concurrent","count":2}}];
for(const test of cases){const actual=await run(test.input,test.corrected);assert.deepEqual(actual,test.expected);console.log(actual);}
按邊界依據作判斷
活躍模式的邊界只有一個活躍帳戶。缺席位定義便暫停,不能挑最小數補上。
- 先核報價計法
- 取對應的觀察數
- 把計法連數量記下
計法未訂,或紀錄未齊,先暫停判斷高峰是否足夠。
| 條件 | 輸入 JSON | 預期輸出 JSON |
|---|---|---|
| 按月內活躍計 | {"basis":"active","accounts":[{"id":1,"active":true},{"id":2,"active":false}],"samples":[{"accounts":[1]}]} | {"basis":"active","count":1} |
| 席位計法欠缺 | {"basis":null,"accounts":[],"samples":[]} | {"held":true,"reason":"unit-basis-missing"} |
| 同時使用紀錄未齊 | {"basis":"concurrent","traceComplete":false,"accounts":[{"id":1,"active":true},{"id":2,"active":true}],"samples":[{"accounts":[1,2]}]} | {"held":true,"reason":"concurrency-trace-incomplete"} |
| 完整紀錄按不同帳戶計 | {"basis":"concurrent","traceComplete":true,"accounts":[{"id":1,"active":true},{"id":2,"active":true}],"samples":[{"accounts":[1,1,2]},{"accounts":[1]}]} | {"basis":"concurrent","count":2} |
原例按具名帳戶報價,應填幾個席位?
查看參考答案
十二。八是月內活躍,三是題內同時使用高峰,均不會改變按帳戶的單位。