summaryrefslogtreecommitdiff
path: root/python/problems/while_and_if/buy_five/common.py
diff options
context:
space:
mode:
authorMartin <martin@leo.fri1.uni-lj.si>2015-09-21 15:54:27 +0200
committerMartin <martin@leo.fri1.uni-lj.si>2015-09-21 15:54:27 +0200
commiteb93adb4a8b71ddf2272c6c13f645784497add9f (patch)
treec7174c6c2eef4ace094514aebbf82de83132d456 /python/problems/while_and_if/buy_five/common.py
parentb202e2d5007ca9a53b4ffac4cc2224d647119dbc (diff)
Added problem "Competition"
Revised problem "Buy five"
Diffstat (limited to 'python/problems/while_and_if/buy_five/common.py')
-rw-r--r--python/problems/while_and_if/buy_five/common.py44
1 files changed, 29 insertions, 15 deletions
diff --git a/python/problems/while_and_if/buy_five/common.py b/python/problems/while_and_if/buy_five/common.py
index 586e50a..c7081c2 100644
--- a/python/problems/while_and_if/buy_five/common.py
+++ b/python/problems/while_and_if/buy_five/common.py
@@ -1,7 +1,7 @@
# coding=utf-8
from python.util import has_token_sequence, string_almost_equal, \
- string_contains_number, get_tokens
+ string_contains_number, get_tokens, get_numbers, get_exception_desc
from server.hints import Hint, HintSequence
id = 185
@@ -20,10 +20,11 @@ print('Vsota:', vsota)
hint_type = {
'plan': HintSequence('plan', 5),
- 'name_error': Hint('name_error'),
- 'type_error': Hint('name'),
- 'error': Hint('error'),
'printing': Hint('printing'),
+ 'while_clause': Hint('while_clause'),
+ 'reading_while': Hint('reading_while'),
+ 'summation': Hint('summation'),
+ 'nonumber': Hint('nonumber'),
}
def test(python, code):
@@ -50,7 +51,7 @@ def test(python, code):
n_correct = 0
for output, correct in zip(outputs, test_out):
- if string_contains_number(output, correct):
+ if string_almost_equal(output, correct):
n_correct += 1
return n_correct, len(test_in)
@@ -58,18 +59,31 @@ def hint(python, code):
# run one test first to see if there are any exceptions
test_in = [(None, '1\n1\n1\n1\n1\n')]
answer = python(code=code, inputs=test_in, timeout=1.0)
- exc = answer[0][3]
- # if have an exception!
- if exc:
- if 'NameError' in exc:
- return [{'id':'name_error', 'args': {'message': exc}}]
- elif 'TypeError' in exc:
- return [{'id':'type_error', 'args': {'message': exc}}]
- else:
- return [{'id':'error', 'args': {'message': exc}}]
+ exc = get_exception_desc(answer)
+ if exc: return exc
+
+ tokens = get_tokens(code)
+
+ # student does not have while or for: instruct him on loops
+ if not has_token_sequence(tokens, ['while']) and \
+ not has_token_sequence(tokens, ['for']):
+ return [{'id' : 'while_clause'}]
+
+ # student does not know how to read several values in while
+ if not has_token_sequence(tokens, ['input']):
+ return [{'id' : 'reading_while'}]
# student is not using print function
- if not has_token_sequence(code, ['print']):
+ if not has_token_sequence(tokens, ['print']):
return [{'id' : 'printing'}]
+ # student does not know how to accumulate values (print contains 0 or 1)
+ if string_contains_number(answer[0][1], 0) or \
+ string_contains_number(answer[0][1], 1):
+ return [{'id' : 'summation'}]
+
+ # student does not print any values
+ if not get_numbers(answer[0][1]):
+ return [{'id' : 'nonumber'}]
+
return None