A kis házi feladat a nagy házi feladathoz (a sátrak feladványhoz) kapcsolódik, ezért először ezt ismertetjük pár mondatban.
check_sol/2 függvény
megírása. A formális specifikációt lejjebb találja.
Khf1.to_internal/1 függvény
visszatérési értékével azonos felépítésű, azaz első eleme a sátrak soronkénti
számát tartalmazó lista, második eleme a sátrak oszloponkénti számát tartalmazó
lista, harmadik eleme pedig a fákat tartalmazó parcellák koordinátáit
tartalmazó lista (a koordináták lexikálisan növekvő sorrendjében). Tetszőleges értékű negatív számokat
használunk annak jelzésére, hogy egy sorban vagy oszlopban nem
ismert a sátrak száma.:n
(észak), :e (kelet), :s
(dél), :w (nyugat).{err_rows, err_cols,
err_touch} hármas. Elemei olyan kulcs-érték párok,
melyekben a kulcs a hibafajtára utal, az érték pedig a
hibahelyeket felsoroló lista. A részleteket a formális
Elixir-specifikációkban találja.A függvény két paramétere azonos
a KHf2.to_external/3 függvény első két
paraméterével. A 2. kis házi feladatban leírtakat
feltételezheti a két paraméterről. A teljesség kedvéért az ott
leírtakat itt is megismételjük.
:n, :e, :s, :w)
vannak;
@type row :: integer # sor száma (1-től n-ig)
@type col :: integer # oszlop száma (1-től m-ig)
@type field :: {row, col} # egy parcella koordinátái
@type tents_count_rows :: [integer] # a sátrak száma soronként
@type tents_count_cols :: [integer] # a sátrak száma oszloponként
@type trees :: [field] # a fákat tartalmazó parcellák koordinátái lexikálisan rendezve
@type puzzle_desc :: {tents_count_rows, tents_count_cols, trees} # a feladványleíró hármas
@type dir :: :n | :e | :s | :w # a sátorpozíciók iránya: north, east, south, west @type tent_dirs :: [dir] # a sátorpozíciók irányának listája a fákhoz képest
@type cnt_tree :: integer # a fák száma a kempingben
@type cnt_tent :: integer # az elemek száma a sátorpozíciók irányának listájában
@type err_rows :: %{err_rows: [integer]} # a sátrak száma rossz a felsorolt sorokban
@type err_cols :: %{err_cols: [integer]} # a sátrak száma rossz a felsorolt oszlopokban
@type err_touch :: %{err_touch: [field]} # a felsorolt koordinátájú sátrak másikat érintenek
@type errs_desc :: {err_rows, err_cols, err_touch} # hibaleíró hármas
check_sol/2 függvény specifikációja
@spec check_sol(pd::puzzle_desc, ds::tent_dirs) :: ed::errs_desc
# Az {rs, cs, ts} = pd feladványleíró és a ds sátorirány-lista
# alapján elvégzett ellenőrzés eredménye a ed hibaleíró, ahol
# rs a sátrak soronként elvárt számának a listája,
# cs a sátrak oszloponként elvárt számának a listája,
# ts a fákat tartalmazó parcellák koordinátájának a listája
# Az {e_rows, e_cols, e_touch} = ed hármas elemei olyan
# kulcs-érték párok, melyekben a kulcs a hiba jellegére utal, az
# érték pedig a hibahelyeket felsoroló lista (üres, ha nincs hiba)
iex> Khf3.check_sol {[-1, 0, 0, -3, 0], [0, 0, -2, 0, 0], []}, []
{%{err_rows: []}, %{err_cols: []}, %{err_touch: []}}
iex> Khf3.check_sol {[1, 0, 0, 3, 0], [0, 0, 2, 0, 0], []}, []
{%{err_rows: [1,4]}, %{err_cols: [3]}, %{err_touch: []}}
iex> Khf3.check_sol {[1, 1, 0, 3, 0], [1, 0, 2, 0, 2], [{1, 2}, {3, 3}, {3, 5}, {5, 1}, {5, 5}]}, [:e,:s,:n,:n,:n]
{%{err_rows: []}, %{err_cols: []}, %{err_touch: []}}
iex> Khf3.check_sol {[1, 1, 0, 3, 0], [1, 0, 2, 0, 2], [{1, 2}, {3, 3}, {3, 5}, {5, 1}, {5, 5}]}, [:e,:e,:n,:n,:n]
{%{err_rows: [3,4]}, %{err_cols: [3,4]}, %{err_touch: [{2, 5}, {3, 4}, {4, 5}]}}
iex> Khf3.check_sol {[1, 0, 2, 2, 0], [1, 0, 0, 2, 1], [{1, 2}, {3, 3}, {3, 5}, {5, 1}, {5, 5}]}, [:e,:e,:n,:n,:n]
{%{err_rows: [2,3]}, %{err_cols: [3,4,5]}, %{err_touch: [{2, 5}, {3, 4}, {4, 5}]}}
iex> Khf3.check_sol {[1, 1, -1, 3, 0], [1, 0, -2, 0, 2], [{1, 2}, {3, 3}, {3, 5}, {5, 1}, {5, 5}]}, [:e,:s,:n,:n,:w]
{%{err_rows: [4, 5]}, %{err_cols: [4, 5]}, %{err_touch: [{4, 3}, {5, 4}]}}
iex> Khf3.check_sol {[0, 3, 2, 0, 2, 1, 1], [1, 2, 0, 3, 0, 1, 1, 1], [{1, 4}, {1, 8}, {2, 2}, {3, 3}, {3, 6}, {5, 2}, {5, 5}, {5, 7}, {7, 3}]}, [:s, :s, :s, :e, :n, :w, :w, :s, :w]
{%{err_rows: []}, %{err_cols: []}, %{err_touch: [{2, 4}, {3, 4}]}}
Khf3 legyen, a @moduldoc
szakasz pedig legalább a szerző nevét, email-címét és a dátumot
tartalmazza.
defmodule Khf3 do @moduledoc """ Kemping helyessége @author "Egyetemi Hallgató <egy.hallg@dp.vik.bme.hu>" @date "2023-10-07" ... """ ... endA segédfüggvények legyenek lokálisak (
defp), írjon
hozzájuk típusspecifikációt és fejkommentként tömör leírást is.
A beadott programokat Linux környezetben Elixir 1.14 (Erlang/OTP 25) rendszerrel teszteljük.