1. kis házi feladat (Elixir): Feladványleíró konvertálása és ellenőrzése

Kiadás: 2024-09-10, 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.

Az 1. kis házi feladat

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

Az első függvény paramétere egy szöveges feladványleíró-lista, az eredménye pedig a feladványt leíró Elixir adatstruktúra. A második függvénynek az utóbbi a paramétere, az eredménye pedig az igaz vagy a hamis logikai érték, attól függően, a feladványleíró megfelel-e a követelményeknek.

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"]
Az első függvény eredménye, valamint a második függvény paramétere ebben az esetben ez lesz:
{6, 3, [{{1,5},2},{{2,2},1},{{4,6},1}]}
A második függvény eredménye az adott esetben true lesz, mert a feladványleíró megfelel az előírásoknak. Ezeket most össze is foglaljuk:

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 puzzle_desc() :: {size(), cycle(), [field_value()]} # feladvány

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 to_internal/1 és a correct?/1 függvények specifikációja

    @spec to_internal(ps::list_desc()) :: pd::puzzle_desc()
    # A ps szöveges feladványleíró-listának megfelelő adatstruktúra pd
    
    @spec correct?(pd::puzzle_desc()) :: b::boolean()
    # b igaz, ha a pd feladványleíró helyes, egyébként hamis

Példák

    iex> Khf1.to_internal(["6", "3", "1 5 2", "2 2 1", "4 6 1"])
    {6, 3, [{{1,5}, 2},{{2,2}, 1},{{4,6}, 1}]}
    
    iex> Khf1.correct?({6, 3, [{{1,5}, 2},{{2,2}, 1},{{4,6}, 1}]})
    true
    
    iex> Khf1.to_internal(["3", "2", "1 3 2"])
    {3, 2, [{{1,3}, 2}]}
    
    iex> Khf1.correct?({3, 2, [{{1,3}, 2}]})
    true
    
    iex> Khf1.to_internal(["3", "2"])
    {3, 2, []}
    
    iex> Khf1.correct?({3, 2, []})
    true
    
    iex> Khf1.to_internal(["2", "2", "1 3 2"])
    {2, 2, [{{1,3}, 2}]}
    
    iex> Khf1.correct?({2, 2, [{{1,3}, 2}]})
    false
    
    iex> Khf1.to_internal(["3", "2", "1 3 3"])
    {3, 2, [{{1,3}, 3}]}
    
    iex> Khf1.correct?({3, 2, [{{1,3}, 3}]})
    false

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 """
    Számtekercs-leíró konvertálása és ellenőrzése
    @author "Egyetemi Hallgató <egy.hallg@dp.vik.bme.hu>"
    @date   "2024-09-23"
    ...
    """
    ...
    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: khf1_sablon.ex
  2. Szkript a tesztesetek futtatásához: khf1_teszt.exs
  3. Beadási tesztesetek: khf1_beadasi_tesztesetek.txt

Tudnivalók a beadásról

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