Kiadás: 2026-10-01, beadási határidő a honlapon.
Verzió: $LastChangedDate: 2026-10-05 14:25:38 +0200 (Mon, 05 Oct 2026) $
A feladat egy térbeli kirakós játékot vizsgál.
A játék célja, hogy egy henger alakú kukoricacsutkára összetapadt kukoricaszemekből álló elemeket helyezzük el úgy, hogy a csutka minden részét pontosan egyszer fedjük be.
A kirakós elemei és az összerakott játék. Képek forrása:
thill.me.
A játékot egy olyan n×m méretű, azaz n sorból és m oszlopból álló négyzetráccsal modellezhetjük, ahol az oszlopindexet modulom értelmezzük. Így például egy 4×5 méretű csutkán a {2, 0} és {2, 5} párok ugyanazt a mezőt jelölik.
Az összetapadt kukoricaszemekből álló elemekre a következő jelölést vezetjük be: ha az elem belefér egy k×l méretű négyzetrácsba, akkor egy k elemű, egyenként l karakteres sztringből álló listával ábrázoljuk. A sztringek kizárólag a ?\s (szóköz), ?O, ?X karakterekből állnak.
Ezeknek a jelentése az alábbi:
A ?\s karakterek az üres helyeket jelölik, ahol nincs kukoricaszem.
A ?O karakterek a kukoricaszemeket jelölik. Feltételezheti, hogy a kukoricaszemek összefüggő elemet alkotnak.
Az elemben egyetlen kukoricaszem ?O karakter helyett ?X karakterrel van megjelölve. Ez a referencia-kukoricaszem. Amikor azt mondjuk, hogy az elemet a csutkán a {i, j} mezőre helyeztük, akkor a referencia-kukoricaszem a csutka i. sorában és j. oszlopában foglal helyet.
Mivel a csutka hengeres, az elemek is egy hengerpalástra illeszkednek. Ezért az elemeket csak 0 vagy 180 fokkal forgathatjuk el. Ha az elem a csutkán a sztringek listájával leírt elrendezésben található meg, azt mondjuk, hogy 0 fokkal van elforgatva. A másik lehetséges elforgatás a referencia-kukoricaszem körül történő 180 fokos elforgatás (azaz középpontos tükrözés).
Egy L alakú elem kódolása és elhelyezése; az X referencia-kukoricaszem a {i, j} koordinátájú mezőn van
Elixir-kód
Elhelyezés, 0°
Elhelyezés, 180°
elem = [
"X ",
"O ",
"OO"
]
j−2
j−1
j
j+1
j+2
i−2
i−1
i
X
i+1
O
i+2
O
O
j−2
j−1
j
j+1
j+2
i−2
O
O
i−1
O
i
X
i+1
i+2
A feladat célja egy olyan utkozesek függvény elkészítése, amely egy csutka adott mezőire, adott elforgatással elhelyezendő elemekről megállapítja, hogy mely elemek ütköznek egymással. A függvény paraméterei a következők:
A csutka sorainak n száma, ahol 0 < n.
A csutka oszlopainak m száma, ahol 0 < m.
A csutkára helyezendő elemek lehelyez listája. Minden elhelyezést egy {sorok, i, j, f} négyes ír le, amelynek jelentése a következő:
A sorok lista egyforma hosszú sztringekből áll, és az elem elforgatás nélküli (0 fokos) alakját írja le.
Az i az elem referencia-kukoricaszemének sorindexe a csutkán (0 ≤ i < n).
A j az elem referencia-kukoricaszemének oszlopindexe a csutkán (0 ≤ j < m).
Az f logikai érték az elem elforgatását jelzi: false esetén az elemet nem forgatjuk el (0 fok), true esetén pedig 180 fokkal forgatjuk el.
Feltételezheti, hogy mindegyik elem úgy van elhelyezve, hogy minden kukoricaszeme a csutkán helyezkedik el, azaz nem lóg le róla.
A függvény visszatérési értéke egy {a, b} párokból álló lista, amelynek minden párjára 0 ≤ a < b < length(lehelyez) teljesül. A lista pontosan azokat az a. és b. (nullától kezdődő) indexű elemek párjait tartalmazza, amelyek a csutkára helyezve ütköznének egymással, azaz a csutka valamelyik mezőjét mindkét elem lefedné kukoricaszemmel. A lista elemeit növekvő lexikografikus sorrendben adja meg.
Elixir-specifikációk
@type meret() :: pos_integer() # a csutka sorainak vagy oszlopainak száma
@type sorindex() :: non_neg_integer() # a csutka egy sorának indexe
@type oszlopindex() :: non_neg_integer() # a csutka egy oszlopának indexe
@type forgatas() :: boolean() # false: nincs forgatás; true: 180 fokos forgatás
@type elem() :: [String.t()] # egy elem szöveges leírása
@type lehelyezes() :: { elem :: elem(), i :: sorindex(), j :: oszlopindex(), f :: forgatas() } # egy elem lehelyezése
@type elemindex() :: non_neg_integer() # hivatkozás egy lehelyezett elemre
@type utkozes() :: { a :: elemindex(), b :: elemindex() } # lehelyezett elemek ütközése, a < b
@spec utkozesek(n :: meret(), m :: meret(), lehelyez :: [lehelyezes()]) :: ut :: [utkozes()]
# Az n sorból és m oszlopból álló csutkára az elemeket a lehelyez lista szerint helyezve pontosan
# az ut elempárok ütköznek egymással, lexikografikusan növekvő sorrendben felsorolva.
Egyéb követelmények
A modul neve Khf2 legyen, a @moduledoc
szakasz pedig legalább a szerző nevét, e-mail-címét és a dátumot
tartalmazza.
defmodule Khf2 do
@moduledoc """
Ütköző kukoricaelemek megkeresése
@author "Egyetemi Hallgató <egy.hallg@edu.bme.hu>"
@date "2026-10-xx"
"""
...
end
Ha segédfüggvényeket használ, legyenek lokálisak (defp), és írjon
hozzájuk típusspecifikációt és fejkommentet.
A beadott programokat Linux környezetben Elixir 1.20
(Erlang/OTP 29) rendszerrel teszteljük.
Példák
Az ábrák mezőiben az őket lefedő elemek indexe látható. Ha egy mezőn több elem is található, az összes indexet feltüntetjük. A félkövér index azt jelzi, hogy az adott elemnek ezen a mezőn van a referencia-kukoricaszeme. Az elemeket a 0., 1. és 2. indexhez rendre sárga, kék és zöld háttér jelöli.