From c80a5ba87d3dd8cc4a67a2d23c087448a702d7fe Mon Sep 17 00:00:00 2001 From: Martin Date: Mon, 14 Sep 2015 10:24:22 +0200 Subject: Completed description of Fahrenheit. Added new exercises Pythagorean theorem. --- .../introduction/fahrenheit_to_celsius/common.py | 56 ++++++++++++++++++++-- 1 file changed, 51 insertions(+), 5 deletions(-) (limited to 'python/problems/introduction/fahrenheit_to_celsius/common.py') diff --git a/python/problems/introduction/fahrenheit_to_celsius/common.py b/python/problems/introduction/fahrenheit_to_celsius/common.py index 34f2832..076d322 100644 --- a/python/problems/introduction/fahrenheit_to_celsius/common.py +++ b/python/problems/introduction/fahrenheit_to_celsius/common.py @@ -22,18 +22,26 @@ hint_type = { def test(python, code): # List of inputs: (expression to eval, stdin). test_in = [ - (None, '0\n'), - (None, '100\n'), + (None, '32\n'), + (None, '212\n'), + (None, '-459.4\n'), + (None, '98.6\n'), + (None, '1832\n'), ] test_out = [ - '-17.7', - '37.7', + '0', + '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: @@ -41,8 +49,46 @@ def test(python, code): return n_correct, len(test_in) def hint(python, code): - if not 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 -- cgit v1.2.1