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.
sit!
függvény 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.
good_flocks
függvény 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.
@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" ... """ ... endMinden 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.
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]
sit!
függvény visszatérési értéke strukturális helyességének
ellenőrzésére: dp_khf1_check_answer.exs
DP Admin: dvacakrobotjaitoknakp@iit.bme.hu | Vissza az elejére / Back to the top |