跳至內容
Astera Technology

計算作答時間時保留逾時個案

平均只算已完成時間,但逾時仍在總嘗試分母內。

下載完整個案資料及參考答案 ↓

訂明本例驗收任務

假設回應清單每次列已完成的安全整數毫秒,或到安全整數期限仍逾時。完成時間用 BigInt 相加;分子超出安全整數範圍用確切十進文字,較小結果仍用數值。完成時間不得為負或遲於期限;逾時須省略完成時間或用 null,已知完成時間與此狀態矛盾。列已完成平均的分子與分母、逾時數及總嘗試數。

  1. 分開完成及逾時狀態
  2. 核已知完成時間界限
  3. 平均值連同完成覆蓋一起報

時間矛盾便停止此時間報表。

使用已填個案

原創假設輸入及確切答案鍵
個案已提供輸入預期結構化結果判斷及原因
兩次完成及一次逾時{"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"}按本例期限模型,此次不能列完成。
下載可編輯 CSV ↓

逐步處理 completed-after-deadline 個案,須得到甚麼結果?原因是甚麼?

查看參考答案

{"error":"duration-ledger"}。按本例期限模型,此次不能列完成。

執行完整本機驗算

另存為 .mjs,以 Node.js 執行;只驗提供的個案
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)}));
下載可執行例子 ↓

逾時仍在嘗試分母內。已完成平均只描述假設記錄,不承諾回應時間,也不估逾時項最終何時完成。

相關資源