多選題評分規則
每個正確選項都有得分權重,選正確一個給該正確選項得分權重的分值,選錯一個,則總分為0
假如:正確答案ABC ,總分10分,權重分別為 20% 40% 40%
提交答案 ABC 得 (20%+40%+40%)* 10 = 10分
提交答案 AB 得 (20%+40%)* 10 = 6分
提交答案 ABD 得 0分
集思廣益,如果可以請使用PHP作答
8 回答

慕蓋茨4494581
TA貢獻1850條經驗 獲得超11個贊
function selectScore(preAnswerScore,answer) {
let totalScore = 0;
let noScoreKey = [];
let hasNoScoreKey = false;
for(let key in preAnswerScore) {
if(preAnswerScore[key] == 0){
noScoreKey.push(key);
}
}
noScoreKey.map( item => {
if(answer.includes(item)){
hasNoScoreKey = true;
}
});
if(hasNoScoreKey) {
totalScore = 0;
}else{
answer.map (item => {
totalScore += preAnswerScore[item];
});
totalScore /= 10;
}
return totalScore;
}
let preAnswerScore = {a: 20, b: 40, c: 40, d: 0};
let answer = ['c','b','d']
console.log(selectScore(preAnswerScore, answer));
}
js走一波,考慮到你其他選擇題也適用

守著星空守著你
TA貢獻1799條經驗 獲得超8個贊
不會php, 用一下js
// 選擇的選項
const select = ['a','b','d']
// 分數
const score = {
'a': 20,
'b': 20,
'c': 60,
'd': 0
}
// 根據所選 得到 分數如:abd 的到 20,20,0
const a = select.map(x => score[x])
// 如果 a里面有 0 直接返回 0 否則 reduce 后得到 分數
total = a.includes(0) ? 0 : a.reduce((total, i) => total+ (i *0.1) , 0)

繁華開滿天機
TA貢獻1816條經驗 獲得超4個贊
思路,獲得提交與答案的交集,如果交集個數不等于提交個數,則認為,存在選錯的值,如果交集個數等于提交個數,遍歷求分即可
<?php
function multiSelectScore($answer, $wight, $allScore, $submit)
{
$score = 0;
$answerWight = array_combine($answer, $wight);
// 計算交集
$selects = array_intersect($answer, $submit);
if(count($selects) === count($submit)) {
// 遍歷交集
foreach($selects as $key => $select) {
$score += $answerWight[$select] * 0.01 * $allScore;
}
}
return $score;
}
// 答案
$answer = ["A", "B", "C"];
// 權重
$wight = ["20","30","50"];
// 總分
$allScore = 10;
// 提交的選項
$submit = ["A","C"];
$score = multiSelectScore($answer, $wight, $allScore, $submit);
echo json_encode($score) . "\n";

慕少森
TA貢獻2019條經驗 獲得超9個贊
function calc($result,$answer,$score){
$count = count($result);
$d = array_diff($answer,$result);
if($d){
return 0;
}
$c = array_diff($result,$answer);
$lost = count($c);
if(!$lost){
return $score;
}
switch ($count) {
case 1:
$per = [1=>1];
break;
case 2:
$per = [1=>0.4,2=>1];
break;
case 3:
$per = [1=>0.2,2=>0.6,3=>1];
break;
default:
$per = [1=>0.1,2=>0.5,3=>0.8,4=>1];
break;
}
$true = $count - $lost ;
return $per[$true]*$score;
}
$result = ['A','B','C'];
$answer = ['A','B'];
$score = 10;
echo calc($result,$answer,$score);

哈士奇WWW
TA貢獻1799條經驗 獲得超6個贊
function check_score(array $answer, array $correct, $total_score){
$answer=array_flip($answer);
$check=array_intersect_key($correct, $answer);
return in_array($check, 0) ? 0 : array_sum($ckeck)*$total_score;
}
$answer
為答案數組(['A', 'B', 'C']
)
$correct
為正確答案數組(['A'=>0.2, 'B'=>0.4, 'C'=>0.4, 'D'=>0]
)
$total_score
為總分
首先翻轉$answer
讓選項成為key(['A'=>0, 'B'=>1, 'C'=>2]
)
然后根據key計算$correct
和$answer
的交集$check
,$check
的key和value都保留$correct
的。
檢查$check
的value中是否有0
,有的話說明有錯誤答案,返回0分,否則計算$check
的value的和,并乘以總分返回。
- 8 回答
- 0 關注
- 1021 瀏覽
添加回答
舉報
0/150
提交
取消