summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Sadikov <aleksander.sadikov@fri.uni-lj.si>2016-03-30 16:15:39 +0200
committerAleksander Sadikov <aleksander.sadikov@fri.uni-lj.si>2016-03-30 16:15:39 +0200
commit356195ee77fdbebcca310e3a9250a61c4f117941 (patch)
treeb4d5bb10a5d378fcb52d6394c35908f12964ad68
parent26e076b9f550a2c6e86f8868904d315ff17c24bc (diff)
Hints and plans for sins/3 added.
-rw-r--r--prolog/problems/sorting/is_sorted_1/sl.py2
-rw-r--r--prolog/problems/sorting/sins_3/sl.py45
2 files changed, 35 insertions, 12 deletions
diff --git a/prolog/problems/sorting/is_sorted_1/sl.py b/prolog/problems/sorting/is_sorted_1/sl.py
index 4b201a5..67795d6 100644
--- a/prolog/problems/sorting/is_sorted_1/sl.py
+++ b/prolog/problems/sorting/is_sorted_1/sl.py
@@ -14,7 +14,7 @@ description = '''\
plan = ['''\
<p>Kot vedno, poskusi prevesti na manjši problem. Naredi ustrezno primerjavo na začetku seznama, rep
-pa prepusti rekurziji. </p>
+pa prepusti rekurziji.</p>
''', '''\
<p>Saj znaš dostopati do prvih dveh elementov seznama, kajne? Aritmetične operatorje za primerjanje pa smo
spoznali v prejšnjem sklopu.</p>
diff --git a/prolog/problems/sorting/sins_3/sl.py b/prolog/problems/sorting/sins_3/sl.py
index d2a8ccb..3f96dff 100644
--- a/prolog/problems/sorting/sins_3/sl.py
+++ b/prolog/problems/sorting/sins_3/sl.py
@@ -1,3 +1,5 @@
+# coding=utf-8
+
name = 'sins/3'
slug = 'Vstavi element na ustrezno mesto v urejen seznam'
@@ -10,6 +12,18 @@ description = '''\
L = [1,2,3,3,4].
</pre>'''
+plan = ['''\
+<p>Za začetek se spomnimo, da vstavljamo v <em>urejen</em> seznam. Sprehodimo se po njem, dokler ne najdemo
+ustreznega mesta za novi element.</p>
+''', '''\
+<p>Korak za korakom nov element primerjamo s trenutno glavo seznama v katerega vstavljamo. Glave bodo vedno
+večje, ker je originalni seznam urejen. Kar pomeni, da bo enkrat novi element manjši od trenutne glave, kajne?</p>
+''', '''\
+<p>Če je nov element <code>X</code> večji od trenutne glave <code>H</code>, potem ga vstavimo nekam v rep -- za to bo,
+kot vedno, poskrbela rekurzija, kajne? Sicer pa smo že našli ustrezno mesto in ga vstavimo sedaj <em>pred</em> trenutno
+glavo <code>H</code>! Saj znaš pred rep postaviti dva elementa naenkrat? (Je enako, kot da bi ju vzel stran.)</p>
+''']
+
hint = {
'eq_instead_of_equ': '''\
<p>Operator <code>==</code> je strožji od operatorja <code>=</code> v smislu, da je za slednjega dovolj,
@@ -23,8 +37,7 @@ implicitno že kar v argumentih predikata (glavi stavka).</p>
''',
'base_case': '''\
-<p>Si pomislil na robni pogoj? Kaj je najbolj enostaven primer, ko je element v seznamu?
-Do katerega elementa najlažje prideš?</p>
+<p>Si pomislil na robni pogoj? To bo najbrž kar primer, ko (končno) vstaviš nov element v seznam.</p>
''',
'recursive_case': '''\
@@ -32,11 +45,11 @@ Do katerega elementa najlažje prideš?</p>
''',
'predicate_always_false': '''\
-<p>Vse kaže, da tvoj predikat vedno vrne <code>false</code>. Si mu dal pravilno ime, si se morda pri imenu zatipkal?</p>
+<p>Vse kaže, da tvoj predikat vedno vrne "false". Si mu dal pravilno ime, si se morda pri imenu zatipkal?</p>
<p>Če je ime pravilno, se morda splača preveriti tudi, če se nisi zatipkal kje drugje,
je morda kakšna pika namesto vejice ali obratno, morda kakšna spremenljivka z malo začetnico?</p>
<p>Možno je seveda tudi, da so tvoji pogoji prestrogi ali celo nemogoči (kot bi bila npr. zahteva,
-da je <code>X</code> hkrati starš in sestra od <code>Y</code> ali kaj podobno zlobnega).</p>
+da je <code>N</code> enako kot <code>N + 1</code> ali kaj podobno logično zlobnega).</p>
''',
'timeout': '''\
@@ -45,30 +58,40 @@ da je <code>X</code> hkrati starš in sestra od <code>Y</code> ali kaj podobno z
''',
'bad_[]_case': '''\
-<p>bad_[]_case</p>
+<p>Kaj je rezultat, če vstaviš nek element v prazen seznam? Gotovo ne prazen seznam ali celo karkoli (spremenljivka
+brez določene vrednosti).</p>
''',
'returns_elem_instead_of_list': '''\
-<p>returns_elem_instead_of_list</p>
+<p>Vrniti moraš <em>seznam</em>, ne element.</p>
''',
'maxEl_base_case_missing': '''\
-<p>maxEl_base_case_missing</p>
+<p>Rešitev je skoraj pravilna. Ampak mislim, da si pozabil na en poseben primer. Kaj se zgodi, če vstavljaš v seznam
+nov največji element? Poskusi spodnji klic.</p>
+<p><code>?- sins(9, [1,2,3,4,5], L).</code></p>
''',
'x_and_head_swapped': '''\
-<p>x_and_head_swapped</p>
+<p>Hmmm, v kakšnem vrstnem redu morata biti nov element in trenutna glava seznama?</p>
+<p><code>?- sins(3, [1,2,4,5,6], L).</code></p>
''',
'duplicates_incorrect': '''\
-<p>duplicates_incorrect</p>
+<p>Si pozabil, da seznam dovoljuje tudi vstavljanje duplikatov? Prvi klic spodaj deluje, drugi ne.</p>
+<p><code>?- sins(3, [1,2,4,5,6], L).</code></p>
+<p><code>?- sins(3, [1,2,3,4,5], L).</code></p>
''',
'unprotected_branch': '''\
-<p>unprotected_branch</p>
+<p>Si "zaščitil" (s pogojem) obe možnosti (veji)? Pazi, če ena nima pogoja, bo prva rešitev verjetno pravilna, vendar
+pa bodo možne še druge rešitve, ki ne bodo. Podpičje pomeni logični OR in ne logični XOR. Kar pomeni, da lahko prolog
+poišče alternative v drugi veji, čeprav je pogoj v prvi veji izpolnjen! Zato sta potrebna oba pogoja.</p>
''',
'forgotten_heads': '''\
-<p>forgotten_heads</p>
+<p>Si pozabil v seznam vrniti glave, ki si jih pred vstopom v rekurzijo dal na sklad? Tudi jaz sem jih... ;)</p>
+<p>Poglej kaj se zgodi ob spodnjem vprašanju in ti bo takoj vse jasno.</p>
+<p><code>?- sins(4, [1,2,3,5,6], L).</code></p>
''',
}