訂明本例驗收任務
假設程序搜尋的可用文件編號已標明,最多十題、每題最多十個結果。本例自訂:第一份可用文件排第 r 位,該題取 1/r;找不到取零,再計題目平均。位置由一開始,答案用確切分數;這是自訂計分法,不是實測表現或發布門檻。
- 逐題找第一個可用位置
- 找不到的題目取零
- 按確切倒數計平均
先標明可用文件,才可計分。
使用已填個案
| 個案 | 已提供輸入 | 預期結構化結果 | 判斷及原因 |
|---|---|---|---|
| 分別排第二及第四 | {"queries":[{"hits":["X","D"],"usable":["D"]},{"hits":["A","B","C","E"],"usable":["E"]}]} | {"ranks":[2,4],"numerator":3,"denominator":8} | (1/2+1/4)÷2=3/8。 |
| 其中一題找不到 | {"queries":[{"hits":["D"],"usable":["D"]},{"hits":["X"],"usable":["E"]}]} | {"ranks":[1,null],"numerator":1,"denominator":2} | 未找到那題取零,但仍計入兩題平均。 |
| 結果空白卻欠可用標籤清單 | {"queries":[{"hits":[]}]} | {"error":"usable-labels"} | 結果空白不能把欠可用標籤清單當成已知零分。 |
| 沒有問題記錄 | {"queries":[]} | {"ranks":[],"numerator":0,"denominator":0} | 沒有題目記錄便沒有平均值,不能報滿分。 |
逐步處理 no-queries 個案,須得到甚麼結果?原因是甚麼?
查看參考答案
{"ranks":[],"numerator":0,"denominator":0}。沒有題目記錄便沒有平均值,不能報滿分。
執行完整本機驗算
import assert from 'node:assert/strict';
function evaluate(x){
if(!Array.isArray(x.queries)||x.queries.some(q=>!q||!Array.isArray(q.hits)||!Array.isArray(q.usable)))return {error:'usable-labels'};
if(x.queries.length>10||x.queries.some(q=>q.hits.length>10))return {error:'score-bounds'};
const gcd=(a,b)=>b?gcd(b,a%b):a;let n=0,d=1;
const ranks=x.queries.map(q=>{const i=q.hits.findIndex(id=>q.usable.includes(id));return i<0?null:i+1;});
for(const r of ranks)if(r){n=n*r+d;d*=r;const g=gcd(n,d);n/=g;d/=g;}
if(!ranks.length)return {ranks,numerator:0,denominator:0};
d*=ranks.length;const g=gcd(n,d);return {ranks,numerator:n/g,denominator:d/g};
}
const cases = [
{
"id": "two-ranks",
"input": {
"queries": [
{
"hits": [
"X",
"D"
],
"usable": [
"D"
]
},
{
"hits": [
"A",
"B",
"C",
"E"
],
"usable": [
"E"
]
}
]
},
"expected": {
"ranks": [
2,
4
],
"numerator": 3,
"denominator": 8
}
},
{
"id": "one-miss",
"input": {
"queries": [
{
"hits": [
"D"
],
"usable": [
"D"
]
},
{
"hits": [
"X"
],
"usable": [
"E"
]
}
]
},
"expected": {
"ranks": [
1,
null
],
"numerator": 1,
"denominator": 2
}
},
{
"id": "missing-usable-channel",
"input": {
"queries": [
{
"hits": []
}
]
},
"expected": {
"error": "usable-labels"
}
},
{
"id": "no-queries",
"input": {
"queries": []
},
"expected": {
"ranks": [],
"numerator": 0,
"denominator": 0
}
}
];
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)}));
結果次序、可用標籤及算式一併保留。位置分數高,不代表答案正確、文件最新或同事已完成任務。