2. kis házi feladat (Elixir): Számtekercs kiterítése

Kiadás: 2024-09-17, beadási határidő a honlapon.
Verzió: $LastChangedDate: 2024-09-27 17:14:23 +0200 (Fri, 27 Sep 2024) $

A számtekercs feladvány

A kis házi feladat a nagy házi feladathoz kapcsolódik, ezért először ezt ismertetjük.

A 2. kis házi feladat

A 2. kis házi feladat egy Elixir-függvény megírása. A formális specifikációt lejjebb találja.

A függvény paramétere egy szöveges feladványleíró-lista, az eredménye pedig a kiterített számtekercs, azaz egy olyan lista, amely a bal felső mezőtől kezdve a tekeredő vonal sorrendjében tartalmazza a koordináta–érték párokat.

A szöveges feladványleíró-lista egy sztringekből álló, legalább kételemű lista, melynek első eleme a tábla méretét (n), második eleme a ciklus hosszát (m), esetleges további elemei pedig a kitöltött mezők koordinátáját (row, col) és értékét (val) adják meg. Feltételezheti, hogy a sztringekben csak egész számok vannak, n és m mindig meg van adva, továbbá ha vannak kitöltött mezők, akkor a row, col, val hármasok elemei mindig meg vannak adva. A sztringekben az egész számok között legalább egy szóköz van, előttük vagy utánuk 0 vagy több szóköz lehet. Például az 1. ábrán látható feladványt így írjuk le:

   ["6", "3", "1 5 2", "2 2 1", "4 6 1"]
A függvény eredménye ebben az esetben ez lesz:
  [{{1, 1}, nil}, {{1, 2}, nil}, {{1, 3}, nil}, {{1, 4}, nil}, {{1, 5},   2}, {{1, 6}, nil},
   {{2, 6}, nil}, {{3, 6}, nil}, {{4, 6},   1}, {{5, 6}, nil}, {{6, 6}, nil},
   {{6, 5}, nil}, {{6, 4}, nil}, {{6, 3}, nil}, {{6, 2}, nil}, {{6, 1}, nil},
   {{5, 1}, nil}, {{4, 1}, nil}, {{3, 1}, nil}, {{2, 1}, nil},
   {{2, 2},   1}, {{2, 3}, nil}, {{2, 4}, nil}, {{2, 5}, nil},
   {{3, 5}, nil}, {{4, 5}, nil}, {{5, 5}, nil},
   {{5, 4}, nil}, {{5, 3}, nil}, {{5, 2}, nil},
   {{4, 2}, nil}, {{3, 2}, nil},
   {{3, 3}, nil}, {{3, 4}, nil},
   {{4, 4}, nil}, {{4, 3}, nil}]

Elixir-specifikációk

Típusok a feladvány alapadatainak megadására

    @type size()  :: integer() # tábla mérete (0 < n)
    @type cycle() :: integer() # ciklus hossza (0 < m <= n)
    @type value() :: integer() # mező értéke (0 < v <= m)

Típusok egy mező 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 n-ig)
    @type field() :: {row(), col()}  # mező koordinátái

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

    @type field_value()     :: {field(), value()}       # mező és értéke
    @type field_opt_value() :: {field(), value() | nil} # mező és opcionális értéke

A szöveges feladványleíró-lista típusa

    @type list_desc() :: [String.t()] # 1. elem: méret, 2. elem: ciklushossz, többi elem esetleg: mezők és értékük 

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

    @spec helix(ps::list_desc()) :: gs::[field_opt_value()]
    # A ps szöveges feladványleíró-lista szerinti számtekercs kiterített listája gs

Példák

    iex> Khf2.helix([" 2", "1 ", " 2   2 1 "])
    [{{1, 1}, nil}, {{1, 2}, nil}, {{2, 2}, 1}, {{2, 1}, nil}]
    
    iex> Khf2.helix(["  3  ", "  2  "])
    [{{1, 1}, nil}, {{1, 2}, nil}, {{1, 3}, nil}, {{2, 3}, nil}, {{3, 3}, nil}, {{3, 2}, nil}, {{3, 1}, nil}, {{2, 1}, nil}, {{2, 2}, nil}]
    
    iex> Khf2.helix(["3 ", " 2", "1 1 1", "1 3 2", "2 2 1", "3 1 2", "  3  3  1  "])
    [{{1, 1}, 1}, {{1, 2}, nil}, {{1, 3}, 2}, {{2, 3}, nil}, {{3, 3}, 1}, {{3, 2}, nil}, {{3, 1}, 2}, {{2, 1}, nil}, {{2, 2}, 1}]
    
    iex> Khf2.helix(["3", "2", "3 3 1", "1 3 2", "3 1 2", "2 2 1"])
    [{{1, 1}, nil}, {{1, 2}, nil}, {{1, 3}, 2}, {{2, 3}, nil}, {{3, 3}, 1}, {{3, 2}, nil}, {{3, 1}, 2}, {{2, 1}, nil}, {{2, 2}, 1}]
    
    iex> Khf2.helix(["   4", "   2", "  1 3 1", "  2 3 2"])
    [{{1, 1}, nil}, {{1, 2}, nil}, {{1, 3},   1}, {{1, 4}, nil},
     {{2, 4}, nil}, {{3, 4}, nil}, {{4, 4}, nil},
     {{4, 3}, nil}, {{4, 2}, nil}, {{4, 1}, nil},
     {{3, 1}, nil}, {{2, 1}, nil},
     {{2, 2}, nil}, {{2, 3},   2},
     {{3, 3}, nil}, {{3, 2}, nil}]
    

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 """
    Számtekercs-leíró konvertálása és ellenőrzése
    @author "Egyetemi Hallgató <egy.hallg@dp.vik.bme.hu>"
    @date   "2024-09-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.17 (Erlang/OTP 27) 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
  3. Beadási tesztesetek: khf2_beadasi_tesztesetek.txt

Tudnivalók a beadásról

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