예제 #1
0
def new_quiz(request):
    """
        Creates a new quiz but doesn't create any 'card' models.
        Card models will only be used for cardbox in future.
    """
    body = json.loads(request.body)
    params = validate_params(body['min'], body['max'], body['length'],
                             body['lex'])
    if isinstance(params, basestring):
        return response(params, status=400)
    p_min, p_max, length, lexicon = params

    min_pk = alphProbToProbPK(p_min, lexicon.pk, length)
    max_pk = alphProbToProbPK(p_max, lexicon.pk, length)
    alpha_pks = range(min_pk, max_pk + 1)
    li, q_map = savedlist_from_alpha_pks(alpha_pks, lexicon)
    if len(q_map) > 0:
        # Generate a quiz name.
        quiz_name = '%s %ss (%s to %s)' % (lexicon.lexiconName, length, p_min,
                                           p_max)
    else:
        quiz_name = ''
    return response({
        'list': li.to_python(),
        'q_map': q_map,
        'quiz_name': quiz_name
    })
예제 #2
0
def load_into_cardbox(request):
    body = json.loads(request.raw_post_data)
    lexicon = Lexicon.objects.get(lexiconName=body['lex'].upper())
    min_pk = alphProbToProbPK(int(body['min']), lexicon.pk,
                              int(body['length']))
    max_pk = alphProbToProbPK(int(body['max']), lexicon.pk,
                              int(body['length']))
    rg = range(min_pk, max_pk + 1)
    # For every alphagram, see if we already have a card for this user,
    # if not, create it.
    user_cards = Card.objects.filter(user=request.user)
    start = time.time()
    now = datetime.today()
    for ppk in rg:
        # Create a new card.
        try:
            card = Card(alphagram=Alphagram.objects.get(probability_pk=ppk),
                        user=request.user, next_scheduled=now)
        except Alphagram.DoesNotExist:
            continue
        try:
            card.save()
        except IntegrityError:
            # Already exists, don't save again.
            pass
    logger.debug('Created Cards in %s s' % (time.time() - start))
    return response({'num_cards': Card.objects.filter(
                     user=request.user).count()
                     })
예제 #3
0
def new_quiz(request):
    """
        Creates a new quiz but doesn't create any 'card' models.
        Card models will only be used for cardbox in future.
    """
    body = json.loads(request.raw_post_data)
    params = validate_params(body['min'], body['max'], body['length'],
                             body['lex'])
    if isinstance(params, basestring):
        return response(params, status=400)
    p_min, p_max, length, lexicon = params

    min_pk = alphProbToProbPK(p_min, lexicon.pk, length)
    max_pk = alphProbToProbPK(p_max, lexicon.pk, length)
    alpha_pks = range(min_pk, max_pk + 1)
    li, q_map = savedlist_from_alpha_pks(alpha_pks, lexicon)
    if len(q_map) > 0:
        # Generate a quiz name.
        quiz_name = '%s %ss (%s to %s)' % (lexicon.lexiconName, length,
                                           p_min, p_max)
    else:
        quiz_name = ''
    return response({'list': li.to_python(),
                     'q_map': q_map,
                     'quiz_name': quiz_name})
예제 #4
0
파일: views.py 프로젝트: fizzix/Webolith
def searchForAlphagrams(data):
    """ searches for alphagrams using form data """
    lex = Lexicon.objects.get(lexiconName=data['lexicon'])
    length = int(data['wordLength'])
    minP = alphProbToProbPK(data['probabilityMin'], lex.pk, length)
    maxP = alphProbToProbPK(data['probabilityMax'], lex.pk, length)
    return SearchDescription.probPkIndexRange(minP, maxP, lex)
예제 #5
0
 def handle(self, *args, **options):
     if len(args) != 5:
         raise CommandError("Args: lexicon_name min_prob max_prob length "
                            "mode where mode is missed or unasked")
     lexicon = Lexicon.objects.get(lexiconName=args[0])
     length = int(args[3])
     min_prob = int(args[1])
     max_prob = int(args[2])
     min_pk = alphProbToProbPK(min_prob, lexicon.pk, length)
     max_pk = alphProbToProbPK(max_prob, lexicon.pk, length)
     # Get all alphagrams between these probabilities.
     alphagrams = Alphagram.objects.filter(probability_pk__gte=min_pk,
                                           probability_pk__lte=max_pk)
 def handle(self, *args, **options):
     lex = Lexicon.objects.get(lexiconName='OWL2')
     lengthCounts = json.loads(lex.lengthCounts)
     for length in range(5, 10):
         for prob in range(1, lengthCounts[str(length)], 1000):
             ppk_low = alphProbToProbPK(prob, lex.pk, length)
             ppk_high = alphProbToProbPK(prob+999, lex.pk, length)
             alphas = Alphagram.objects.filter(probability_pk__range=(ppk_low, ppk_high) )
             f = open('../wordsdir/%ds__%05d_to_%05d.txt' % (length, prob, len(alphas) + prob - 1), 'wb')
             for alpha in alphas:
                 words = alpha.word_set.all()
                 f.write(alpha.alphagram)
                 for word in words:
                     f.write(' ' + word.word)
                 f.write('\n')
             f.close()
예제 #7
0
    def generateDailyChallengePks(self, challengeName, lex, chDate):
        # capture number. first try to match to today's lists
        m = re.match("Today's (?P<length>[0-9]+)s",
                     challengeName.name)

        if m:
            wordLength = int(m.group('length'))
            if wordLength < 2 or wordLength > 15:
                return None   # someone is trying to break my server >:(
            logger.info('Generating daily challenges %s %d', lex, wordLength)
            minP = 1
            # lengthCounts is a dictionary of strings as keys
            maxP = json.loads(lex.lengthCounts)[repr(wordLength)]

            r = range(minP, maxP + 1)
            random.shuffle(r)
            r = r[:50]  # just the first 50 elements for the daily challenge
            pks = [alphProbToProbPK(i, lex.pk, wordLength) for i in r]
            return pks, challengeName.timeSecs
        else:
            if challengeName.name == DailyChallengeName.WEEKS_BINGO_TOUGHIES:
                from wordwalls.management.commands.genMissedBingoChalls import(
                    genPks)
                mbs = genPks(lex, chDate)
                pks = [mb[0] for mb in mbs]
                random.shuffle(pks)
                return pks, challengeName.timeSecs
            elif challengeName.name == DailyChallengeName.BLANK_BINGOS:
                questions = self.generate_blank_bingos_challenge(lex, chDate)
                random.shuffle(questions)
                return questions, challengeName.timeSecs
            elif challengeName.name == DailyChallengeName.BINGO_MARATHON:
                pks = []
                for lgt in (7, 8):
                    min_p = 1
                    max_p = json.loads(lex.lengthCounts)[str(lgt)]
                    r = range(min_p, max_p + 1)
                    random.shuffle(r)
                    pks += [alphProbToProbPK(i, lex.pk, lgt) for i in r[:50]]
                return pks, challengeName.timeSecs
            elif challengeName.name in (DailyChallengeName.COMMON_SHORT,
                                        DailyChallengeName.COMMON_LONG):
                questions = self.generate_common_words_challenge(
                    challengeName.name)
                random.shuffle(questions)
                return questions, challengeName.timeSecs
        return None
예제 #8
0
def createDatabases():
    # on my macbook pro this script takes like 30 minutes to run total for the three lexica.
    for d in dbsToCreate:
        dbName, dbDescription = d
        conn = sqlite3.connect(dbName+'.db')
        c = conn.cursor()
        lex = Lexicon(lexiconName = dbName, lexiconDescription = dbDescription)
        lex.save() # write lexicon to database
    
        c.execute("select alphagram, words, probability, length from alphagrams")
        lengthsDict = {}
        rc = 0
        times = [0, 0, 0, 0, 0, 0]
        for row in c:
            t = time.time()
            prob = row[2] & ((1 << 24) - 1)
            lexIndex = lex.pk
            length = row[3]
            times[0] += time.time() - t
            t = time.time()
            a = Alphagram(alphagram=row[0], probability=prob, length=length, 
                        probability_pk=alphProbToProbPK(prob, lexIndex, length), lexicon=lex)
            times[5] += time.time() - t
            t = time.time()
            a.save()    # write alphagram to database
            times[1] += time.time() - t
            if row[3] in lengthsDict:
                lengthsDict[row[3]] += 1
            else:
                lengthsDict[row[3]] = 1
            t = time.time()
            wc = conn.cursor()
            for str in row[1].split():
                x = time.time()
                wc.execute("select definition, lexiconstrings, front_hooks, back_hooks "
                  "from words where word = ?", (str,))
                times[2] += time.time() - x
                
                for wordrow in wc:
                    x = time.time()
                    w = Word(word=str, 
                            lexiconSymbols=wordrow[1] if wordrow[1] else '', 
                            front_hooks=wordrow[2] if wordrow[2] else '',
                            back_hooks=wordrow[3] if wordrow[3] else '', 
                            definition=wordrow[0] if wordrow[0] else '')
                    w.alphagram = a
                    w.lexicon = lex
                    w.save()
                    times[3] += time.time() - x
            times[4] += time.time() - t
            rc += 1
            if rc % 2000 == 0:
                print rc, times                
                times = [0, 0, 0, 0, 0, 0]
    
        lex.lengthCounts = json.dumps(lengthsDict)
        lex.save()
        print lex.lengthCounts
        print "Done with", dbName    
예제 #9
0
    def generateDailyChallengePks(self, challengeName, lex, chDate):
        # capture number. first try to match to today's lists
        m = re.match("Today's (?P<length>[0-9]+)s", challengeName.name)

        if m:
            wordLength = int(m.group('length'))
            if wordLength < 2 or wordLength > 15:
                return None  # someone is trying to break my server >:(
            logger.info('Generating daily challenges %s %d', lex, wordLength)
            minP = 1
            # lengthCounts is a dictionary of strings as keys
            maxP = json.loads(lex.lengthCounts)[repr(wordLength)]

            r = range(minP, maxP + 1)
            random.shuffle(r)
            r = r[:50]  # just the first 50 elements for the daily challenge
            pks = [alphProbToProbPK(i, lex.pk, wordLength) for i in r]
            return pks, challengeName.timeSecs
        else:
            if challengeName.name == DailyChallengeName.WEEKS_BINGO_TOUGHIES:
                from wordwalls.management.commands.genMissedBingoChalls import (
                    genPks)
                mbs = genPks(lex, chDate)
                pks = [mb[0] for mb in mbs]
                random.shuffle(pks)
                return pks, challengeName.timeSecs
            elif challengeName.name == DailyChallengeName.BLANK_BINGOS:
                questions = self.generate_blank_bingos_challenge(lex, chDate)
                random.shuffle(questions)
                return questions, challengeName.timeSecs
            elif challengeName.name == DailyChallengeName.BINGO_MARATHON:
                pks = []
                for lgt in (7, 8):
                    min_p = 1
                    max_p = json.loads(lex.lengthCounts)[str(lgt)]
                    r = range(min_p, max_p + 1)
                    random.shuffle(r)
                    pks += [alphProbToProbPK(i, lex.pk, lgt) for i in r[:50]]
                return pks, challengeName.timeSecs
            elif challengeName.name in (DailyChallengeName.COMMON_SHORT,
                                        DailyChallengeName.COMMON_LONG):
                questions = self.generate_common_words_challenge(
                    challengeName.name)
                random.shuffle(questions)
                return questions, challengeName.timeSecs
        return None
예제 #10
0
 def handle(self, *args, **options):
     lex = Lexicon.objects.get(lexiconName='OWL2')
     lengthCounts = json.loads(lex.lengthCounts)
     for length in range(5, 10):
         for prob in range(1, lengthCounts[str(length)], 1000):
             ppk_low = alphProbToProbPK(prob, lex.pk, length)
             ppk_high = alphProbToProbPK(prob + 999, lex.pk, length)
             alphas = Alphagram.objects.filter(
                 probability_pk__range=(ppk_low, ppk_high))
             f = open(
                 '../wordsdir/%ds__%05d_to_%05d.txt' %
                 (length, prob, len(alphas) + prob - 1), 'wb')
             for alpha in alphas:
                 words = alpha.word_set.all()
                 f.write(alpha.alphagram)
                 for word in words:
                     f.write(' ' + word.word)
                 f.write('\n')
             f.close()
예제 #11
0
파일: game.py 프로젝트: fizzix/Webolith
 def generateDailyChallengePks(self, challengeName, lex):
     # capture number. first try to match to today's lists
     m = re.match("Today's (?P<length>[0-9]+)s", challengeName.name)
     
     if m:
         wordLength = int(m.group('length'))
         if wordLength < 2 or wordLength > 15: return None   # someone is trying to break my server >:(
         print 'Generating daily challenges', lex, wordLength
         minP = 1
         maxP = json.loads(lex.lengthCounts)[repr(wordLength)] # lengthCounts is a dictionary of strings as keys        
         
         r = range(minP, maxP+1)
         random.shuffle(r)
         r = r[:50]  # just the first 50 elements for the daily challenge
         print r
         pks = [alphProbToProbPK(i, lex.pk, wordLength) for i in r]
         return pks, WordwallsGame.dcTimeMap[wordLength]
     return None        
예제 #12
0
def create_wl_lists(i, lex):
    """Create word lists for words with length `i`."""

    lengthCounts = json.loads(lex.lengthCounts)
    numForThisLength = lengthCounts[str(i)]
    minProbPk = alphProbToProbPK(1, lex.pk, i)
    maxProbPk = alphProbToProbPK(numForThisLength, lex.pk, i)

    nl = NamedList(lexicon=lex,
                   numQuestions=numForThisLength,
                   wordLength=i,
                   isRange=True,
                   questions=json.dumps([minProbPk, maxProbPk]),
                   name='The ' + friendlyNumberMap[i])
    nl.save()
    if i >= 7 and i <= 8:
        # create 'every x' list
        for p in range(1, numForThisLength+1, LIST_GRANULARITY):
            minP = alphProbToProbPK(p, lex.pk, i)
            maxP = alphProbToProbPK(
                min(p + LIST_GRANULARITY - 1, numForThisLength), lex.pk, i)

            nl = NamedList(
                lexicon=lex,
                numQuestions=maxP - minP + 1,
                wordLength=i,
                isRange=True,
                questions=json.dumps([minP, maxP]),
                name='%s (%s to %s)' % (friendlyNumberMap[i], p,
                                        min(p + LIST_GRANULARITY - 1,
                                            numForThisLength)))
            nl.save()

    print 'JQXZ', i
    if i >= 4 and i <= 8:
        pks = get_pks_by_condition(
            minProbPk, maxProbPk,
            lambda a: re.search(r'[JQXZ]', a))
        nl = NamedList(lexicon=lex,
                       numQuestions=len(pks),
                       wordLength=i,
                       isRange=False,
                       questions=json.dumps(pks),
                       name='JQXZ ' + friendlyNumberMap[i])
        nl.save()

    if i == 7:
        # 4+ vowel 7s
        pks = get_pks_by_condition(
            minProbPk, maxProbPk,
            lambda a: (len(re.findall(r'[AEIOU]', a)) >= 4))
        nl = NamedList(lexicon=lex,
                       numQuestions=len(pks),
                       wordLength=i,
                       isRange=False,
                       questions=json.dumps(pks),
                       name='Sevens with 4 or more vowels')
        nl.save()

    if i == 8:
        # 5+ vowel 8s
        pks = get_pks_by_condition(
            minProbPk, maxProbPk,
            lambda a: (len(re.findall(r'[AEIOU]', a)) >= 5))
        nl = NamedList(lexicon=lex,
                       numQuestions=len(pks),
                       wordLength=i,
                       isRange=False,
                       questions=json.dumps(pks),
                       name='Eights with 5 or more vowels')
        nl.save()

    if lex.lexiconName == 'CSW12':
        pks = get_pks_by_word_condition(
            minProbPk, maxProbPk,
            lambda w: (w.get('symbols') == '#+'))

        nl = NamedList(lexicon=lex,
                       numQuestions=len(pks),
                       wordLength=i,
                       isRange=False,
                       questions=json.dumps(pks),
                       name='CSW12 ' + friendlyNumberMap[i] + ' not in CSW07')

        nl.save()

        pks = get_pks_by_word_condition(
            minProbPk, maxProbPk,
            lambda w: ('#' in w.get('symbols')))

        nl = NamedList(lexicon=lex, numQuestions=len(pks), wordLength=i,
                       isRange=False,
                       questions=json.dumps(pks),
                       name='CSW12 ' + friendlyNumberMap[i] + ' not in OWL2')

        nl.save()

    if lex.lexiconName == 'America':
        pks = get_pks_by_word_condition(
            minProbPk, maxProbPk,
            lambda w: (w.get('symbols') == '+'))

        nl = NamedList(lexicon=lex,
                       numQuestions=len(pks),
                       wordLength=i,
                       isRange=False,
                       questions=json.dumps(pks),
                       name='America ' + friendlyNumberMap[i] + ' not in OWL2')

        nl.save()
예제 #13
0
def create_wl_lists(i, lex):
    """Create word lists for words with length `i`."""

    lengthCounts = json.loads(lex.lengthCounts)
    numForThisLength = lengthCounts[str(i)]
    minProbPk = alphProbToProbPK(1, lex.pk, i)
    maxProbPk = alphProbToProbPK(numForThisLength, lex.pk, i)

    nl = NamedList(lexicon=lex,
                   numQuestions=numForThisLength,
                   wordLength=i,
                   isRange=True,
                   questions=json.dumps([minProbPk, maxProbPk]),
                   name='The ' + friendlyNumberMap[i])
    nl.save()
    if i >= 7 and i <= 8:
        # create 'every x' list
        for p in range(1, numForThisLength+1, LIST_GRANULARITY):
            minP = alphProbToProbPK(p, lex.pk, i)
            maxP = alphProbToProbPK(
                min(p + LIST_GRANULARITY - 1, numForThisLength), lex.pk, i)

            nl = NamedList(
                lexicon=lex,
                numQuestions=maxP - minP + 1,
                wordLength=i,
                isRange=True,
                questions=json.dumps([minP, maxP]),
                name='%s (%s to %s)' % (friendlyNumberMap[i], p,
                                        min(p + LIST_GRANULARITY - 1,
                                            numForThisLength)))
            nl.save()

    print 'JQXZ', i
    if i >= 4 and i <= 8:
        pks = get_pks_by_condition(
            minProbPk, maxProbPk,
            lambda a: re.search(r'[JQXZ]', a))
        nl = NamedList(lexicon=lex,
                       numQuestions=len(pks),
                       wordLength=i,
                       isRange=False,
                       questions=json.dumps(pks),
                       name='JQXZ ' + friendlyNumberMap[i])
        nl.save()

    if i == 7:
        # 4+ vowel 7s
        pks = get_pks_by_condition(
            minProbPk, maxProbPk,
            lambda a: (len(re.findall(r'[AEIOU]', a)) >= 4))
        nl = NamedList(lexicon=lex,
                       numQuestions=len(pks),
                       wordLength=i,
                       isRange=False,
                       questions=json.dumps(pks),
                       name='Sevens with 4 or more vowels')
        nl.save()

    if i == 8:
        # 5+ vowel 8s
        pks = get_pks_by_condition(
            minProbPk, maxProbPk,
            lambda a: (len(re.findall(r'[AEIOU]', a)) >= 5))
        nl = NamedList(lexicon=lex,
                       numQuestions=len(pks),
                       wordLength=i,
                       isRange=False,
                       questions=json.dumps(pks),
                       name='Eights with 5 or more vowels')
        nl.save()

    if lex.lexiconName == 'CSW12':
        pks = get_pks_by_word_condition(
            minProbPk, maxProbPk,
            lambda w: (w.get('symbols') == '#+'))

        nl = NamedList(lexicon=lex,
                       numQuestions=len(pks),
                       wordLength=i,
                       isRange=False,
                       questions=json.dumps(pks),
                       name='CSW12 ' + friendlyNumberMap[i] + ' not in CSW07')

        nl.save()

        pks = get_pks_by_word_condition(
            minProbPk, maxProbPk,
            lambda w: ('#' in w.get('symbols')))

        nl = NamedList(lexicon=lex, numQuestions=len(pks), wordLength=i,
                       isRange=False,
                       questions=json.dumps(pks),
                       name='CSW12 ' + friendlyNumberMap[i] + ' not in OWL2')

        nl.save()
예제 #14
0
def searchForAlphagrams(data, lex):
    """ searches for alphagrams using form data """
    length = int(data['wordLength'])
    minP = alphProbToProbPK(data['probabilityMin'], lex.pk, length)
    maxP = alphProbToProbPK(data['probabilityMax'], lex.pk, length)
    return SearchDescription.probPkIndexRange(minP, maxP, lex)