1. kis házi feladat (Elixir): Kemping

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

Az 1. kis házi feladat

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

A megírandó függvény egy sátrak feladványt tartalmazó fájl elérési útját kapja meg paraméterként, és ebből állítja elő a feladványt leíró Elixir adatstruktúrát.

A fájlban sorok vannak, a sorok szavakból állnak. A sorokat újsor-jelek választják el egymástól. Megengedett, hogy a fájlban üres sorok, azaz csak szóköz-jellegű (whitespace) karaktereket tartalmazó — esetleg üres — jelsorozatok legyenek, ezeket figyelmen kívül kell hagyni.

Egy nemüres sorban a szavakat egy vagy több szóköz-jellegű karakter választja el egymástól, továbbá a sorok elején és végén is lehetnek szóköz-jellegű karakterek. A szavak egész számok, fákat jelölő csillagok (*) és üres parcellákat jelölő kötőjelek (-) lehetnek. Az egész számok egy opcionális negatív előjellel (-) kezdődnek, amit egy nemüres (decimális) számjegysorozat követ. (Negatív számokat fogunk használni annak jelzésére, hogy egy sorban vagy oszlopban nem ismert a sátrak száma.)

A fájl első nemüres sora a sátrak oszloponként elvárt számát tartalmazza. A fájl többi sorának első szava a sátrak soronként elvárt számát adja meg, a többi szó pedig az egyes parcellák tartalmát (fa vagy üres parcella).

A fájl sorainak száma így eggyel több, mint a kempinget leíró mátrix sorainak száma, míg a fájl első nemüres sorában levő szavak száma eggyel több, mint a mátrix oszlopszáma.

A mátrix helyességét nem kell ellenőriznie, azaz feltételezheti, hogy a mátrix minden sorában — az első kivételével, ahol eggyel kevesebb szó van — azonos a szavak száma, a sátrak oszloponkénti, ill. soronkénti számát megadó szavak (esetleg negatív) egész számok, a mátrix többi szava vagy *, vagy -, és a szavakat egy vagy több szóköz-jellegű karakter választja el.

A függvény visszatérési értéke egy hármas: a sátrak soronkénti számát tartalmazó lista, a sátrak oszloponkénti számát tartalmazó lista, valamint a fákat tartalmazó parcellák koordinátáit tartalmazó lista (a koordináták lexikálisan növekvő sorrendjében).

A fájl beolvasására a File.read!/1 függvény, a beolvasott adatok feldolgozására a String modul függvényeinek használatát javasoljuk.

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

A to_internal/1 függvény specifikációja

  @spec to_internal(file::String.t) :: pd::puzzle_desc
  # A file fájlban szövegesen ábrázolt feladvány leírója pd

Példák

Khf1.to_internal/1

  khf1_f1.txt
      1  0  2  0  2
   1  -  *  -  -  -
   1  -  -  -  -  -
   0  -  -  *  -  *
   3  -  -  -  -  -
   0  *  -  -  -  *
  iex> Khf1.to_internal "khf1_f1.txt"
  {[1, 1, 0, 3, 0], [1, 0, 2, 0, 2], [{1, 2}, {3, 3}, {3, 5}, {5, 1}, {5, 5}]}
  khf1_f2.txt
      1  0 -2  0  2
   1  -  *  -  -  -
   1  -  -  -  -  -
  -1  -  -  *  -  *
   3  -  -  -  -  -
   0  *  -  -  -  *
  iex> Khf1.to_internal "khf1_f2.txt"
  {[1, 1, -1, 3, 0], [1, 0, -2, 0, 2], [{1, 2}, {3, 3}, {3, 5}, {5, 1}, {5, 5}]}

Egyéb követelmények

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

Tudnivalók a beadásról

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