from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random import itertools author = 'Esther' doc = """ This is a task that requires real effort from participants. Subjects are shown two images of incomprehensible text. Subjects are required to transcribe (copy) the text into a text entry field. The quality of a subject's transcription is measured by the Levenshtein distance. """ #Zur Spende: auf dieser Website (https://blog2help.com/2018/05/baumspende-wie-viel-kostet-es-einen-baum-pflanzen-zu-lassen.html) # ist aufgelistet, wieviel es bei unterschiedlichen Orgas kostet, Bäume spenden zu lassen. #Beispiel https://www.regenwald-schuetzen.org/unsere-projekte/regenwald-schutzprojekte/baum-fuer-baum/ : hier kostet ein Baum in #Südamerika 1€ 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 = 'my_environmental_survey' players_per_group = None form_fields = ['name'] endowment = c(1) reward = c(1) number_of_players = 3 reference_texts = [ "12", "30", "58", ] num_rounds = len(reference_texts) allowed_error_rates = 0 class Subsession(BaseSubsession): def creating_session(self): treatmentgroup = itertools.cycle(['three']) for p in self.get_players(): p.treatmentgroup = next(treatmentgroup) class Group(BaseGroup): pass class Player(BasePlayer): name = models.StringField(label="Your Name:") transcribed_text = models.LongStringField() levenshtein_distance = models.IntegerField() guthaben = models.CurrencyField(initial=c(0)) cumulative_guthaben = models.CurrencyField() cumulative_donation = models.CurrencyField() right_answer = models.BooleanField() right_answer_text = models.StringField() donation = models.CurrencyField(min=c(0)) no_trees = models.IntegerField(initial=0) cumulative_donated_trees = models.IntegerField() treatmentgroup = models.StringField() current_position = models.StringField() spielstand = models.StringField() earnedmoney = models.CurrencyField() hola = models.StringField() winner = models.IntegerField()