diff options
Diffstat (limited to 'python/problems/introduction/pythagorean_theorem/common.py')
-rw-r--r-- | python/problems/introduction/pythagorean_theorem/common.py | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/python/problems/introduction/pythagorean_theorem/common.py b/python/problems/introduction/pythagorean_theorem/common.py new file mode 100644 index 0000000..b2ae10c --- /dev/null +++ b/python/problems/introduction/pythagorean_theorem/common.py @@ -0,0 +1,105 @@ +# coding=utf-8 + +from python.util import has_token_sequence +from server.hints import Hint, HintSequence + +id = 1000 +group = 'introduction' +number = 2 +visible = True + +solution = '''\ +from math import * +g = 10 +kot = float(input("Vnesi kot (v stopinjah): ")) +v = float(input("Vnesi hitrost (v m/s): ")) +kot_rad = kot * 2 * pi / 360 +razdalja = v ** 2 * sin(2 * kot_rad) / g +print("Kroglo bo odneslo", razdalja, "metrov.") +''' + +#hint_type = { +# 'plan': Hint('plan'), +# 'no_input_call': Hint('no_input_call'), +#} + +def test(python, code): + # List of inputs: (expression to eval, stdin). + test_in = [ + (None, '45\n100\n'), + (None, '44\n100\n'), + (None, '46\n100\n'), + (None, '0\n100\n'), + (None, '90\n100\n'), + (None, '32\n747\n'), + #(None, '212\n'), + #(None, '-459.4\n'), + #(None, '98.6\n'), + #(None, '1832\n'), + ] + test_out = [ + '1000', + '999.39' + '999.39' + #'100', + #'-273', + #'37', + #'1000' + ] + + # List of outputs: (expression result, stdout, stderr, exception). + answers = python(code=code, inputs=test_in, timeout=1.0) + outputs = [ans[1] for ans in answers] + + print (answers) + + n_correct = 0 + for output, correct in zip(outputs, test_out): + if correct in output: + n_correct += 1 + return n_correct, len(test_in) + +def hint(python, code): + # run one test first to see if there are any exceptions + test_in = [(None, '212\n')] + exc = python(code=code, inputs=test_in, timeout=1.0)[0][3] + # have an exception! + if exc: + if 'NameError' in exc: + return [{'id':'name_error'}] + if 'not callable' in exc: + return [{'id':'not_callable'}] + if 'unsupported operand' in exc: + return [{'id':'unsupported_operand'}] + if 'SyntaxError' in exc: + return [{'id':'syntax_error'}] + if 'IndentationError' in exc: + return [{'id':'indentation_error'}] + + + # the trick is to decide when to show the plan and when the first hint. + # I implemented a simple idea: show plan, when code contains something from the + # solution, but not input. + if not code or (not has_token_sequence(code, ['input']) and + (has_token_sequence(code, ['32']) or + has_token_sequence(code, ['=', '5']) or + has_token_sequence(code, ['print']))): + return [{'id': 'plan'}] + + + # if input is not present in code, student needs to learn about input + if not has_token_sequence(code, ['input']): + return [{'id': 'no_input_call'}] + + # if tokens * or / or = are not in code, we have to teach them how to + # evaluate expressions. + if (not has_token_sequence(code, ['/']) or + not has_token_sequence(code, ['*']) or + not has_token_sequence(code, ['='])): + return [{'id' : 'expressions_python'}] + + # student is not using print function + if not has_token_sequence(code, ['print']): + return [{'id' : 'printing'}] + + return None |