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.