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):
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=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):
tokens = get_tokens(code)
# run one test first to see if there are any exceptions
answer = python(code=code, inputs=[(None, None)], timeout=1.0)
exc = get_exception_desc(answer[0][3])
if exc: return exc
return None
|