Example #1
0
        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));
        }
Example #2
0
        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));
        }