2. kis házi feladat: Kirakós

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.

Kirakós játék elemei Összerakott kukorica kirakós játék
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 modulo m é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:

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   OO 
j−2 j−1 j j+1 j+2
i−2  OO  
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:

  1. A csutka sorainak n száma, ahol 0 < n.
  2. A csutka oszlopainak m száma, ahol 0 < m.
  3. 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ő: 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.

Elixir-hívás és eredmény Elhelyezés
iex> Khf2.utkozesek(3, 5, [
...>   {["OXO"], 0, 1, false},
...>   {["XO", "O "], 1, 3, false}
...> ])
[]
A 3 × 5 méretű csutka
01234
0 000  
1    11
2    1 
iex> Khf2.utkozesek(3, 5, [
...>   {["OXO"], 1, 4, false},
...>   {["XO", "O "], 2, 4, true}
...> ])
[{0, 1}]
A 3 × 5 méretű csutka
01234
0      
1 0  00, 1
2    11
iex> Khf2.utkozesek(4, 5, [
...>   {["OXO"], 1, 1, false},
...>   {["XOO", "  O"], 1, 1, false},
...>   {["X", "O"], 2, 3, false}
...> ])
[{0, 1}, {1, 2}]
A 4 × 5 méretű csutka
01234
0      
1 00, 10, 11 
2    1, 2 
3    2 
iex> Khf2.utkozesek(3, 4, [
...>   {["XO"], 1, 1, false},
...>   {["X", "O"], 1, 1, false},
...>   {["OOO", " X "], 1, 1, false}
...> ])
[{0, 1}, {0, 2}, {1, 2}]
A 3 × 4 méretű csutka
0123
0 222 
1  0, 1, 20 
2  1  

Segédanyagok

Tudnivalók a beadásról

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