3. kis házi feladat (Elixir): Sátrak mátrixa

1.0 változat — $LastChangedDate: 2021-10-12 22:33:00 +0200 (Tue, 12 Oct 2021) $
Kiadás: 2021-09-28
Beadási határidő a honlapon.

A feladat

A feladat kapcsolódik a nagy házi feladatokhoz (Elixir, Prolog). A megoldandó feladatot itt most önállóan, a nagy házi feladattól függetlenül ismertetjük.

A satrak_mx függvény

Írjon satrak_mx néven olyan Elixir-függvényt, amelynek három paramétere van (nm, fs és ss), a visszatérési értéke pedig a sátrak helyét leíró mss mátrix vagy a nil atom.

  1. Az nm paraméter egy {n, m} pár, amely a kert mint mátrix legutolsó elemének (azaz az utolsó sor utolsó elemének) a koordinátáit adja meg. Ez úgy is értelmezhető, hogy n a mátrix sorainak, m pedig az oszlopainak a száma.
  2. Az fs paraméter a kertben álló f darab fa helyét írja le {i, j} alakú számpárokból álló, f  hosszúságú listaként, ahol i, ill. j az adott fa sorának, ill. oszlopának sorszáma, amelyekre
  3. 1 ≤ i ≤ n és 1 ≤ j ≤ m. (*)
  4. Az ss paraméter minden fához megadja a hozzá tartozó sátor relatív helyét egy olyan s  hosszúságú listaként, amelynek elemei a :W, :N, :E vagy :S atomok (az égtájak angol nevének kezdőbetűire utalva: West – nyugat, North – észak, East – kelet, South – dél). Az ss lista k-adik eleme adja meg, hogy az fs lista k-adik eleme által megadott fához képest melyik oldalszomszédos parcellán van a fához tartozó sátor. A fák helyét és a sátrak irányát megadó listák különböző hosszúságúak lehetnek: ha f < s, akkor a sátrak irányát megadó lista első f eleme utáni elemeit el kell dobni; ha f > s, akkor az azt jelenti, hogy az első s fa után következő fákhoz nem tartozik sátor.
  5. Az mss visszatérési érték a sátrak helyét leíró, n sorból és m oszlopból álló mátrix, amelyben a sátrak helyén az 1 egész szám áll, a többi helyen pedig a 0.

A függvény visszatérési értéke a nil atom legyen a következő esetekben:

  1. ha az fs listának van a mátrixon kívülre mutató {i, j} eleme, azaz nem teljesül rá a fenti (*) feltétel (lásd az alábbi példák közt a (sikertelen 1) tesztesetet);
  2. ha egy sátor {i, j} pozíciója a mátrixon kívül van, azaz nem teljesül rá a fenti (*) feltétel (lásd az alábbi példák közt a (sikertelen 2) tesztesetet);
  3. ha van két olyan sátor, amelyik a mátrix azonos pozíciójára kerülne (lásd az alábbi példák közt a (sikertelen 3) tesztesetet).

Minden egyéb esetben a fentiekben leírt módon állítsa elő az eredménymátrixot.

Elixir-specifikációk

  @type parc_koord :: {i::integer, j::integer} # Egy parcella helyét megadó {i,j} pár ({sor,oszlop})
  @type f_helyek   :: [parc_koord]             # A fák helyét leíró lista
  @type irany      :: :N | :E | :S | :W        # Északra, délre, keletre, nyugatra
  @type s_iranyok  :: [irany]                  # A fákhoz tartozó sátrak irányát leíró lista
  @type s_matrix   :: [[ 0 | 1 ]] | nil        # Sátrak mátrixa: 1 = van, 0 = nincs

  @spec satrak_mx(nm::parc_koord, fs::f_helyek, ss::s_iranyok) :: mss::s_matrix
  
A modul neve 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 """
  Sátrak mátrixa
  @author "Egyetemi Hallgató <egy.hallg@dp.vik.bme.hu>"
  @date   "2021-10-09"
  ...
  """
  ...
  end
Minden publikus, azaz def-fel definiált függvény elé írjon rövid leírást is (a feladatkiírásból átvett specifikáción és fejkommenten kívül), például:
  @doc """
  A satrak_mx függvény a sátrak helyét leíró, 0|1 értékű mátrixot állít elő.
  """
A segédfüggvények legyenek lokálisak (defp), írjon hozzájuk típusspecifikációt és fejkommentként rövid leírást is, például:
  @spec hany_eves(x:: integer, t::String.t, z::any) :: n::integer 
  # Az árbóc x hosszából, a kikötő t nevéből és a csillagok z állásából
  # a kapitány n életkora úgy számítható ki, hogy vesszük... 
  

A beadott programokat Linux környezetben Elixir 1.7.3 (Erlang/OTP 21) rendszerrel teszteljük.

Példák

iex> Khf3.satrak_mx({2,3}, [{2,2}], [:N])
[[0,1,0],[0,0,0]]

iex> Khf3.satrak_mx({2,3}, [{2,2}], [:E])
[[0,0,0],[0,0,1]]

iex> Khf3.satrak_mx({2,3}, [{3,2}], [:N])
nil # (sikertelen 1)

iex> Khf3.satrak_mx({2,3}, [{2,2}], [:S])
nil # (sikertelen 2)

iex> Khf3.satrak_mx({2,3}, [{1,1},{2,2}], [:E,:N])
nil  # (sikertelen 3)

iex> Khf3.satrak_mx({4,5}, [{2,4},{1,5},{3,2}], [:S,:W,:W])
[[0, 0, 0, 1, 0],
 [0, 0, 0, 0, 0],
 [1, 0, 0, 1, 0],
 [0, 0, 0, 0, 0]]

iex> Khf3.satrak_mx({6,6}, [{1,3},{1,5},{3,1},{4,6},{5,1},{5,4},{6,5}], [:S,:E,:N,:W,:E,:S,:E])
[[0, 0, 0, 0, 0, 1],
 [1, 0, 1, 0, 0, 0],
 [0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 1, 0],
 [0, 1, 0, 0, 0, 0],
 [0, 0, 0, 1, 0, 1]]

Segédanyagok

  1. Sablon a program megírásához: dp_khf3_sablon.ex
  2. Szkript a tesztesetek futtatásához: dp_khf3_teszt.exs

Tudnivalók a beadásról

DP Admin: dvacakrobotjaitoknakp@iit.bme.hu Vissza az elejére / Back to the top