Prefer high-performing distractors

This commit is contained in:
hz
2026-07-20 02:44:58 -05:00
parent dae3a31b71
commit 121e80b2ea
6 changed files with 152 additions and 20 deletions
+7 -10
View File
@@ -33,7 +33,7 @@ public class QuestionResponse
int questionElo = 1000,
bool includeChoicePool = true)
{
var choices = includeChoicePool ? question.Choices : SelectLegacyChoices(question);
var choices = includeChoicePool ? question.Choices : SelectLegacyChoices(question, liveChoiceSelectionPercentages);
var choiceIds = choices.Select(choice => choice.Id).ToHashSet(StringComparer.Ordinal);
var percentages = BuildChoiceSelectionPercentages(question, liveChoiceSelectionPercentages);
return new QuestionResponse
@@ -87,20 +87,17 @@ public class QuestionResponse
return response;
}
private static List<QuestionChoice> SelectLegacyChoices(Question question)
private static List<QuestionChoice> SelectLegacyChoices(
Question question,
IReadOnlyDictionary<string, int>? liveChoiceSelectionPercentages)
{
if (question.Choices.Count <= 5)
return question.Choices;
var correct = question.Choices.First(choice => choice.Id == question.CorrectChoiceId);
var distractors = question.Choices
.Where(choice => choice.Id != question.CorrectChoiceId)
.OrderBy(_ => Random.Shared.Next())
.Take(4)
.Append(correct)
.OrderBy(_ => Random.Shared.Next())
var selectedIds = ChoicePoolSelector.SelectChoiceIds(question, liveChoiceSelectionPercentages);
return selectedIds
.Select(id => question.Choices.First(choice => choice.Id == id))
.ToList();
return distractors;
}
public static Dictionary<string, int> BuildChoiceSelectionPercentages(Question question, Dictionary<string, int>? liveChoiceSelectionPercentages)