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

1.2 változat — $LastChangedDate: 2022-10-30 14:22:38 +0100 (Sun, 30 Oct 2022) $
Kiadás: 2022-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.

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   "2022-10-01"
  ...
  """
  ...
  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