public override double CalculateScore(string answerProvided, out bool isCorrectAnswer, out bool isCompleteAnswer) { isCorrectAnswer = false; isCompleteAnswer = false; if (string.IsNullOrEmpty(answerProvided)) { return(0); } var score = ScoreAwarded; var provided = new HashSet <string>(answerProvided.ToLowerInvariant().Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)); var correct = new HashSet <string>(CorrectAnswer.ToLowerInvariant().Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)); if (provided.Count > correct.Count) { return(0); } var penaltyWeights = new [] { 1, 0.75, 0.5, 0.4, 0.3, 0.25, 0.2 }; var penaltyIndex = Math.Min(penaltyWeights.Length, correct.Count) - 1; foreach (var c in correct) { if (!provided.Contains(c)) { score -= (ScoreAwarded * penaltyWeights[penaltyIndex]); penaltyIndex = Math.Max(0, penaltyIndex - 1); } } isCorrectAnswer = score == ScoreAwarded; isCompleteAnswer = provided.Count == correct.Count; return(Math.Max(0, score)); }
public override double CalculateScore(string answerProvided, out bool isCorrectAnswer, out bool isCompleteAnswer) { isCorrectAnswer = false; isCompleteAnswer = false; if (string.IsNullOrEmpty(answerProvided)) { return(0); } var answerIds = answerProvided.ToLowerInvariant().Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); var correctIds = CorrectAnswer.ToLowerInvariant().Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); if (answerIds.Length > correctIds.Length) { return(0); } var distance = answerIds.LevenshteinDistance(correctIds); var penaltyWeights = new [] { 1, 0.75, 0.5, 0.4, 0.3, 0.25, 0.2 }; var startIndex = correctIds.Length - 1; var score = ScoreAwarded; for (var i = distance - 1; i >= 0; i--) { score -= penaltyWeights[i]; } isCompleteAnswer = answerIds.Length == correctIds.Length; isCorrectAnswer = distance == 0; return(Math.Max(0, score)); }