3. kis házi feladat (Elixir): Ciklikus számlisták

Kiadás: 2024-09-25, beadási határidő a honlapon.
Verzió: $LastChangedDate: 2024-09-30 09:19:34 +0200 (Mon, 30 Sep 2024) $

A ciklikus számlisták feladvány

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

A 3. kis házi feladat

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

Ez a kis házi feladat, bár a specifikációja részben eltér a nagy házi feladatétól, segíti a felkészülést az utóbbi megoldására, esetleg közvetlenül alkalmazható is a megoldásban.

A függvénynek két paramétere van. Az első egy hármas, ennek első tagja n, a számsorozatok száma az előállítandó listákban. Második tagja m, az ismétlődő számsorozat hossza, harmadik tagja pedig len, az előállítandó listák hossza. A második paraméter olyan {ix,val} párok (esetleg üres) listája, amelyek azt írják elő, hogy a listák ix indexű helyén val értékű elemnek kell lennie. A paraméterekre vonatkozó korlátok: 1 < n, 1 ≤ m, n*m ≤ len, 1 ≤ ix ≤ len, 0 ≤ val ≤ m. Figyelem: az Elixir a listát 0-tól, a feladvány 1-től indexeli.

A függvény eredménye az összes olyan len hosszú lista listája, melyekben

Feltételezheti, hogy a bemenő paraméterek szintaktikailag, szemantikailag helyesek.

Például ha {n, m, len} = {7, 5, 36} és a korlát-lista [{33,3}], akkor a függvényhívás eredménye ez lesz:

  [ [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 0, 4, 5],
    [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 0, 5],
    [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 0]
  ]

Elixir-specifikációk

Típusok

  @type count() :: integer() # számsorozatok száma, n (1 < n)
  @type cycle() :: integer() # számsorozat hossza, m (1 <= m)
  @type size()  :: integer() # listahossz, len (1 < len)
  @type value() :: integer() # listaelem értéke, val (0 <= val <= m)
  @type index() :: integer() # listaelem sorszáma, ix (1 <= ix <= len)
  @type index_value() :: {index(), value()} # listaelem indexe és értéke
   

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

  @spec cyclists({n::count(), m::cycle(), len::size()}, constraints::[index_value()]) :: results::[[value()]]
  # results az összes olyan len hosszú lista listája, melyekben
  # * az 1-től m-ig tartó számsorozat – ebben a sorrendben, esetleg közbeszúrt 0-kal – n-szer ismétlődik,
  # * len-n*m számú helyen 0-k vannak,
  # * a constraints korlát-listában felsorolt indexű cellákban a megadott értékű elemek vannak.
  def cyclists({n, m, len}, constraints) do
  ...
  end

Példák

  iex> Khf3.cyclists({7, 5, 37}, [{3,0},{6,4},{9,2}])
  [
    [0, 1, 0, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4,
     5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5],
    [1, 0, 0, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4,
     5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5],
    [1, 2, 0, 0, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4,
     5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5],
    [1, 2, 0, 3, 0, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4,
     5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
  ]
  iex> Khf3.cyclists({10, 7, 72}, [{1,0},{2,0}])
  [
    [0, 0, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3,
     4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 1,
     2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7]
  ]
  iex> Khf3.cyclists({9, 5, 49}, [{44,4}])
  [
    [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1,
     2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 0, 0, 0, 0, 5],
    [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1,
     2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 0, 0, 0, 5, 0],
    [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1,
     2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 0, 0, 5, 0, 0],
    [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1,
     2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 0, 5, 0, 0, 0],
    [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1,
     2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 0, 0, 0, 0]
  ]

Egyéb követelmények

A modul neve Khf3 legyen, a @moduldoc szakasz pedig legalább a szerző nevét, email-címét és a dátumot tartalmazza.
    defmodule Khf3 do
    @moduledoc """
    Ciklikus számlisták
    @author "Egyetemi Hallgató <egy.hallg@dp.vik.bme.hu>"
    @date   "2024-10-07"
    ...
    """
    ...
    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: khf3_sablon.ex
  2. Szkript a tesztesetek futtatásához: khf3_teszt.exs

Tudnivalók a beadásról

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