summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin <martin@leo.fri1.uni-lj.si>2015-10-05 11:57:31 +0200
committerMartin <martin@leo.fri1.uni-lj.si>2015-10-05 11:57:31 +0200
commite63627ad942a7d2c9eebb86f15c96191e7408eb8 (patch)
tree84e7bc342d8a534ed23e81e1bc5699184be18013
parent6bda47fb45788f7464b7846bc58d7b90cc65240f (diff)
Added problem "counting".
Some other small text corrections.
-rw-r--r--python/problems/lists_and_for/contains_42/sl.py18
-rw-r--r--python/problems/lists_and_for/contains_string/sl.py9
-rw-r--r--python/problems/lists_and_for/counting/common.py109
-rw-r--r--python/problems/lists_and_for/counting/en.py16
-rw-r--r--python/problems/lists_and_for/counting/sl.py90
-rw-r--r--python/problems/while_and_if/consumers_anonymous/common.py20
-rw-r--r--python/problems/while_and_if/consumers_anonymous/sl.py10
7 files changed, 253 insertions, 19 deletions
diff --git a/python/problems/lists_and_for/contains_42/sl.py b/python/problems/lists_and_for/contains_42/sl.py
index 9477e29..fe6b57e 100644
--- a/python/problems/lists_and_for/contains_42/sl.py
+++ b/python/problems/lists_and_for/contains_42/sl.py
@@ -19,10 +19,12 @@ Seveda mora program delati za poljubne sezname in ne samo za seznam iz primera.<
'''
for_loop = ['''\
-<p>Čez elemente v seznamu se najlažje sprehodimo s <b>for</b> zanko.
+<p>Pregledati bo treba vse elemente v seznamu <code>xs</code>''',
+ '''\
+<p>Najlažje bo s <b>for</b> zanko.
''',
'''\
-<p>Poskusi, kaj naredita naslednji dve vrstici:</p>
+<p>Poskusii naslednji dve vrstici:</p>
<pre>
for x in xs:
print (x)
@@ -30,21 +32,25 @@ for x in xs:
'''\
<p>V zgornjem primeru z zanko <code>for</code> Pythonu naročimo naj se sprehodi čez seznam <code>xs</code>
in na vsakem koraku trenutni element seznama shrani v spremenljivko <code>x</code>.
-Kaj naj Python naredi s to spremenljivko, mu naročimo v zamaknjenih vrsticah.
+Kaj naj Python naredi s to spremenljivko, je zapisano v zamaknjenih vrsticah.
Tokrat vrednost le izpišemo.</p>''']
if_clause = ['''\
-<p><code>Poglej, ali je število 42?</code> Uporabite pogojni stavek <b>if</b>!</p>''',
+<p><code>Preveri, ali imamo število 42?</code></p>''',
+ '''\
+<p>Uporabi pogojni stavek <b>if</b>!</p>''',
'''\
<pre>
if x == 42:
</pre>''']
seen_42 = ['''\
-<p>Kako si lahko zapomnimo, da smo <b>videli 42</b>? Uporabi novo spremenljivko!</p>
+<p>Zapomni si, da si našel 42!</p>''',
+ '''\
+<p>Uporabi novo spremenljivko!</p>
''',
'''\
-<p>Spremenljivko na začetku nastavimo na False, npr.:</p>
+<p>Spremenljivko na začetku nastavimo na False:</p>
<pre>
videl42 = False
</pre>
diff --git a/python/problems/lists_and_for/contains_string/sl.py b/python/problems/lists_and_for/contains_string/sl.py
index 2f24458..d177463 100644
--- a/python/problems/lists_and_for/contains_string/sl.py
+++ b/python/problems/lists_and_for/contains_string/sl.py
@@ -18,10 +18,12 @@ xs = ['foo', 'bar', 'baz', 'Waldo', 'foobar']
'''
for_loop = ['''\
-<p>Čez elemente v seznamu se najlažje sprehodimo s <b>for</b> zanko.
+<p>Pregledati bo treba vse elemente v seznamu <code>xs</code>''',
+ '''\
+<p>Najlažje bo s <b>for</b> zanko.
''',
'''\
-<p>Poskusi, kaj naredita naslednji dve vrstici:</p>
+<p>Poskusii naslednji dve vrstici:</p>
<pre>
for x in xs:
print (x)
@@ -29,7 +31,7 @@ for x in xs:
'''\
<p>V zgornjem primeru z zanko <code>for</code> Pythonu naročimo naj se sprehodi čez seznam <code>xs</code>
in na vsakem koraku trenutni element seznama shrani v spremenljivko <code>x</code>.
-Kaj naj Python naredi s to spremenljivko, mu naročimo v zamaknjenih vrsticah.
+Kaj naj Python naredi s to spremenljivko, je zapisano v zamaknjenih vrsticah.
Tokrat vrednost le izpišemo.</p>''']
if_clause = ['''\
@@ -39,6 +41,7 @@ if_clause = ['''\
if x == 'Waldo':
</pre>''']
+
plan = ['''\
<p><b>Plan</b> je enak kot pri prvi nalogi:
<pre>
diff --git a/python/problems/lists_and_for/counting/common.py b/python/problems/lists_and_for/counting/common.py
new file mode 100644
index 0000000..2d59182
--- /dev/null
+++ b/python/problems/lists_and_for/counting/common.py
@@ -0,0 +1,109 @@
+# 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 = 203
+group = 'lists_and_for'
+number = 3
+visible = True
+
+solution = '''\
+xs = [42, 5, 4, -7, 2, 12, -3, -4, 11, 42, 2]
+
+stevec = 0
+for x in xs:
+ if x == 42:
+ stevec += 1
+print("Število 42 se v seznamu pojavi", stevec, "krat.")
+'''
+
+hint_type = {
+ 'no_xs': Hint('no_xs'),
+ 'for_loop': Hint('for_loop'),
+ 'if_clause': Hint('if_clause'),
+ 'printing': Hint('printing'),
+ 'print_out_for': Hint('print_out_for'),
+ 'final_hint': Hint('final_hint')
+}
+
+def test(python, code):
+ test_xs = [[42, 5, 4, -7, 2, 42, -3, -4, 11, 42, 2],
+ [42, 5, 4, -7, 2, 12, 42, -4, 11, 2],
+ [5, 4, -7, 2, 12, -3, -4, 11, 2],
+ [],
+ [42],
+ [42, 42],
+ [1, 2, 3, -42],
+ [1, 2, 3, 42, -42]]
+ test_out = [
+ 3,
+ 2,
+ 0,
+ 0,
+ 1,
+ 2,
+ 0,
+ 1
+ ]
+
+ n_correct = 0
+ tin = None
+ for xs_i, xs in enumerate(test_xs):
+ # change code to contain new xs instead of the one
+ # given by user
+ tcode = re.sub(r'^xs\s*=\s*\[.*?\]',
+ 'xs = ' + str(xs),
+ code,
+ flags = re.DOTALL | re.MULTILINE)
+
+ # use python session to call tcode
+ answers = python(code=tcode, inputs=[(None, None)], timeout=1.0)
+ output = answers[0][1]
+
+ if str(test_out[xs_i]) in output:
+ n_correct += 1
+ else:
+ tin = test_xs[xs_i]
+ tout = test_out[xs_i]
+
+ passed = n_correct == len(test_xs)
+ hints = [{'id': 'test_results', 'args': {'passed': n_correct, 'total': len(test_xs)}}]
+ 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):
+ # 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
+
+ tokens = get_tokens(code)
+
+ # if has no xs, tell him to ask for values
+ if not has_token_sequence(tokens, ['xs', '=', '[']):
+ return [{'id' : 'no_xs'}]
+
+ # 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' : 'for_loop'}]
+
+ if not has_token_sequence(tokens, ['if']):
+ return [{'id' : 'if_clause'}]
+
+ # student is not using print function
+ if not has_token_sequence(tokens, ['print']):
+ return [{'id' : 'printing'}]
+
+ # student is not using print at the beginning of line
+ if not has_token_sequence(tokens, ['\n', 'print']):
+ return [{'id' : 'print_out_for'}]
+
+
+ return None
diff --git a/python/problems/lists_and_for/counting/en.py b/python/problems/lists_and_for/counting/en.py
new file mode 100644
index 0000000..805b37c
--- /dev/null
+++ b/python/problems/lists_and_for/counting/en.py
@@ -0,0 +1,16 @@
+# coding=utf-8
+
+id = 193
+name = 'Contains 42'
+slug = 'Contains 42'
+
+description = '''\
+<p>(translation missing)</p>'''
+
+hint = {
+ 'plan': '''\
+<p>(translation missing)</p>''',
+
+ 'no_input_call': '''\
+<p>(translation missing)</p>''',
+}
diff --git a/python/problems/lists_and_for/counting/sl.py b/python/problems/lists_and_for/counting/sl.py
new file mode 100644
index 0000000..67dc323
--- /dev/null
+++ b/python/problems/lists_and_for/counting/sl.py
@@ -0,0 +1,90 @@
+# coding=utf-8
+import server
+mod = server.problems.load_language('python', 'sl')
+
+
+id = 203
+name = 'Štej'
+slug = 'Štej'
+
+
+description = '''\
+<p>Napiši program, ki v podanem seznamu prešteje število ponovitev števila 42.
+Seznam <code>xs</code> definiraj na vrhu programa, kot v prejšnjih nalogah,
+izpis pa naj bo takšen: "Število 42 se v seznamu pojavi 2 krat."'''
+
+for_loop = ['''\
+<p>Pregledati bo treba vse elemente v seznamu <code>xs</code>''',
+ '''\
+<p>Najlažje s <code>for</code> zanko.
+''',
+ '''\
+<p>Poskusi naslednji dve vrstici:</p>
+<pre>
+for x in xs:
+ print (x)
+</pre>''',
+ '''\
+<p>V zgornjem primeru z zanko <code>for</code> Pythonu naročimo naj se sprehodi čez seznam <code>xs</code>
+in na vsakem koraku trenutni element seznama shrani v spremenljivko <code>x</code>.
+Kaj naj Python naredi s to spremenljivko, je zapisano v zamaknjenih vrsticah.
+V danem primeru vrednost le izpišemo.</p>''']
+
+if_clause = ['''\
+<p>Preveri, ali imamo število 42?</p>''',
+ '''\
+<p>Uporabi pogojni stavek <code>if</code>!</p>''',
+ '''\
+<pre>
+if x == 42:
+</pre>''']
+
+count_42 = ['''\
+<p>Zapomni si, da si našel 42! Povečaj števec!</p>''',
+ '''\
+<p>Števec na začetku nastavimo na 0</p>
+<pre>
+stevec = 0
+</pre>
+<p>in ga tekom zanke ustrezno spreminjamo.''']
+
+plan = ['''\
+<p><b>Plan</b>: Preglej vse elemente v seznamu in vsakič, ko srečaš 42, povečaj
+števec za 1.</p>
+''',
+ '''\
+<p>Bolj podroben plan: </p>
+<pre>
+Za vsak element v seznamu
+ Poglej, ali je 42?
+ Če je, povečaj števec.
+Izpiši števec.
+</pre>
+<p>Zdaj pa je potrebno le še slovenščino prevesti v Python.</p>
+''',
+ for_loop,
+ if_clause,
+ count_42]
+
+hint = {
+ 'no_xs': ['''\
+<p>Program mora imeti na začetku definiran seznam <code>xs</code>.</p>'''],
+
+ 'for_loop': for_loop,
+
+ 'if_clause': if_clause,
+
+ 'printing': ['''\
+<p>Izpiši rezultat.</p>'''],
+
+ 'print_out_for': ['''\
+<p>Pazi, da izpišeš rezultat izven zanke!</p>'''],
+
+ 'final_hint:': ['''\
+ <p>Nalogo lahko rešiš bistveno hitreje, če poznaš metodo <code>count</code></p>
+ <pre>
+ xs = [42, 5, 4, -7, 2, 12, -3, -4, 11, 42, 2]
+ print('Število 42 se v seznamu pojavi', xs.count(42), 'krat.')
+</pre>''']
+
+}
diff --git a/python/problems/while_and_if/consumers_anonymous/common.py b/python/problems/while_and_if/consumers_anonymous/common.py
index ff3f928..07a0ebf 100644
--- a/python/problems/while_and_if/consumers_anonymous/common.py
+++ b/python/problems/while_and_if/consumers_anonymous/common.py
@@ -32,6 +32,7 @@ hint_type = {
'final_hint': Hint('final_hint'),
'summation': Hint('summation'),
'counting': Hint('counting'),
+ 'counting_with_0': Hint('counting_with_0'),
'problematic_test_case': Hint('problematic_test_case'),
}
@@ -53,7 +54,8 @@ def test(python, code):
(105, 3),
(10, 10),
(10, 10),
- (9, 9)
+ (9, 9),
+ (0, 0)
]
# List of outputs: (expression result, stdout, stderr, exception).
@@ -114,14 +116,18 @@ def hint(python, code):
# student's answer is not correct (three possibilities)
if not string_almost_equal(answer[0][1], 15) or \
- not string_almost_equal(answer[0][2], 105) or \
- not string_almost_equal(answer[0][3], 20):
+ not string_almost_equal(answer[1][1], 105) or \
+ not string_almost_equal(answer[2][1], 20):
return [{'id' : 'summation'}]
- # student's answer is not correct (three possibilities)
- if not string_almost_equal(answer[0][1], 2) or \
- not string_almost_equal(answer[0][2], 3) or \
- not string_almost_equal(answer[0][3], 10):
+ # student's counting of items, when last price iz zero is incorrect
+ if not string_almost_equal(answer[0][1], 2) and \
+ string_almost_equal(answer[0][1], 3):
+ return [{'id' : 'counting_with_0'}]
+
+ # counting in general is incorrect
+ if not string_almost_equal(answer[1][1], 3) or \
+ not string_almost_equal(answer[2][1], 10):
return [{'id' : 'counting'}]
return None
diff --git a/python/problems/while_and_if/consumers_anonymous/sl.py b/python/problems/while_and_if/consumers_anonymous/sl.py
index ee2700c..284abbc 100644
--- a/python/problems/while_and_if/consumers_anonymous/sl.py
+++ b/python/problems/while_and_if/consumers_anonymous/sl.py
@@ -96,6 +96,9 @@ hint = {
'counting': ['''<p>Napaka pri štetju stvari.<p>'''],
+ 'counting_with_0': ['''<p>Napaka pri štetju, kadar je zadnja cena 0.<p>''',
+ '''<p>Števec povečaj, le če je cena > 0</p>'''],
+
'name_error' : [mod.general_msg['error_head'],
mod.general_msg['general_exception'],
mod.general_msg['name_error'],
@@ -107,9 +110,10 @@ hint = {
Pravilna vsota [%=sum%], pravilno število stvari: [%=count%]'''],
'final_hint': ['''\
-<p><b>Odlično!</b>Naloga rešena.</p>
-Še zanimivost: v while zanki smo negirali ustavitveni pogoj tako, da smo negirali posamezne pogoje in
-spremenili pogoj <code>or</code> v <code>and</code>. Temu pravimo De Morganov zakon.
+<p><b>Odlično!</b> Naloga rešena.</p>
+Še zanimivost: v while zanki smo dobili ustavitveni pogoj tako, da smo negirali pogoj iz teksta (ali vnesemo 0 ali je
+vnešenih deset števil ali ko vsota cen doseže ali preseže 100 evrov). Pri tem smo ali (or) spremenili v in (and):
+<code>cena > 0 and stevec < 10 and vsota < 100</code>. Temu pravimo De Morganov zakon.
'''],
'eof_error':[mod.general_msg['eof_error'],