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
|
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 = 235
number = 1
visible = True
solution = '''\
def longest(s):
naj = ''
for beseda in s.split():
if len(beseda) > len(naj):
naj = beseda
return naj
'''
hint_type = {
'final_hint': Hint('final_hint')
}
def test(python, code, aux_code=''):
func_name = 'longest'
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 = [
('beseda', 'beseda'),
('an ban', 'ban'),
('an ban pet podgan', 'podgan'),
('an ban pet podgan stiri misi', 'podgan'),
('ta clanek je lepo napisan', 'napisan'),
('123456 12345 1234 123 12 1', '123456'),
('12345 123456 12345 1234 123 12 1', '123456'),
('1234 12345 123456 12345 1234 123 12 1', '123456'),
]
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)):
n_correct += ans[0] == to
if ans[0] != to:
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
|