summaryrefslogtreecommitdiff
path: root/python/problems/dictionaries/text/common.py
blob: ab6deac005ce2e7ad421d100a3784ec1c585598f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import re
from python.util import has_token_sequence, string_almost_equal, \
    string_contains_number, get_tokens, get_numbers, get_exception_desc
from server.hints import Hint

id = 20612
number = 13
visible = True

solution = '''\
import collections

def following_words(txt):
    words = txt.split()
    freq = collections.defaultdict(list)
    for word, next_word in zip(words, words[1:]):
        freq[word].append(next_word)
    return freq

def freq_following_word(txt):
    following = following_words(txt)
    for f in following:
        vals = collections.Counter(following[f])
        s = sorted(vals.most_common(), key = lambda x: (-x[1], x[0]))
        following[f] = s[0][0]
    return following

def text(word, full_text, num):
    freq = freq_following_word(full_text)
    words = []
    for i in range(num):
        words.append(word)
        word = freq[word]
    return ' '.join(words)
'''

hint_type = {
    'final_hint': Hint('final_hint')
}

def test(python, code, aux_code=''):
    func_name = 'text'
    tokens = get_tokens(code)
    if not has_token_sequence(tokens, ['def', func_name]):
        return False, [{'id' : 'no_func_name', 'args' : {'func_name' : func_name}}]

    in_out = [
        (('in', 'in in in in', 5), 'in in in in in'),
        (('in', 'in to in ono in to smo mi', 5), 'in to in to in'),
        (('danes', 'danes je lep dan danes sije sonce', 5),
         'danes je lep dan danes'),
        (('danes', 'danes je lep dan danes sije sonce danes sije dan ki je sonce', 5),
         'danes sije dan danes sije'),
    ]

    test_in = [(func_name+'%s'%str(l[0]), None) for l in in_out]
    test_out = [l[1] for l in in_out]

    answers = python(code=aux_code+code, inputs=test_in, timeout=1.0)
    n_correct = 0
    tin, tout = None, None
    for i, (ans, to) in enumerate(zip(answers, test_out)):
        corr = ans[0] == to
        n_correct += corr
        if not corr:
            tin = test_in[i][0]
            tout = to

    passed = n_correct == len(test_in)
    hints = [{'id': 'test_results', 'args': {'passed': n_correct, 'total': len(test_in)}}]
    if tin:
        hints.append({'id': 'problematic_test_case', 'args': {'testin': str(tin), 'testout': str(tout)}})
    if passed:
        hints.append({'id': 'final_hint'})
    return passed, hints


def hint(python, code, aux_code=''):
    tokens = get_tokens(code)

    # run one test first to see if there are any exceptions
    answer = python(code=aux_code+code, inputs=[(None, None)], timeout=1.0)
    exc = get_exception_desc(answer[0][3])
    if exc: return exc

    return None