NDP 21s házi feladat FAQ


3. KHF, 3. feladat

A lakótelepes feladatnál működik a programom, de lassú, az utolsó, 7x7-es tesztesetet már nem tudja időben megcsinálni. Azt szeretném megkérdezni, hogy ezt milyen módon érdemes optimalizálni. Jelenleg ez a "latszam" függvényem, amit ugye sokat használ:

latszam([], 0).
latszam([H|T], K) :- K1 #= K-1, nez(T, K1, H).

nez([H|T], K, Max) :- K #> 0, H #> Max, K1 #= K-1, nez(T, K1, H).
nez([H|T], K, Max) :- K #> 0, H #=< Max, nez(T, K, Max).
nez(L, 0, Max) :- nemnagyobb(L, Max).

nemnagyobb([], _).
nemnagyobb([H|T], Max) :- H #=< Max, nemnagyobb(T, Max).

Ezzel lehet gond?


Igen, ez az eljárás választási pontot hoz létre, ami nagyon nem hatékony, és a feladat kiírásában is tiltva van.


A nez/3 eljárásod hasonló szerkezetű, mint a pontosan/3 eljárás (171. dia), amit ezen a hivatkozott dián még reifikáció nélkül írtunk meg.

 

Vagy egy ilyen példához ezt a függvényt felhasználói korlátként kellene megírni, mint ahogy az utolsó óra végén az "exactly"-t is átírtuk? Úgy gyorsabb lenne?


Igen ez is jó lehet, de elég nagy munka.  Elég ha átírod úgy, hogy reifikációt használjon (lásd pl. pontosan3/3 a 182. dián). Tipp: alaposan tanulmányozd a 138. dia legelső bajuszát, ahol a clpfd által kezelt aritmetikai függvényeket soroljuk fel.


Illetve még egy kérdésem lenne, hogy az is baj, ha egy teszteset lefut, csak részekben adja meg a választ, és így hibásnak írja a tesztet? Erre gondolok:

expected  success,
got            3-fold_success

A fenti "latszam" függvény ezt produkálja erre a hívásra:
length(L,4),domain(L,1,4),
A három lehetőségben különböző módon szűkített változó-csoportok vannak.


Igen, ez a teszteset pont azt hivatott ellenőrizni, hogy létrehozol-e választási pontot, ami a kiírásban tiltva van.