from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random doc = """ This is a task that requires real effort from participants. Subjects are shown images of text. Subjects are required to translate the text into a number and type it into the entry field. The quality of a subject's transcription is measured by the Levenshtein distance. """ def levenshtein(a, b): """Calculates the Levenshtein distance between a and b.""" n, m = len(a), len(b) if n > m: # Make sure n <= m, to use O(min(n,m)) space a, b = b, a n, m = m, n current = range(n + 1) for i in range(1, m + 1): previous, current = current, [i] + [0] * n for j in range(1, n + 1): add, delete = previous[j] + 1, current[j - 1] + 1 change = previous[j - 1] if a[j - 1] != b[i - 1]: change = change + 1 current[j] = min(add, delete, change) return current[n] def distance_and_ok(transcribed_text, reference_text, max_error_rate): error_threshold = len(reference_text) * max_error_rate distance = levenshtein(transcribed_text, reference_text) ok = distance <= error_threshold return distance, ok class Constants(BaseConstants): name_in_url = 'real_effort' players_per_group = None reference_texts = [ "24552046495527", "665580712165" "3142508056" "2865885056", ] num_rounds = len(reference_texts) allowed_error_rates = [0, 0, 0, 0] class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): transcribed_text = models.LongStringField() levenshtein_distance = models.IntegerField()