summaryrefslogtreecommitdiff
path: root/prolog/problems/sorting/sins_3
diff options
context:
space:
mode:
Diffstat (limited to 'prolog/problems/sorting/sins_3')
-rw-r--r--prolog/problems/sorting/sins_3/sl.py45
1 files changed, 34 insertions, 11 deletions
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>
''',
}