訂明本例驗收任務
假設選項表每行有明示註腳標記,另有標記與文字對照。只接該行自己的標記,沿原次序,重複只接一次。標記欠文字或值不是文字便列該行未確認;明示空字串仍保留為已提供文字,不推斷意思;沒有標記的行不可自行加限制。
- 讀各行的標記清單
- 逐個不同標記查文字
- 欠文字仍連回原行
對照欠標記文字便保留未確認。
使用已填個案
| 個案 | 已提供輸入 | 預期結構化結果 | 判斷及原因 |
|---|---|---|---|
| 一行有註腳、一行沒有 | {"notes":{"*":"review"},"rows":[{"id":"A","markers":["*"]},{"id":"B","markers":[]}]} | [{"id":"A","notes":["review"],"unknown":[],"resolved":true},{"id":"B","notes":[],"unknown":[],"resolved":true}] | review 只接 A;B 沒有提供限制。 |
| 有標記但欠文字 | {"notes":{},"rows":[{"id":"A","markers":["*"]}]} | [{"id":"A","notes":[],"unknown":["*"],"resolved":false}] | 保留欠文字的標記,不編造意思。 |
| 標記值是 null 而非文字 | {"notes":{"*":null},"rows":[{"id":"A","markers":["*"]}]} | [{"id":"A","notes":[],"unknown":["*"],"resolved":false}] | 標記鍵雖存在,卻沒有提供所需文字。 |
| 明示空白註腳文字 | {"notes":{"*":""},"rows":[{"id":"A","markers":["*"]}]} | [{"id":"A","notes":[""],"unknown":[],"resolved":true}] | 明示空字串沿用為文字,不編造限制。 |
| 同行標記重複 | {"notes":{"*":"review"},"rows":[{"id":"A","markers":["*","*"]}]} | [{"id":"A","notes":["review"],"unknown":[],"resolved":true}] | 同一標記只加一則註腳,不當兩個條件。 |
逐步處理 repeated-marker 個案,須得到甚麼結果?原因是甚麼?
查看參考答案
[{"id":"A","notes":["review"],"unknown":[],"resolved":true}]。同一標記只加一則註腳,不當兩個條件。
執行完整本機驗算
import assert from 'node:assert/strict';
function evaluate(x){
return x.rows.map(r=>{const markers=[...new Set(r.markers)],usable=m=>Object.hasOwn(x.notes,m)&&typeof x.notes[m]==='string',unknown=markers.filter(m=>!usable(m));return {id:r.id,notes:markers.filter(m=>usable(m)).map(m=>x.notes[m]),unknown,resolved:unknown.length===0};});
}
const cases = [
{
"id": "marked-and-unmarked",
"input": {
"notes": {
"*": "review"
},
"rows": [
{
"id": "A",
"markers": [
"*"
]
},
{
"id": "B",
"markers": []
}
]
},
"expected": [
{
"id": "A",
"notes": [
"review"
],
"unknown": [],
"resolved": true
},
{
"id": "B",
"notes": [],
"unknown": [],
"resolved": true
}
]
},
{
"id": "unknown-marker",
"input": {
"notes": {},
"rows": [
{
"id": "A",
"markers": [
"*"
]
}
]
},
"expected": [
{
"id": "A",
"notes": [],
"unknown": [
"*"
],
"resolved": false
}
]
},
{
"id": "nontext-note-content",
"input": {
"notes": {
"*": null
},
"rows": [
{
"id": "A",
"markers": [
"*"
]
}
]
},
"expected": [
{
"id": "A",
"notes": [],
"unknown": [
"*"
],
"resolved": false
}
]
},
{
"id": "explicit-empty-note-text",
"input": {
"notes": {
"*": ""
},
"rows": [
{
"id": "A",
"markers": [
"*"
]
}
]
},
"expected": [
{
"id": "A",
"notes": [
""
],
"unknown": [],
"resolved": true
}
]
},
{
"id": "repeated-marker",
"input": {
"notes": {
"*": "review"
},
"rows": [
{
"id": "A",
"markers": [
"*",
"*"
]
}
]
},
"expected": [
{
"id": "A",
"notes": [
"review"
],
"unknown": [],
"resolved": true
}
]
}
];
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)}));
保留行、標記及文字關係供下一步解讀。接註腳成功,不等於已判斷文字是否給予資格或許可。