BME Villamosmérnöki és Informatikai Kar
Műszaki informatika szak |
Nappali tagozat
2000/2001-es tanév
|
n*m
parcella van a kertben (hosszában n
, széltében
m
). Ismerjük a fák pontos helyét, továbbá a sátrak számát soronként és
oszloponként. A fát, amelyhez a sátor hozzá van kötve, a sátor saját fájának nevezzük.
Meghatározandó a sátrak helyzete a saját fájukhoz képest. Példa:
1 --------> m 1 0 2 0 2 1 +--+--+--+--+--+ 1 | |F | | | | | +--+--+--+--+--+ | 1 | | | | | | | +--+--+--+--+--+ | 0 | | |F | |F | | +--+--+--+--+--+ v 3 | | | | | | +--+--+--+--+--+ n 0 |F | | | |F | +--+--+--+--+--+ |
1 0 2 0 2 +--+--+--+--+--+ 1 | | F-S | | | +--+--+--+--+--+ 1 | | | | |S | +--+--+--+--+|-+ 0 | | |F | |F | +--+--+|-+--+--+ 3 |S | |S | |S | +|-+--+--+--+|-+ 0 |F | | | |F | +--+--+--+--+--+ |
|
1. ábra. Egy feladvány (n=5 , m=5 ) |
2. ábra. A feladvány egy megoldása |
Előfordulhat, hogy egyes sorokban, ill. oszlopokban nem írjuk elő a sátrak számát: ezt a megfelelő sor, ill. oszlop elején álló negatív szám jelzi. Példa:
1 --------> m 1 0 -1 0 2 1 +--+--+--+--+--+ 1 | |F | | | | | +--+--+--+--+--+ | 1 | | | | | | | +--+--+--+--+--+ |-1 | | |F | |F | | +--+--+--+--+--+ v 3 | | | | | | +--+--+--+--+--+ n 0 |F | | | |F | +--+--+--+--+--+ |
3. ábra. Negatív szám jelzi, ha nem írjuk elő a sátrak számát egy-egy sorban vagy oszlopban
satrak
néven olyan Prolog-eljárást, ill. SML-függvényt, amely egy
feladvány összes megoldását előállítja!
A Prolog-eljárásnak két paramétere van. Első (bemenő) paramétere a feladványt, második (kimenő) paramétere a megoldást írja le. Az eljárásnak a visszalépések során minden megoldást pontosan egyszer kell kiadnia. Ha a feladványnak nincs megoldása, az eljárás hiúsuljon meg.
A Prolog-eljárás bemenő paramétere egy
satrak(Ss, Os, Fs)
Ss
a sátrak soronkénti számát tartalmazó lista,
Os
a sátrak oszloponkénti számát tartalmazó lista és
Fs
a fák sorát és oszlopát azonosító (i,j)
párok lexikografikusan rendezett listája.
Az 1. ábrán bemutatott feladvány esetén például a Prolog-eljárás bemenő paramétere:
satrak([1,1,0,3,0], [1,0,2,0,2], [1-2,3-3,3-5,5-1,5-5])
(i,j)
párt i-j
alakú Prolog-struktúrával írjuk le.
A Prolog-eljárás kimenő paramétere egy olyan lista, amely - a fák Fs
-beli
megadási sorrendjét követve - a sátrak saját fájukhoz viszonyított helyzetét írja le. Egy
sátor helyzetét a megfelelő égtájat jelölő betűvel adjuk meg:
w (west) - a sátor a saját fájától nyugatra áll,
| n (north) - a sátor a saját fájától északra áll,
|
e (east) - a sátor a saját fájától keletre áll,
| s (south) - a sátor a saját fájától délre áll.
|
A 2. ábrán látható megoldást írja le például az alábbi lista:
[e,s,n,n,n]
(Ss, Os, Fs)
hármas, ahol
Ss
, Os
és Fs
jelentése azonos a Prolog-eljárásnál
leírtakkal.
Az 1. ábrán bemutatott feladvány esetén például az SML-függvény paramétere:
([1,1,0,3,0], [1,0,2,0,2], [(1,2),(3,3),(3,5),(5,1),(5,5)])
A 2. ábrán látható megoldást írja le például az alábbi listák listája:
[[e,s,n,n,n]]
A satrak
függvény paraméterének és eredményének típusát a következő
SML-típusdefiníciók írják le.
structure TSatrak = struct (* a bemenő adatokat leíró típusok *) (* a sátrak száma soronként és oszloponként; negatív szám jelzi, ha nincs megkötve a sátrak száma egy-egy sorban vagy oszlopban *) type sSzS = int list type sSzO = int list (* egy parcella sor- és oszlopszáma *) type parc = int * int (* a feladványt leíró hármas *) type fLeiro = sSzS * sSzO * parc list (* a kimenő adatokat leíró típusok *) (* irány; n - észak, e - kelet, s - dél, w - nyugat *) datatype irany = n | e | s | w (* a sátrak saját fájukhoz viszonyított helyzetének listája *) type sHelyek = irany list end
signature Satrak = sig (* satrak(Ss, Os, Fs) = a kertben a sátrak saját Fs-beli fájukhoz viszonyított összes lehetséges helyzetét leíró listák listája *) val satrak : TSatrak.fLeiro -> TSatrak.sHelyek list endA
satrak/2
Prolog-eljárás paramétereinek típusát a következő - megjegyzésként
megadott - Prolog-típusdefiníciók írják le.
% :- type fLeiro ---> satrak(sSzS, sSzO, list(parc)). % :- type sSzS == list(int). % :- type sSzO == list(int). % :- type parc == int-int. % :- type irany ---> n % észak % ; e % kelet % ; s % dél % ; w. % nyugat % :- type sHelyek == list(irany). % :- pred satrak(fLeiro::in, sHelyek::out).
A keretprogram bemenete egy olyan szöveges állomány, amelynek soraiban a feladványmátrix sorai vannak; az üres parcellákat "-" jel jelöli.
1 0 2 0 2 1 - F - - - 1 - - - - - 0 - - F - F 3 - - - - - 0 F - - - F |
4. ábra. A bemenő állomány tartalma az 1. ábrán látható feladvány esetén |
A keretprogram kimenete a 2. ábrán bemutatotthoz hasonló tartalmú szöveges állomány.
Az SML-keretprogram három függvényt exportál:
signature KSatrak = sig val satrak_be : string -> TSatrak.fLeiro val satrak_ki : string * TSatrak.sHelyek list * TSatrak.fLeiro -> unit val megold : string * string -> string end
satrak_be f
f
szöveges állományból beolvasott adatokból képzett feladványleíró.
satrak_ki(m, mss, fl)
mss
megoldáslista és az fl
feladványleíró alapján az
összes megoldást kiírja az m
szöveges állományba.
megold(f, m)
f
szöveges állományból és kiírja az összes
megoldást az m
szöveges állományba. Ehhez természetesen szüksége van
a Satrak.satrak
függvényre. Eredménye az f
nevet, a
megoldások számát és a futási időt mp-ben tartalmazó füzér.
/dev/stdin
, ill. a /dev/stdout
, MS-DOS alatt mindkét esetben a
con
állománynév megadásával.
A Prolog-keretprogram három eljárást exportál:
satrak_be(file::in, fLeiro::out)
satrak_ki(file::in, sHelyek::in, fLeiro::in)
megold(file::in, file::in)
satrak/2
eljárásra.
A keretprogram felhasználja a file
típust:
% :- type file == atom.A
file
típusú paraméterben a user
atomot megadva a terminálról
vihetünk be, ill. a terminálra irathatunk ki adatokat. Egyébként a megadott nevű
állományba írunk, ill. állományból olvasunk.
A két programhoz közös dokumentációt készítsen - vagy magyarul, vagy angolul. A dokumentáció tartalma legalább a következő legyen:
A dokumentációt elektronikus formában adja be, HTML, esetleg ASCII formátumban.
bash
szkript
szkript segítségével.
A programok és az elektronikus dokumentáció beadási határideje a létraversenyen való részvételhez 2001. május 14-e, hétfő 24h. A házi feladatok végső beadási határideje 2001. május 28-án hétfőn 24h-kor van. További feltétel, hogy a megoldást a vizsga előtt öt nappal éjfélig be kell adni (azaz a május 23-án vizsgázóknak 18-án, a május 29-én vizsgázóknak 24-én éjfélig).
A vizsgaosztályzatban a határidőre beadott nagyfeladat eredményét 15%-os súllyal vesszük figyelembe.
A hibátlan nagyfeladatot 2001. május 14-éig beadók SML- és/vagy Prolog-programjukkal létraversenyben vesznek részt. A leggyorsabban futó SML-, ill. Prolog-programokra - helyezési számuktól függően - külön-külön 30 és 2 közötti pluszpont kapható, a féléves összpontszámhoz a kapott összegnek a negyedét adjuk hozzá.
A programok készülhetnek MS DOS vagy MS Windows alatt is, de Unix (linux) alatt is működniük kell.