訂判斷及所需輸入
假設觀察 A 冷啟動8、9 秒,已熱身1、2;B 冷啟動10、12。所需比較是冷,平均應8.5、11。拿 A 熱身平均1.5 配 B 冷11,就把測試條件說錯。
| 情況 | 輸入 JSON |
|---|---|
| 原例測試 | {"condition":"cold","observations":[{"offer":"A","condition":"cold","seconds":8},{"offer":"A","condition":"cold","seconds":9},{"offer":"A","condition":"warm","seconds":1},{"offer":"A","condition":"warm","seconds":2},{"offer":"B","condition":"cold","seconds":10},{"offer":"B","condition":"cold","seconds":12}]} |
跑所附比較
可執行選取先配條件才計平均。時間只是題內紀錄,不是供應商實測或未來服務預測。
| 路徑 | 輸出 JSON |
|---|---|
| 錯誤路徑 | {"condition":"cold","means":{"A":1.5,"B":11}} |
| 所需路徑 | {"condition":"cold","means":{"A":8.5,"B":11}} |
import assert from 'node:assert/strict';
const run=function run(i,corrected=true){
if(!['warm','cold'].includes(i.condition)||i.observations.some(r=>!Number.isFinite(r.seconds)||r.seconds<0))return {held:true};
const groups={A:i.observations.filter(r=>r.offer==='A'&&r.condition===(corrected?i.condition:'warm')),B:i.observations.filter(r=>r.offer==='B'&&r.condition===i.condition)};
const missing=Object.keys(groups).filter(k=>groups[k].length===0);if(missing.length)return {held:true,missing};
const means=Object.fromEntries(Object.entries(groups).map(([k,rs])=>[k,rs.reduce((s,r)=>s+r.seconds,0)/rs.length]));return {condition:i.condition,means};
};
const cases=[{"input":{"condition":"cold","observations":[{"offer":"A","condition":"cold","seconds":8},{"offer":"A","condition":"cold","seconds":9},{"offer":"A","condition":"warm","seconds":1},{"offer":"A","condition":"warm","seconds":2},{"offer":"B","condition":"cold","seconds":10},{"offer":"B","condition":"cold","seconds":12}]},"corrected":false,"expected":{"condition":"cold","means":{"A":1.5,"B":11}}},{"input":{"condition":"cold","observations":[{"offer":"A","condition":"cold","seconds":8},{"offer":"A","condition":"cold","seconds":9},{"offer":"A","condition":"warm","seconds":1},{"offer":"A","condition":"warm","seconds":2},{"offer":"B","condition":"cold","seconds":10},{"offer":"B","condition":"cold","seconds":12}]},"corrected":true,"expected":{"condition":"cold","means":{"A":8.5,"B":11}}},{"input":{"condition":"warm","observations":[{"offer":"A","condition":"warm","seconds":1}]},"corrected":true,"expected":{"held":true,"missing":["B"]}},{"input":{"condition":"warm","observations":[{"offer":"A","condition":"warm","seconds":1},{"offer":"A","condition":"warm","seconds":2},{"offer":"B","condition":"warm","seconds":2},{"offer":"B","condition":"warm","seconds":3}]},"corrected":true,"expected":{"condition":"warm","means":{"A":1.5,"B":2.5}}}];
for(const test of cases){const actual=await run(test.input,test.corrected);assert.deepEqual(actual,test.expected);console.log(actual);}
按邊界依據作判斷
比較熱身卻欠 B 熱身觀察,要停;兩組都齊時1.5、2.5 才可按那另一條件比。
- 訂所需啟動條件
- 兩方案各取相符觀察
- 才計平均及標條件
相符觀察欠缺便保未知,不等於慢或失敗。
| 條件 | 輸入 JSON | 預期輸出 JSON |
|---|---|---|
| 欠相同條件的方案觀察 | {"condition":"warm","observations":[{"offer":"A","condition":"warm","seconds":1}]} | {"held":true,"missing":["B"]} |
| 兩方案熱身觀察齊備 | {"condition":"warm","observations":[{"offer":"A","condition":"warm","seconds":1},{"offer":"A","condition":"warm","seconds":2},{"offer":"B","condition":"warm","seconds":2},{"offer":"B","condition":"warm","seconds":3}]} | {"condition":"warm","means":{"A":1.5,"B":2.5}} |
原例冷啟動比較,應用哪兩個平均?
查看參考答案
A 8.5 秒、B 11 秒。A 1.5 屬已熱身,不能改標冷啟動。