A kis házi feladat a nagy házi feladathoz kapcsolódik, ezért először ezt ismertetjük.
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}]
@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)
@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
@type field_value() :: {field(), value()} # mező és értéke @type field_opt_value() :: {field(), value() | nil} # mező és opcionális értéke
@type list_desc() :: [String.t()] # 1. elem: méret, 2. elem: ciklushossz, többi elem esetleg: mezők és értékük
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
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}]
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" ... """ ... endA 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.
DP Admin: dvacakrobotjaitoknakp@iit.bme.hu | Vissza az elejére / Back to the top |