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
|
# coding=utf-8
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 = 243
number = 9
visible = True
solution = '''\
def caesar(s):
cipher = ''
for c in s:
if 'a' <= c <= 'w':
cipher += chr(ord(c) + 3)
elif 'x' <= c <= 'z':
cipher += chr(ord(c) - 23)
else:
cipher += c
return cipher
'''
hint_type = {
'final_hint': Hint('final_hint')
}
def test(python, code):
func_name = 'caesar'
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 = [
('', ''),
('a', 'd'),
('aa', 'dd'),
('ab', 'de'),
('z', 'c'),
('xyz', 'abc'),
(' ', ' '),
('a a', 'd d'),
('julij cezar je seveda uporabljal cezarjevo sifro',
'mxolm fhcdu mh vhyhgd xsrudeomdo fhcdumhyr vliur'),
('the quick brown fox jumps over the lazy dog',
'wkh txlfn eurzq ira mxpsv ryhu wkh odcb grj'),
]
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)):
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):
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
|