BME Villamosmérnöki és Informatikai Kar
Mérnök-informatikus szak
Nappali tagozat
2008/2009-es tanév, őszi félév

Deklaratív programozás

1. kis házi feladat: Sudoku-mátrix előállítása

1.2. változat
Utolsó módosítás: 2008-10-25
Kiadás: 2008-09-22
Beadási határidő: 2008-10-13

A feladat

A feladat az előző félévi nagy házi feladatban specifikált Sudoku-táblából egy cellaméretű négyzetes részmátrix előállítása.

A Sudoku-táblát a nagy házi feladatban is specifikált Prolog-struktúra:

% :- type sspec ---> s(size, board).
% :- type size  == int.
% :- type field == int.
% :- type board == list list field.
illetve Erlang-pár:
%% @type sspec() = {size(), board()}.
%% @type size()  = integer().
%% @type field() = integer().
%% @type board() = [[field()]].
írja le.

Emlékeztetőül: a Sudoku-táblát leíró adatstruktúra első - size típusú - mezője a négyzetes cella mérete, második - board típusú - mezője pedig a tábla sorainak listája.

A szóbanforgó részmátrix bal felső mezőjét a Sudoku-tábla egy mezőjének a koordinátáival (a tábla egy oszlopának és egy sorának a megadásával) adjuk meg. A Sudoku-tábla bal felső mezőjének koordinátája: (1,1). Az eredményt egy olyan lista formájában várjuk, amely a keresett részmátrix mezőinek értékét oszlopfolytonosan tartalmazza.

Prolog-specifikációk

Írjon Prolog-eljárást matrix/4 néven, amely egy Sudoku-táblából egy cellaméretű részmátrixot vág ki, és a fent specifikált módon adja vissza. Ha a megadott paraméterekkel a mátrix nem állítható elő, az eljárás hiúsuljon meg.
% :- type col  == int.
% :- type row  == int.
% :- pred matrix(sspec::in, col::in, row::in, list(field)::out).
% matrix(T,X,Y,C): C a T Sudoku-tábla (X,Y) koordinátájú mezőjével
%   meghatározott cellaméretű mátrix, oszlopfolytonos ábrázolással;
%  ahol
%   T az sspec specifikációnak megfelelő Sudoku-tábla,
%   X a col, Y a row típusnak megfelelő koordináta,
%   C a list(field) típusnak megfelelő mezőlista.

Erlang-specifikációk

Írjon Erlang-függvényt matrix/3 néven, amely egy Sudoku-táblából egy cellaméretű részmátrixot vág ki, és a fent specifikált módon adja eredményül. Ha a megadott paraméterekkel a mátrix nem állítható elő, az eredmény az üres lista legyen.
%% @type col() = integer().
%% @type row() = integer().
%% @spec khf1:matrix(T::sspec(), X::col(), Y::row()) -> C::[field()].
%%   C a T Sudoku-tábla (X,Y) koordinátájú mezőjével meghatározott
%%   cellaméretű mátrix, oszlopfolytonos ábrázolással.
A programot tartalmazó modul két attribútuma ez legyen:
-module(khf1).
-export([matrix/3]).

Példák

| ?- matrix(s(3, [[0,2,3,4,1,0,5,8,0],
                  [0,7,8,0,0,0,0,2,1],
                  [0,0,5,7,2,0,0,3,9],
                  [0,8,2,9,6,1,0,4,0],
                  [0,9,0,5,0,4,0,1,0],
                  [0,6,0,2,7,3,9,5,0]]), 5, 2, C).
C = [0,2,6,0,0,1,0,0,0] ? ;
no
| ?- matrix(s(3, [[6,2,3,4,1,9,5,8,7],
                  [9,7,8,3,5,6,4,2,1],
                  [1,4,5,7,2,8,6,3,9],
                  [5,8,2,9,6,1,7,4,3],
                  [3,9,7,5,8,4,2,1,6],
                  [4,6,1,2,7,3,9,5,8]]), 5, 2, C).
C = [5,2,6,6,8,1,4,6,7] ? ;
no
| ?- matrix(s(3, [[6,2,3,4,1,9,5,8,7],
                  [9,7,8,3,5,6,4,2,1],
                  [1,4,5,7,2,8,6,3,9],
                  [5,8,2,9,6,1,7,4,3],
                  [3,9,7,5,8,4,2,1,6],
                  [4,6,1,2,7,3,9,5,8]]), 8, 2, C).
no
1> khf1:matrix({3, [[0,2,3,4,1,0,5,8,0],
                     [0,7,8,0,0,0,0,2,1],
                     [0,0,5,7,2,0,0,3,9],
                     [0,8,2,9,6,1,0,4,0],
                     [0,9,0,5,0,4,0,1,0],
                     [0,6,0,2,7,3,9,5,0]]}, 5, 2).
[0,2,6,0,0,1,0,0,0]
2> khf1:matrix({3, [[6,2,3,4,1,9,5,8,7],
                    [9,7,8,3,5,6,4,2,1],
                    [1,4,5,7,2,8,6,3,9],
                    [5,8,2,9,6,1,7,4,3],
                    [3,9,7,5,8,4,2,1,6],
                    [4,6,1,2,7,3,9,5,8]]}, 5, 2).
[5,2,6,6,8,1,4,6,7]
3> khf1:matrix({3, [[6,2,3,4,1,9,5,8,7],
                    [9,7,8,3,5,6,4,2,1],
                    [1,4,5,7,2,8,6,3,9],
                    [5,8,2,9,6,1,7,4,3],
                    [3,9,7,5,8,4,2,1,6],
                    [4,6,1,2,7,3,9,5,8]]}, 8, 2).
[]

Tudnivalók a beadásról

A programot az Elektronikus Tanársegéddel kell beadni (l. HF beadás menüpont). A beadási határidő 2008. október 13., hétfő 24:00.

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.

Gyakorló feladatok

Otthoni gyakorlásra a következő kisebb feladatok megoldását javasoljuk.
  1. Lista szeletének (i-edik és j-edik sorszámú elemek közötti részének) előállítása.
  2. Sorfolytonosan, illetve oszlopfolytonosan tárolt mátrix i-edik sorának előallítása.
  3. Sorfolytonosan, illetve oszlopfolytonosan tárolt mátrix j-edik oszlopának előállítása.
  4. Sorok listájaként tárolt mátrix sorfolytonosan, illetve oszlopfolytonosan tárolt változatának előállítása.
  5. Sorfolytonosan, illetve oszlopfolytonosan tárolt mátrix sorok listájaként tárolt változatának előállítása.

dp@inf.bme.hu