3. kis házi feladat (Elixir): Kemping helyessége

1.2 változat — $LastChangedDate: 2023-10-04 10:17:22 +0200 (Wed, 04 Oct 2023) $
Kiadás: 2023-09-29
Beadási határidő a honlapon.

A sátrak feladvány

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.

A 3. kis házi feladat

A 3. kis házi feladat a check_sol/2 függvény megírása. A formális specifikációt lejjebb találja.

A függvény paraméterei és visszatérési értéke

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.

Feltételezheti, hogy a feladványt leíró hármas és a sátrak iránylistája hibátlan, azaz

Elixir-specifikációk

Típusok egy parcella koordinátáinak megadására

  @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

Típusok a feladvány leírására

  @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

Típusok a sátrak helyzetének leírására

  @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

Típusok a lehetséges hibák jelzésére

  @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

A 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)

Példák

  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}]}}

Egyéb követelmények

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 """
  Kemping helyessége
  @author "Egyetemi Hallgató <egy.hallg@dp.vik.bme.hu>"
  @date   "2023-10-07"
  ...
  """
  ...
  end
A 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.

Segédanyagok

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

Tudnivalók a beadásról

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