diff options
Diffstat (limited to 'prolog')
-rw-r--r-- | prolog/problems/sorting/is_sorted_1/sl.py | 2 | ||||
-rw-r--r-- | prolog/problems/sorting/sins_3/sl.py | 45 |
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> ''', } |