From 356195ee77fdbebcca310e3a9250a61c4f117941 Mon Sep 17 00:00:00 2001 From: Aleksander Sadikov Date: Wed, 30 Mar 2016 16:15:39 +0200 Subject: Hints and plans for sins/3 added. --- prolog/problems/sorting/is_sorted_1/sl.py | 2 +- prolog/problems/sorting/sins_3/sl.py | 45 +++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 12 deletions(-) (limited to 'prolog/problems') 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 = ['''\

Kot vedno, poskusi prevesti na manjši problem. Naredi ustrezno primerjavo na začetku seznama, rep -pa prepusti rekurziji.

+pa prepusti rekurziji.

''', '''\

Saj znaš dostopati do prvih dveh elementov seznama, kajne? Aritmetične operatorje za primerjanje pa smo spoznali v prejšnjem sklopu.

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]. ''' +plan = ['''\ +

Za začetek se spomnimo, da vstavljamo v urejen seznam. Sprehodimo se po njem, dokler ne najdemo +ustreznega mesta za novi element.

+''', '''\ +

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?

+''', '''\ +

Če je nov element X večji od trenutne glave H, 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 pred trenutno +glavo H! Saj znaš pred rep postaviti dva elementa naenkrat? (Je enako, kot da bi ju vzel stran.)

+'''] + hint = { 'eq_instead_of_equ': '''\

Operator == je strožji od operatorja = v smislu, da je za slednjega dovolj, @@ -23,8 +37,7 @@ implicitno že kar v argumentih predikata (glavi stavka).

''', 'base_case': '''\ -

Si pomislil na robni pogoj? Kaj je najbolj enostaven primer, ko je element v seznamu? -Do katerega elementa najlažje prideš?

+

Si pomislil na robni pogoj? To bo najbrž kar primer, ko (končno) vstaviš nov element v seznam.

''', 'recursive_case': '''\ @@ -32,11 +45,11 @@ Do katerega elementa najlažje prideš?

''', 'predicate_always_false': '''\ -

Vse kaže, da tvoj predikat vedno vrne false. Si mu dal pravilno ime, si se morda pri imenu zatipkal?

+

Vse kaže, da tvoj predikat vedno vrne "false". Si mu dal pravilno ime, si se morda pri imenu zatipkal?

Č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?

Možno je seveda tudi, da so tvoji pogoji prestrogi ali celo nemogoči (kot bi bila npr. zahteva, -da je X hkrati starš in sestra od Y ali kaj podobno zlobnega).

+da je N enako kot N + 1 ali kaj podobno logično zlobnega).

''', 'timeout': '''\ @@ -45,30 +58,40 @@ da je X hkrati starš in sestra od Y ali kaj podobno z ''', 'bad_[]_case': '''\ -

bad_[]_case

+

Kaj je rezultat, če vstaviš nek element v prazen seznam? Gotovo ne prazen seznam ali celo karkoli (spremenljivka +brez določene vrednosti).

''', 'returns_elem_instead_of_list': '''\ -

returns_elem_instead_of_list

+

Vrniti moraš seznam, ne element.

''', 'maxEl_base_case_missing': '''\ -

maxEl_base_case_missing

+

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.

+

?- sins(9, [1,2,3,4,5], L).

''', 'x_and_head_swapped': '''\ -

x_and_head_swapped

+

Hmmm, v kakšnem vrstnem redu morata biti nov element in trenutna glava seznama?

+

?- sins(3, [1,2,4,5,6], L).

''', 'duplicates_incorrect': '''\ -

duplicates_incorrect

+

Si pozabil, da seznam dovoljuje tudi vstavljanje duplikatov? Prvi klic spodaj deluje, drugi ne.

+

?- sins(3, [1,2,4,5,6], L).

+

?- sins(3, [1,2,3,4,5], L).

''', 'unprotected_branch': '''\ -

unprotected_branch

+

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.

''', 'forgotten_heads': '''\ -

forgotten_heads

+

Si pozabil v seznam vrniti glave, ki si jih pred vstopom v rekurzijo dal na sklad? Tudi jaz sem jih... ;)

+

Poglej kaj se zgodi ob spodnjem vprašanju in ti bo takoj vse jasno.

+

?- sins(4, [1,2,3,5,6], L).

''', } -- cgit v1.2.1