| BME Villamosmérnöki és Informatikai Kar
Műszaki informatika szak |
Nappali tagozat
2006/2007. tanév, tavaszi félév
|
ts = [t0, t1, ...,
tz-1] szólista és egy k egész, ahol a
z ≥ 0 a szólista hossza, a k ≥
1 egész pedig a szólistában lévő szavak maximális átfedésének
mértéke. A szólistában nincsenek ismétlődő szavak.
A feladat tömör áttekintése:
Válogassa ki
ts-ből azokat a ti és tj
szavakat, amelyekhez van olyan h egész 1 ≤ h ≤
k mellett, hogy ti utolsó h karaktere
megegyezik tj első h karakterével.
Az ilyen szavakat a továbbiakban legfeljebb k helyen átfedőnek
vagy röviden max-k-átfedőnek nevezzük.
Precízebben:
Jelöljük
az m ≥ 0 hosszú u
szót alkotó karaktersorozatot a következőképpen:
u0
u1 ...
um-1.
Az
u és v szavakat, amelyek hossza rendre
m és n, h-átfedőnek nevezzük,
ha h ≥ 1, és a következő feltételek mind teljesülnek:
um-h =
v0, um-h+1 =
v1, ..., um-1 =
vh-1. Ilyenkor azt is mondjuk, hogy az u
a v-vel h-átfedésben van.
Írjon programot, amely az összes max-k-átfedő szópárt egy (u,hvs) párokból álló
listaként állítja elő. Itt az u-val jelölt helyen pontosan
akkor kell egy ts-beli szónak
szerepelnie, ha van hozzá egy olyan, tőle különböző
ts-beli szó, amellyel
h ≤ k mellett h-átfedésben van. Egy adott u esetében a vele párban álló
hvs nem más, mint azoknak a (h,v) pároknak a
listája, amelyekre az u a
v-vel h-átfedésben van, ahol
v a ts lista egy eleme, v ≠
u és h ≤ k.
Az (u,hvs) párokból álló listát az
u szavak ábécé szerint növekvő sorrendjében, a
(h,v) párokból álló hvs listát a
h számok, azon belül pedig a v szavak
ábécé szerint növekvő sorrendjében kell előállítani.
Ajánljuk figyelmébe:
u = "itat" és a v =
"tat" szavak h-átfedésben vannak h = 1 és h =
3 esetén is, és az utóbbi esetben u tartalmazza
v-t.)Írjon SML-függvényt max_k_atfedok néven, amely egy
füzérlista szavaiból előállít egy
(u,hvs) párokból álló olyan listát, amelyben minden
u esetén a vele párt alkotó nem-üres hvs lista
pontosan azokból a (h,v) elemekből áll, amelyek esetén az u
a v-vel h-átfedésben van.
Az (u,hvs) párokból álló listát az
u szavak ábécé szerint növekvő sorrendjében, a
(h,v) elemekből álló hvs listát a
h számok, azon belül pedig a v szavak
ábécé szerint növekvő sorrendjében kell előállítani.
(* max_k_atfedok : int -> string list -> (string * (int * string) list) list * max_k_atfedok k ts = a ts lista legfeljebb k helyen átfedő elemeit tartalmazó, * (u,hvs) párokból álló olyan lista, amelyben minden u és a hozzá tartozó hvs * lista minden (h,v) eleme esetén fennáll, hogy az u a v-vel h-átfedésben van. * Az (u,hvs) párok listáját u szerint, a (h,v) párokból álló hvs listákat * pedig előbb a h, majd a v szerint növekvő sorrendben kell előállítani. *)
Az ábécé szerinti sorrend megegyezik a String.compare által
meghatározott sorrenddel. Egy fs füzérlista rendezhető
a Listsort.sort String.compare fs
függvényalkalmazással.
val t1=max_k_atfedok 2 ["asztalos","alma","apu","utas","anyu","satu","malom"];
> val t1 =
[("alma", [(1, "anyu"), (1, "apu"), (1, "asztalos"), (2, "malom")]),
("anyu", [(1, "utas")]),
("apu", [(1, "utas")]),
("asztalos", [(1, "satu")]),
("satu", [(1, "utas")]),
("utas", [(1, "satu"), (2, "asztalos")])
] : (string * (int * string) list) list
val t2=max_k_atfedok 2 ["alma","omlik","mama","malom","ikra","atom","adat","ragad"];
> val t2 =
[("adat", [(2, "atom")]),
("alma", [(1, "adat"), (1, "atom"), (2, "malom"), (2, "mama")]),
("atom", [(1, "malom"), (1, "mama"), (2, "omlik")]),
("ikra", [(1, "adat"), (1, "alma"), (1, "atom"), (2, "ragad")]),
("malom", [(1, "mama"), (2, "omlik")]),
("mama", [(1, "adat"), (1, "alma"), (1, "atom"), (2, "malom")]),
("omlik", [(2, "ikra")]),
("ragad", [(2, "adat")])
] : (string * (int * string) list) list
val t3=max_k_atfedok 3 ["aaa","aab","baa","aaaa"];
> val t3 =
[("aaa", [(1, "aaaa"), (1, "aab"), (2, "aaaa"), (2, "aab"), (3, "aaaa")]),
("aaaa", [(1, "aaa"), (1, "aab"), (2, "aaa"), (2, "aab"), (3, "aaa")]),
("aab", [(1, "baa")]),
("baa", [(1, "aaa"), (1, "aaaa"), (1, "aab"), (2, "aaa"), (2, "aaaa"), (2, "aab")])
] : (string * (int * string) list) list
val t4=max_k_atfedok 999999 ["aaa","aab","baa","aaaa"];
> val t4 =
[("aaa", [(1, "aaaa"), (1, "aab"), (2, "aaaa"), (2, "aab"), (3, "aaaa")]),
("aaaa", [(1, "aaa"), (1, "aab"), (2, "aaa"), (2, "aab"), (3, "aaa")]),
("aab", [(1, "baa")]),
("baa", [(1, "aaa"), (1, "aaaa"), (1, "aab"), (2, "aaa"), (2, "aaaa"), (2, "aab")])
] : (string * (int * string) list) list
Írjon Prolog-eljárást max_k_atfedok/3 néven, amely egy
névkonstans-lista elemeiből előállít egy
u-hvs párokból álló olyan listát, amelyben minden
u esetén a vele párt alkotó nem-üres hvs lista
pontosan azokból a h-v elemekből áll, amelyek esetén az u
a v-vel h-átfedésben van.
Az u-hvs párokból álló listát az
u szavak ábécé szerint növekvő sorrendjében, a
h-v elemekből álló hvs listát a
h számok, azon belül pedig a v szavak
ábécé szerint növekvő sorrendjében kell előállítani.
% :- type szo == atom % :- type szolista == list(szo). % :- type atfedeshossz == int. % :- type atfedoje ---> atfedeshossz-szo. % :- type atfedoi ---> szo-list(atfededoje). % :- type atfedok ---> list(atfedoi). % :- pred max_k_atfedok(szolista::in, atfedeshossz::in, atfedok::out) % max_k_atfedok(K,L1,L2), ahol L2 az L1 lista legfeljebb K helyen átfedő % elemeit tartalmazó, U-HVS párokból álló olyan lista, amelyben minden U % és a hozzá tartozó HVS lista minden H-V eleme esetén fennáll, hogy az % U a V-vel H-átfedésben van. Az U-HVS párok listáját U szerint, a H-V % párokból álló HVS listákat pedig előbb a H, majd a V szerint növekvő % sorrendben kell előállítani.
Az ábécé szerinti sorrend megegyezik a '@<'/2 eljárás által
meghatározott sorrenddel. Egy L1 lista rendezhető a
sort(L1,L1S) hívással. (Ez ugyan összevonja az azonos
elemeket, de ez nem baj, ha az L1-ben nincsenek azonos elemek.)
| ?- max_k_atfedok(2, [asztalos,alma,apu,utas,anyu,satu,malom], L1).
L1 = [alma-[1-anyu,1-apu,1-asztalos,2-malom],anyu-[1-utas],apu-[1-utas],
asztalos-[1-satu],satu-[1-utas],utas-[1-satu,2-asztalos]] ? ;
no
| ?- max_k_atfedok(2,[alma,omlik,mama,malom,ikra,atom,adat,ragad],L).
L = [adat-[2-atom],alma-[1-adat,1-atom,2-malom,2-mama],atom-[1-malom,
1-mama,2-omlik],ikra-[1-adat,1-alma,1-atom,2-ragad],malom-[1-mama,
2-omlik],mama-[1-adat,1-alma,1-atom,2-malom],omlik-[2-ikra],
ragad-[2-adat]] ? ;
no
| ?- max_k_atfedok(3,[aaa,aab,baa,aaaa],L).
L = [aaa-[1-aaaa,1-aab,2-aaaa,2-aab,3-aaaa],aaaa-[1-aaa,1-aab,2-aaa,2-aab,
3-aaa],aab-[1-baa],baa-[1-aaa,1-aaaa,1-aab,2-aaa,2-aaaa,2-aab]] ? ;
no
| ?- max_k_atfedok(999999,[aaa,aab,baa,aaaa],L).
L = [aaa-[1-aaaa,1-aab,2-aaaa,2-aab,3-aaaa],aaaa-[1-aaa,1-aab,2-aaa,2-aab,
3-aaa],aab-[1-baa],baa-[1-aaa,1-aaaa,1-aab,2-aaa,2-aaaa,2-aab]] ? ;
no
u szó a v szóval h-átfedésben van" feltétel
vizsgálatára csekély módosítással felhasználható az 1. kisháziként megírt
függvény, ill. eljárás.
max_k_atfedok.sml, illetve max_k_atfedok.plnéven.
A módosított beadási határidő
2007. május 4., péntek 24:00
(2007. április 27., péntek 24:00 helyett).
A vizsgaosztályzat megállapításakor a határidőre beadott, helyesen megoldott kis házi feladatokért plusz 1-1 pont jár.