diff options
author | Aleksander Sadikov <aleksander.sadikov@fri.uni-lj.si> | 2016-03-30 17:30:08 +0200 |
---|---|---|
committer | Aleksander Sadikov <aleksander.sadikov@fri.uni-lj.si> | 2016-03-30 17:30:08 +0200 |
commit | df9d00a9cb2f8a14c971c44cb0d05454a6281d61 (patch) | |
tree | 098b3e7f6d5ca7e8eb29b991d7ae74d40fef12cf /prolog/problems/sorting/pivoting_4 | |
parent | 356195ee77fdbebcca310e3a9250a61c4f117941 (diff) |
Hints and plans for pivoting/4 added.
Diffstat (limited to 'prolog/problems/sorting/pivoting_4')
-rw-r--r-- | prolog/problems/sorting/pivoting_4/sl.py | 54 |
1 files changed, 41 insertions, 13 deletions
diff --git a/prolog/problems/sorting/pivoting_4/sl.py b/prolog/problems/sorting/pivoting_4/sl.py index c173dbc..191c823 100644 --- a/prolog/problems/sorting/pivoting_4/sl.py +++ b/prolog/problems/sorting/pivoting_4/sl.py @@ -10,6 +10,20 @@ description = '''\ S = [1,4,4,2], G = [5,8,6]. </pre>''' +plan = ['''\ +<p>Precej klasična rekurzivna rešitev, za glavo seznama poskrbiš ti sam, za rep pa poskrbi rekurzija. Sta pa dve veji, +seveda, ker je glava seznama lahko večja ali manjša od pivota.</p> +''', '''\ +<p>Sprehodi se po seznamu in trenutno glavo <em>ob sestopanju</em> iz rekurzije vrži ali v seznam z večjimi ali +pa v seznam z manjšimi elementi.</p> +''', '''\ +<p>Če je glava <code>H</code> seznama <code>L</code> manjša ali enaka pivotu <code>P</code> in če predpostavimo, da +rekurzija vrne pravilno razdeljene elemenente repa <code>T</code> med seznama <code>SmallerElems</code> in +<code>GreaterElems</code> in če vstavimo <code>H</code> na začetek seznama <code>SmallerElems</code>, potem smo +pravilno razdelili vse elemente seznama <code>L</code> na manjše in večje. Podobno velja za drugo možnost, ko je +glava seznama <code>H</code> večja od pivota <code>P</code>.</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? Kateri seznam lahko razdelim praktično brez dela?</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>X</code> <em>hkrati</em> večji in manjši od <code>Y</code> ali kaj podobno logično sumljivega).</p> ''', 'timeout': '''\ @@ -45,31 +58,46 @@ da je <code>X</code> hkrati starš in sestra od <code>Y</code> ali kaj podobno z ''', '>_and_<_mixed_up': '''\ -<p>>_and_<_mixed_up</p> +<p>Si zamešal pogoja? V seznamu manjših elementov so pristali večji in obratno. Tudi meni je to uspelo! ;)</p> +<p><code>?- pivoting(4, [1,4,5,8,6,4,2], SmallerElems, GreaterElems).</code></p> ''', 'duplicates_not_considered': '''\ -<p>duplicates_not_considered</p> +<p>Si pozabil, da je lahko kakšen element v seznamu tudi enak pivotu? Kam ga daš v tem primeru? Ta hip nikamor, +zato je prologov vesel (in žal logičen) odgovor seveda... da, uganil si, "false"!</p> ''', 'all_elements_in_either_S_or_G': '''\ -<p>all_elements_in_either_S_or_G</p> +<p>Kako to, da prav <em>vsi</em> elementi seznama pristanejo ali med večjimi ali med manjšimi elementi? +Napačen pogoj ali morda copy/paste napaka?</p> ''', 'arbitrary_solution': '''\ -<p>arbitrary_solution</p> +<p>To je pa zlobna napaka. Za en seznam, ki ga vračaš, si lepo poskrbel, za drugega pa nisi. Če recimo glavo +<code>H</code> vstaviš v seznam manjših elementov <code>[H|SmallerElems]</code> je to v redu, a ne pozabi povedati +še kaj je s seznamom večjih elementov (pa četudi je povsem enak kot ga vrne rekurzija).</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> +<p>Poskusi spodnje vprašanje in zahtevaj <em>več</em> rešitev.</p> +<p><code>?- pivoting(4, [1,4,5,8,6,4,2], SmallerElems, GreaterElems).</code></p> ''', - 'forcing_result_onto_recursion': '''\ -<p>forcing_result_onto_recursion</p> + 'forcing_result_onto_recursion': ''' +<p>Ne vsiljuj rekurziji kaj naj vrne, prepusti se ji. To je tisti del, ko narediš predpostavko, +če je ta izpolnjena, potem bo tvoje pravilo delovalo za večji primer.</p> +<p>Je tvoj rekurzivni klic oblike <code>pivoting(P, T, [H|SmallerElems], GreaterElems)</code>? S tem vsiljuješ rekurziji +da mora <emph>vrniti</emph> tudi glavo <code>H</code>, ki je sploh ne pozna, ker si jo ravnokar vzel stran! To moraš +narediti ti z rezultatom, ki ti ga rekurzija vrne. Skratka, element <code>H</code> vstavi izven rekurzivnega klica.</p> ''', 'no_recursion_in_one_branch': '''\ -<p>no_recursion_in_one_branch</p> +<p>To je precej tipična napaka pri uporabi podpičja. Preberi vsak ALI blok zase! Se ti ne zdi, da si v enem bloku, +največkrat drugem, pozabil nekaj? Morda rekurzijo? Ne pozabi: oba bloka sta med seboj neodvisna! Ali se izvede eno +ali pa drugo, ne bo se nikoli oboje hkrati! In rezultati se med vejami ne prenašajo, spomni se na doseg spremenljivk +v prologu.</p> ''', - } |