BME Villamosmérnöki és Informatikai Kar
Mérnök-informatikus szak |
Nappali tagozat
2017/2018-es tanév, őszi félév
|
A feladat a félévi nagy házi feladatban specifikált Sudoku-feladvány és egy részlegesen kitöltött érték-mátrix összevetése a távolságinfók szempontjából. Pontosítva: egy adott Sudoku-feladvány és egy részlegesen kitöltött érték-mátrix esetén el kell dönteni, hogy az érték-mátrix teljesíti-e a feladványban szereplő távolságinfók által támasztott feltételeket.
Egy m*m méretű részlegesen kitöltött érték-mátrix egy olyan érték-mátrix (lásd a nagy házi feladat kiírását) amelynek mezői 0 és m = k2 közé eső egész számok. Egy részlegesen kitöltött érték-mátrix tehát két dologban tér el a nagy házi feladatban specifikált Sudoku-megoldástól:
Összefoglalva: egy részlegesen kitöltött érték-mátrix nem teljesíti egy adott Sudoku-feladvány távolságinfói által támasztott feltételeket, ha az érték-mátrixban van két nem-nulla értékű oldalszomszédos mező, amely mezőpárra
ahol n a Sudoku-feladványban megadott távolságkonstans.
A kisházi megoldásában a Sudoku-feladványban szereplő száminfókat figyelmen kívül kell hagynia. Emellett annak sincs jelentősége, hogy az érték-mátrix (a számismétlés szempontjából) ellentmondásmentes-e vagy sem.
khf2:n_away/2
néven egy
Sudoku-tábla távolságinfók szerinti részleges helyességének a
megállapítására.
%% @type sspec() = {dist(), board()}.
%% @type dist() = integer().
%% @type field() = [info()].
%% @type info() = s | w | integer().
%% @type board() = [[field()]].
%% @type ssol() = [[integer()]].
%% @spec khf2:n_away(SSpec::sspec(), SSol::ssol()) -> B::bool().
%% B igaz, ha az SSol részlegesen kitöltött érték-mátrix teljesíti az SSpec
%% Sudoku-feladványban szereplő távolságinfók által támasztott feltételeket.
A programot tartalmazó modul attribútumai ezek legyenek:
-module(khf2).
-author('email@unit.org.hu').
-vsn('year-mm-dd').
-export([n_away/2]).
%-compile(export_all).
n_away/2
néven egy Sudoku-tábla
távolságinfók szerinti részleges helyességének a megállapítására.
% :- type sspec ---> s(dist, board).
% :- type dist == int.
% :- type field == list(info).
% :- type info ---> s; w; int.
% :- type board == list(list(field)).
% :- type ssol == list(list(int)).
% :- pred n_away(sspec::in, ssol::in).
% n_away(SSpec, SSol): Az SSol részlegesen kitöltött érték-mátrix teljesíti az SSpec
% Sudoku-feladványban szereplő távolságinfók által támasztott feltételeket.
| ?- n_away(s(1, [[[s], [], [],[s]], [ [], [], [], []], [ [],[s], [s,w], []], [[4], [], [w], []] ] ), [[ 2, 4, 1, 3], [ 3, 1, 4, 2], [ 1, 3, 2, 4], [ 4, 2, 3, 1]] ). yes
| ?- n_away(s(1, [[[s], [], [],[s]], [ [], [], [], []], [ [],[s], [s,w], []], [[4], [], [w], []] ] ), [[ 0, 2, 0, 2], [ 2, 0, 0, 0], [ 0, 0, 2, 0], [ 2, 0, 3, 0]] ). yes
Ebben az érték-mátrixban csak egy olyan oldalszomszédos mezőpár van,
amely nem-nulla értékeket tartalmaz, mégpedig a 3. sor 3. mezője és az
alatta levő mező. Mivel ezen két mező értékének távolsága 1, és a
Sudoku-feladvány megfelelő mezője tartalmaz egy s
távolságinfót, ezért az érték-mátrix teljesíti a feladvány távolságinfói által
támasztott feltételeket.
| ?- n_away(s(1, [[[s], [], [],[s]], [ [], [], [], []], [ [],[s], [s,w], []], [[4], [], [w], []] ] ), [[ 2, 4, 1, 3], [ 3, 1, 2, 4], [ 1, 3, 4, 2], [ 4, 2, 3, 1]] ). no
Az utóbbi esetben azért kapunk nemleges választ, mert például a feladvány
1. sorának 3. oszlopában nem szerepel az s
távolságinfó,
ugyanakkor az érték-mátrix ezen mezőjében az 1 érték, míg a tőle délre levőben a
2 érték szerepel, azaz a két szomszédos mező távolsága a feladványban
szereplő 1 távolságkonstans.
khf2:n_away({1, [[[s], [], [],[s]], [ [], [], [], []], [ [],[s], [s,w], []], [[4], [], [w], []] ] }, [[ 2, 4, 1, 3], [ 3, 1, 4, 2], [ 1, 3, 2, 4], [ 4, 2, 3, 1]] ). true
khf2:n_away({1, [[[s], [], [],[s]], [ [], [], [], []], [ [],[s], [s,w], []], [[4], [], [w], []] ] }, [[ 0, 2, 0, 2], [ 2, 0, 0, 0], [ 0, 0, 2, 0], [ 2, 0, 3, 0]] ). true
Ebben az érték-mátrixban csak egy olyan oldalszomszédos mezőpár van,
amely nem-nulla értékeket tartalmaz, mégpedig a 3. sor 3. mezője és az
alatta levő mező. Mivel ezen két mező értékének távolsága 1, és a
Sudoku-feladvány megfelelő mezője tartalmaz egy s
távolságinfót, ezért az érték-mátrix teljesíti a feladvány távolságinfói által
támasztott feltételeket.
khf2:n_away({1, [[[s], [], [],[s]], [ [], [], [], []], [ [],[s], [s,w], []], [[4], [], [w], []] ] }, [[ 2, 4, 1, 3], [ 3, 1, 2, 4], [ 1, 3, 4, 2], [ 4, 2, 3, 1]] ). false
Az utóbbi esetben azért kapunk nemleges választ, mert például a feladvány
1. sorának 3. oszlopában nem szerepel az s
távolságinfó,
ugyanakkor az érték-mátrix ezen mezőjében az 1 érték, míg a tőle délre levőben a
2 érték szerepel, azaz a két szomszédos mező távolsága a feladványban
szereplő 1 távolságkonstans.
A programok készülhetnek MS Windows alatt is, de Linux alatt is működniük kell. A beadott programokat Linux környezetben a SICStus Prolog 4.3.x, ill. az Erlang/OTP R16B rendszerekkel teszteljük.
Ennek a kis házi feladatnak a beadása ugyan nem kötelező, azonban a félévközi követelmények teljesítéséhez a félév során legalább három kisházifeladat-megoldást – közülük legalább egyet Prolog és legalább egyet Erlang nyelven – sikeresen be kell adni. Sikeres az a megoldás, amelyik az összes tesztesetre helyes választ ad. Ha ezt a kis házi feladatot mindkét nyelven sikeresen beadja, az természetesen két megoldásnak számít.
A programot az Elektronikus
Tanársegéd (ETS) segítségével weben keresztül lehet beadni, a HF
beadás menüpont alatt. Ez a kettes számú kis
házi feladat, ennek megfelelően az ETS a beküldött megoldást
khf2.pl
, ill. khf2.erl
néven tárolja el és hivatkozik rá.
(A feltöltendő állomány neve tetszőleges lehet, az ETS átnevezi.)
Az osztályzat megállapításakor a határidőre beadott, minden tesztesetre helyesen működő feladatmegoldásért plusz 1-1 pont jár.