1. kis házi feladat (Elixir): 101 kiskutya

1.0 változat — $LastChangedDate: 2021-10-12 22:33:00 +0200 (Tue, 12 Oct 2021) $
Kiadás: 2021-09-13
Beadási határidő a honlapon.

A 101 kiskutya c. film 1996-os változatának egyik utolsó jelenetében a kutyák egy számítógép képernyője előtt ülnek, több sorban. A film tervezett megaszuper, interaktív változatában a néző határozhatja meg az ülésrendet.

A koncepció része, hogy k kiskutyát úgy lehessen n>2 sorba leültetni, hogy elölről hátrafelé haladva minden sorban pontosan d-vel kevesebb kiskutya üljön, mint az előző sorban.

Vizsgáljuk meg, hogy ez hogyan lehetséges! Két függvényt kell írnia Elixir-nyelven.

A sit! függvény

Írjon sit! néven olyan Elixir-függvényt, amelynek egyetlen paramétere a kiskutyák k száma, eredménye pedig egy pár, ezt jelöljük {m, ss}-sel. Itt m az összes lehetséges ültetés száma, ss pedig {n, vs} alakú párok listája. Egy ilyen ss-beli pár az n sorból álló ültetéseket sorolja föl a vs lista {h, d} alakú elemei segítségével, ahol h az adott ültetés hátsó (legrövidebb) sorának hossza, d pedig az egymást követő sorok különbsége.

Az eredményben minden megoldásnak pontosan egyszer kell előfordulnia. Az ss és vs listák elemeinek sorrendje tetszőleges.

A good_flocks függvény

Írjon good_flocks néven olyan Elixir-függvényt, amelynek kmax paramétere a kiskutyák maximális száma, ks eredménylistája pedig azoknak a kutyafalkáknak a k méretét (számosságát) tartalmazza, amelyek a fenti feltételekkel leültethetők a képernyő elé.

Az eredménylistában minden lehetséges falkaméretnek pontosan egyszer kell előfordulnia. A lista elemeinek sorrendje tetszőleges.

Elixir-specifikációk

  @type variant :: { h :: integer, d :: integer }
  @type seatings :: { n :: integer, vs :: [ variant ] }
  
  @spec sit!( k :: integer ) :: r :: { m :: integer, ss :: [ seatings ] }
  # k kiskutya m-féleképpen ülhet úgy n>2 sorban, hogy a leghátsó sorban
  # h kiskutya ül, a számuk pedig soronként pontosan d-vel növekszik

  @spec good_flocks( kmax :: integer ) :: ks :: [k :: integer]
  # A ks lista elemei azoknak a kutyafalkáknak a k számossága
  # (2 < k <= kmax), amelyek a feladatban megadott feltételekkel
  # leültethetők a képernyő elé
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 """
  101 kiskutya
  @author "Egyetemi Hallgató <egy.hallg@dp.vik.bme.hu>"
  @date   "2021-09-22"
  ...
  """
  ...
  end
Minden publikus, azaz def-fel definiált függvény elé írjon rövid leírást is (a feladatkiírásból átvett specifikáción és fejkommenten kívül), például:
  @doc """
  A good_flocks függvény az adott feltételek mellett képernyő elé
  ültethető kutyák számát számítja ki.
  """
A segédfüggvények legyenek lokálisak (defp), írjon hozzájuk típusspecifikációt és fejkommentként rövid leírást is, például:
  @spec hany_eves(x:: integer, t::String.t, z::any) :: n::integer 
  # Az árbóc x hosszából, a kikötő t nevéből és a csillagok z állásából
  # a kapitány n életkora úgy számítható ki, hogy vesszük... 
  

A beadott programokat Linux környezetben Elixir 1.7.3 (Erlang/OTP 21) rendszerrel teszteljük.

Példák

      iex> Khf1.sit! 101
      {0, []}
      iex> Khf1.sit! 15
      {5, [{3, [{1, 4}, {2, 3}, {3, 2}, {4, 1}]}, {5, [{1, 1}]}]}
      iex> Khf1.sit! 14
      {1, [{4, [{2, 1}]}]}
      iex> Khf1.sit! 10
      {1, [{4, [{1, 1}]}]}
      iex> Khf1.sit! 9
      {2, [{3, [{1, 2}, {2, 1}]}]}
      iex> Khf1.sit! 5
      {0, []}
      iex> Khf1.sit! 30
      {13, [ {3, [{1, 9}, {2, 8}, {3, 7}, {4, 6}, {5, 5}, {6, 4}, {7, 3}, {8, 2}, {9, 1}]},
             {4, [{3, 3}, {6, 1}]},
             {5, [{2, 2}, {4, 1}]}
           ]
      }
      iex> Khf1.good_flocks 20
      [6, 9, 10, 12, 14, 15, 16, 18, 20]

Segédanyagok

  1. Sablon a program megírásához: dp_khf1_sablon.ex
  2. Szkript a tesztesetek futtatásához: dp_khf1_teszt.exs
  3. Szkript a sit! függvény visszatérési értéke strukturális helyességének ellenőrzésére: dp_khf1_check_answer.exs

Tudnivalók a beadásról

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