訂明本例驗收任務
假設助手按原次序逐段放入內容;每段不可拆,放得下就保留,太大便略過繼續。大小用本例單位,不當作供應商 token。另提供必需段落編號;結果要列保留段落、餘額及被擠走的必需項。
- 沿提供次序查看
- 保留放得下段落並扣餘額
- 核對已放入的必需依據
大小無效便停止這次組裝核對。
使用已填個案
| 個案 | 已提供輸入 | 預期結構化結果 | 判斷及原因 |
|---|---|---|---|
| 無關段落先放入 | {"budget":7,"blocks":[{"id":"A","size":4},{"id":"B","size":3},{"id":"C","size":2}],"required":["B","C"]} | {"kept":["A","B"],"remaining":0,"missing":["C"]} | 搜尋有 C,但本例組裝在 C 前已用完七單位。 |
| 略過太大段落仍繼續 | {"budget":3,"blocks":[{"id":"A","size":4},{"id":"C","size":2}],"required":["C"]} | {"kept":["C"],"remaining":1,"missing":[]} | 略過 A 不會停止;C 放得下,餘一單位。 |
| 段落大小為負數 | {"budget":3,"blocks":[{"id":"C","size":-1}],"required":["C"]} | {"error":"size"} | 負數會虛增餘額,必須拒絕。 |
逐步處理 invalid-size 個案,須得到甚麼結果?原因是甚麼?
查看參考答案
{"error":"size"}。負數會虛增餘額,必須拒絕。
執行完整本機驗算
import assert from 'node:assert/strict';
function evaluate(x){
if(!Number.isInteger(x.budget)||x.budget<0||x.blocks.some(b=>!Number.isInteger(b.size)||b.size<1))return {error:'size'};
let remaining=x.budget;const kept=[];for(const b of x.blocks)if(b.size<=remaining){remaining-=b.size;kept.push(b.id);}
return {kept,remaining,missing:x.required.filter(id=>!kept.includes(id)).sort()};
}
const cases = [
{
"id": "distractor-first",
"input": {
"budget": 7,
"blocks": [
{
"id": "A",
"size": 4
},
{
"id": "B",
"size": 3
},
{
"id": "C",
"size": 2
}
],
"required": [
"B",
"C"
]
},
"expected": {
"kept": [
"A",
"B"
],
"remaining": 0,
"missing": [
"C"
]
}
},
{
"id": "skip-large-continue",
"input": {
"budget": 3,
"blocks": [
{
"id": "A",
"size": 4
},
{
"id": "C",
"size": 2
}
],
"required": [
"C"
]
},
"expected": {
"kept": [
"C"
],
"remaining": 1,
"missing": []
}
},
{
"id": "invalid-size",
"input": {
"budget": 3,
"blocks": [
{
"id": "C",
"size": -1
}
],
"required": [
"C"
]
},
"expected": {
"error": "size"
}
}
];
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)}));
用這份記錄找出搜尋後在哪一步漏依據。改組裝方法就另訂規則及個案;此例沒有求最有價值的組合。