summaryrefslogtreecommitdiff
path: root/python/problems/functions_and_modules/longest_word/common.py
blob: db8e92cfd4e9dd82a854e508d2274e21d55171e2 (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
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