in src/sal/utils/math.py [0:0]
def find_majority_answer(answers: List[str]) -> str:
"""
Groups answers based on their canonical forms and finds the group with the largest number of elements.
In case of a tie, returns the first occurring group with the largest size.
Args:
answers (list of str): A list of strings to be grouped.
Returns:
str: The string representing the group with the largest number of elements.
Example:
answers = ["a", "b", "a", "c"]
result = find_majority_answer(answers)
# result would be "a" since "a" appears most frequently.
"""
if len(answers) == 0:
raise ValueError("answers cannot be empty")
# Group answers using canonical forms
canonical_groups = defaultdict(int) # Count occurrences for each canonical form
canonical_to_original = {} # Map canonical form back to an original answer
for answer in answers:
# Compute the canonical form
canonical_form = memoized_canonical_form(answer)
# Increment count for the canonical form
canonical_groups[canonical_form] += 1
# Track the original answer for this canonical form
if canonical_form not in canonical_to_original:
canonical_to_original[canonical_form] = answer
# Find the canonical form with the largest count
max_count = max(canonical_groups.values())
for canonical_form, count in canonical_groups.items():
if count == max_count:
# Return the first occurring group in case of a tie
return canonical_to_original[canonical_form]