2. kis házi feladat (Elixir): Kemping térképe

1.1 változat — $LastChangedDate: 2023-10-02 17:53:06 +0200 (Mon, 02 Oct 2023) $
Kiadás: 2023-09-22
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 2. kis házi feladat

A 2. kis házi feladat a to_external/3 függvény megírása. A függvénynek nem feladata a megoldás helyességének ellenőrzése. 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 által létrehozott fájl

A fájlban sorok vannak, a nemüres sorok szavakból állnak. A sorokat legalább egy újsor-jel, a szavakat legalább egy szóköz karakter választja el egymástól. A szavak (esetleg negatív) egész számok, sátrakat jelölő N, E, S vagy W betűk, fákat jelölő csillagok (*), valamint üres parcellákat jelölő kötőjelek (-) lehetnek.

A fájl első nemüres sora a sátrak oszloponkénti számát, további sorainak első szava a sátrak soronkénti számát adja meg, az összes többi szó pedig az egyes parcellák tartalmát (fa, sátor vagy üres) írja le. 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.

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

A to_external/3 függvény specifikációja

  @spec to_external(pd::puzzle_desc, ds::tent_dirs, file::String.t) :: :ok
  # A pd = {rs, cs, ts} feladványleíró és a ds sátorirány-lista alapján
  # a feladvány szöveges ábrázolását írja ki a file fájlba, ahol
  #   rs a sátrak soronkénti számának a listája,
  #   cs a sátrak oszloponkénti számának a listája,
  #   ts a fákat tartalmazó parcellák koordinátájának lexikálisan rendezett listája

Példák

Függvényhívások

  iex> puzzle0 = {[-1, 0, 0, -3, 0], [0, 0, -2, 0, 0], []}
  {[-1, 0, 0, -3, 0], [0, 0, -2, 0, 0], []}
  iex> Khf2.to_external puzzle0, [], "khf2_r0.txt"
  :ok
  iex> puzzle1 = {[1, 1, 0, 3, 0], [1, 0, 2, 0, 2], [{1, 2}, {3, 3}, {3, 5}, {5, 1}, {5, 5}]}
  {[1, 1, 0, 3, 0], [1, 0, 2, 0, 2], [{1, 2}, {3, 3}, {3, 5}, {5, 1}, {5, 5}]}
  iex> Khf2.to_external puzzle1, [:e,:s,:n,:n,:n], "khf2_r1.txt"
  :ok
  iex> puzzle2 = {[1, 1, -1, 3, 0], [1, 0, -2, 0, 2], [{1, 2}, {3, 3}, {3, 5}, {5, 1}, {5, 5}]}
  {[1, 1, -1, 3, 0], [1, 0, -2, 0, 2], [{1, 2}, {3, 3}, {3, 5}, {5, 1}, {5, 5}]}
  iex> Khf2.to_external puzzle2, [:e,:s,:n,:n,:w], "khf2_r2.txt"
  :ok
  iex> puzzle3 = {[2], [0, 1, -1, 0, -1], [{1, 1}, {1, 4}]}
  {[2], [0, 1, -1, 0, -1], [{1, 1}, {1, 4}]}
  iex> Khf2.to_external puzzle3, [:e,:e], "khf2_r3.txt"
  :ok
  iex> puzzle4 = {[0, -1, 0, 1, 1, 0], [3], [{1, 1}, {3, 1}, {6, 1}]}
  {[0, -1, 0, 1, 1, 0], [3], [{1, 1}, {3, 1}, {6, 1}]}
  iex> Khf2.to_external puzzle4, [:s,:s,:n], "khf2_r4.txt"
  :ok

A létrehozott fájlok tartalma

  khf2_r0.txt           khf2_r1.txt           khf2_r2.txt           khf2_r3.txt           khf2_r4.txt
      0  0 -2  0  0         1  0  2  0  2         1  0 -2  0  2         0  1 -1  0 -1         3
  -1  -  -  -  -  -      1  -  *  E  -  -      1  -  *  E  -  -      2  *  E  -  *  E      0  *
   0  -  -  -  -  -      1  -  -  -  -  N      1  -  -  -  -  N                           -1  S
   0  -  -  -  -  -      0  -  -  *  -  *     -1  -  -  *  -  *                            0  *
  -3  -  -  -  -  -      3  N  -  S  -  N      3  N  -  S  -  -                            1  S
   0  -  -  -  -  -      0  *  -  -  -  *      0  *  -  -  W  *                            1  N
                                                                                           0  *

Egyéb követelmények

A modul neve Khf2 legyen, a @moduldoc szakasz pedig legalább a szerző nevét, email-címét és a dátumot tartalmazza.
  defmodule Khf2 do
  @moduledoc """
  Kemping térképe
  @author "Egyetemi Hallgató <egy.hallg@dp.vik.bme.hu>"
  @date   "2023-10-30"
  ...
  """
  ...
  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: khf2_sablon.ex
  2. Szkript a tesztesetek futtatásához: khf2_teszt.exs

Tudnivalók a beadásról

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