訂明本例驗收任務
假設回應清單每次列已完成的安全整數毫秒,或到安全整數期限仍逾時。完成時間用 BigInt 相加;分子超出安全整數範圍用確切十進文字,較小結果仍用數值。完成時間不得為負或遲於期限;逾時須省略完成時間或用 null,已知完成時間與此狀態矛盾。列已完成平均的分子與分母、逾時數及總嘗試數。
- 分開完成及逾時狀態
- 核已知完成時間界限
- 平均值連同完成覆蓋一起報
時間矛盾便停止此時間報表。
使用已填個案
| 個案 | 已提供輸入 | 預期結構化結果 | 判斷及原因 |
|---|---|---|---|
| 兩次完成及一次逾時 | {"attempts":[{"status":"completed","durationMs":2000,"deadlineMs":10000},{"status":"completed","durationMs":4000,"deadlineMs":10000},{"status":"timeout","deadlineMs":10000}]} | {"attempts":3,"completed":2,"timeouts":1,"completedMean":[6000,2]} | 已完成平均 3000 毫秒;完成 2/3,逾時仍另列。 |
| 沒有完成時間 | {"attempts":[{"status":"timeout","deadlineMs":10000}]} | {"attempts":1,"completed":0,"timeouts":1,"completedMean":null} | 期限不是已知完成時間,平均值未知。 |
| 逾時卻帶已知完成時間 | {"attempts":[{"status":"timeout","durationMs":9000,"deadlineMs":10000}]} | {"error":"duration-ledger"} | 已知9000毫秒完成,不能列作到10000毫秒仍未完成。 |
| 安全輸入合計超出數值範圍 | {"attempts":[{"status":"completed","durationMs":9007199254740991,"deadlineMs":9007199254740991},{"status":"completed","durationMs":9007199254740991,"deadlineMs":9007199254740991},{"status":"completed","durationMs":1,"deadlineMs":1}]} | {"attempts":3,"completed":3,"timeouts":0,"completedMean":["18014398509481983",3]} | 確切分子是18014398509481983毫秒,用十進文字保留,不可錯寫成18014398509481984。 |
| 完成時間超過期限 | {"attempts":[{"status":"completed","durationMs":11000,"deadlineMs":10000}]} | {"error":"duration-ledger"} | 按本例期限模型,此次不能列完成。 |
逐步處理 completed-after-deadline 個案,須得到甚麼結果?原因是甚麼?
查看參考答案
{"error":"duration-ledger"}。按本例期限模型,此次不能列完成。
執行完整本機驗算
import assert from 'node:assert/strict';
function evaluate(x){
const completed=x.attempts.filter(a=>a.status==='completed');if(x.attempts.some(a=>!Number.isSafeInteger(a.deadlineMs)||a.deadlineMs<0||!['completed','timeout'].includes(a.status)||(a.status==='timeout'&&Object.hasOwn(a,'durationMs')&&a.durationMs!==null)||(a.status==='completed'&&(!Number.isSafeInteger(a.durationMs)||a.durationMs<0||a.durationMs>a.deadlineMs))))return {error:'duration-ledger'};
const sum=completed.reduce((s,a)=>s+BigInt(a.durationMs),0n),numerator=sum<=BigInt(Number.MAX_SAFE_INTEGER)?Number(sum):sum.toString();
return {attempts:x.attempts.length,completed:completed.length,timeouts:x.attempts.filter(a=>a.status==='timeout').length,completedMean:completed.length?[numerator,completed.length]:null};
}
const cases = [
{
"id": "one-timeout",
"input": {
"attempts": [
{
"status": "completed",
"durationMs": 2000,
"deadlineMs": 10000
},
{
"status": "completed",
"durationMs": 4000,
"deadlineMs": 10000
},
{
"status": "timeout",
"deadlineMs": 10000
}
]
},
"expected": {
"attempts": 3,
"completed": 2,
"timeouts": 1,
"completedMean": [
6000,
2
]
}
},
{
"id": "all-timeout",
"input": {
"attempts": [
{
"status": "timeout",
"deadlineMs": 10000
}
]
},
"expected": {
"attempts": 1,
"completed": 0,
"timeouts": 1,
"completedMean": null
}
},
{
"id": "timeout-known-duration",
"input": {
"attempts": [
{
"status": "timeout",
"durationMs": 9000,
"deadlineMs": 10000
}
]
},
"expected": {
"error": "duration-ledger"
}
},
{
"id": "exact-large-aggregate",
"input": {
"attempts": [
{
"status": "completed",
"durationMs": 9007199254740991,
"deadlineMs": 9007199254740991
},
{
"status": "completed",
"durationMs": 9007199254740991,
"deadlineMs": 9007199254740991
},
{
"status": "completed",
"durationMs": 1,
"deadlineMs": 1
}
]
},
"expected": {
"attempts": 3,
"completed": 3,
"timeouts": 0,
"completedMean": [
"18014398509481983",
3
]
}
},
{
"id": "completed-after-deadline",
"input": {
"attempts": [
{
"status": "completed",
"durationMs": 11000,
"deadlineMs": 10000
}
]
},
"expected": {
"error": "duration-ledger"
}
}
];
for (const c of cases) assert.deepEqual(evaluate(c.input), c.expected, c.id);
console.log(JSON.stringify({checked:cases.length,caseIds:cases.map(c=>c.id)}));
逾時仍在嘗試分母內。已完成平均只描述假設記錄,不承諾回應時間,也不估逾時項最終何時完成。