Kurzusok
/
Elixir
Elixir
/
Feladatok
/
Butikleltár
Butikleltár

Butikleltár

Tanulófeladat

Bevezetés

Enum

Az Enum egy nagyon hasznos modul, amely algoritmusok halmazát kínálja a felsorolható adatokkal való munkához. Lehetővé teszi a rendezést, szűrést, csoportosítást, számolást, keresést, a minimum/maximum értékek megtalálását és még sok mást.

Általánosságban a felsorolható minden olyan adat, amelyen végig lehet iterálni, egy gyűjtemény. Az Elixirben a felsorolható bármely olyan adattípus, amely megvalósítja az Enumerable protokollt. Ezek közül a leggyakoribbak a listák és a mapok.

Az Enum számos függvénye argumentumként fogad egy függvényt.

Enum.all?([1, 2, 3, 4, 5], fn x -> x > 3 end)
# => false

A leggyakoribb Enum függvények a map és a reduce.

map/2

Az Enum.map/2 segítségével a felsorolható adat minden elemét kicserélheted egy másik elemre. Az Enum.map/2 második argumentuma egy függvény, amely megkapja az eredeti elemet, és visszaadja annak helyettesítőjét.

reduce/3

Az Enum.reduce/3 segítségével a teljes felsorolható adatot egyetlen értékké redukálhatod. Ehhez egy speciális változót használunk, amelynek neve akkumulátor. Az akkumulátor hordozza a redukció köztes állapotát az iterációk között.

Az Enum.reduce/3 második argumentuma az akkumulátor kezdőértéke. A harmadik argumentum egy függvény, amely megkap egy elemet és egy akkumulátort, és visszaadja az akkumulátor új értékét.

Munka a mapokkal

Amikor mapokat használsz Enum függvényekkel, a map automatikusan egy 2 {key, value} tuple-ből álló listává alakul.

Ha újra mapot szeretnél belőle csinálni, használd az Enum.into/2 függvényt. Az Enum.into/2 egy olyan függvény, amely egy felsorolható adatot gyűjthetővé alakít, azaz bármely olyan adatszerkezetté, amely megvalósítja a Collectable protokollt. Ez az Enum.reduce/3 ellentétének tekinthető.

Az Enum-nek van Enum.into/3 függvénye is. Az Enum.into/3 az Enum.into/2 egy változata, amely elfogad egy átalakító függvényt, amelyet a felsorolható adat gyűjthetővé alakítása során alkalmaz.

Mapok leképezése

Ahelyett, hogy Enum.into/3-t vagy Enum.map/2-t és Enum.into/2-t használnál egy átalakítás (leképezés) mapra alkalmazásához, használhatod a dedikált Map.new/2 függvényt is. Pontosan úgy működik, mint az Enum.into/3, amennyiben elfogad egy felsorolható adatot és egy átalakító függvényt, de mindig egy új mapot ad vissza, ahelyett hogy választhatnánk egy gyűjthetőt.

Utasítások

Egy online divatbutikot vezetsz. Közeleg a nagy éves akció, ezért számba kell venned a készletedet, hogy biztosan felkészülj.

A készletben egyetlen elemet egy map reprezentál, a teljes készlet pedig az ilyen mapek listája.

%{
  name: "White Shirt",
  price: 40,
  quantity_by_size: %{s: 3, m: 7, l: 8, xl: 4}
}

1. Elemek rendezése ár szerint

Valósítsd meg a sort_by_price/1 függvényt. A készletet kapja meg, és adja vissza ár szerint növekvő sorrendbe rendezve.

BoutiqueInventory.sort_by_price([
  %{price: 65, name: "Maxi Brown Dress", quantity_by_size: %{}},
  %{price: 50, name: "Red Short Skirt", quantity_by_size: %{}},
  %{price: 50, name: "Black Short Skirt", quantity_by_size: %{}},
  %{price: 20, name: "Bamboo Socks Cats", quantity_by_size: %{}}
])

# => [
#      %{price: 20, name: "Bamboo Socks Cats", quantity_by_size: %{}},
#      %{price: 50, name: "Red Short Skirt", quantity_by_size: %{}},
#      %{price: 50, name: "Black Short Skirt", quantity_by_size: %{}},
#      %{price: 65, name: "Maxi Brown Dress", price: 65, quantity_by_size: %{}}
#    ]

2. Az összes hiányzó árú elem megkeresése

Miután ár szerint rendezted a készletedet, észrevetted, hogy hibáztál a leltározásnál, és néhány elemnél elfelejtetted kitölteni az árat.

Valósítsd meg a with_missing_price/1 függvényt. A készletet kapja meg, és adja vissza azon elemek listáját, amelyeknek nincs ára.

BoutiqueInventory.with_missing_price([
  %{price: 40, name: "Black T-shirt", quantity_by_size: %{}},
  %{price: nil, name: "Denim Pants", quantity_by_size: %{}},
  %{price: nil, name: "Denim Skirt", quantity_by_size: %{}},
  %{price: 40, name: "Orange T-shirt", quantity_by_size: %{}}
])

# => [
#      %{price: nil, name: "Denim Pants", quantity_by_size: %{}},
#      %{price: nil, name: "Denim Skirt", quantity_by_size: %{}}
#    ]

3. Elemnevek frissítése

Észrevetted, hogy néhány elem nevében szerepel egy szó, amit már nem szeretnél használni. Most frissítened kell minden olyan elemnevet, amelyben ez a szó szerepel.

Valósítsd meg az update_names/3 függvényt. A készletet, az eltávolítani kívánt régi szót és a helyette használni kívánt új szót kapja meg. Adja vissza a frissített nevű elemek listáját.

BoutiqueInventory.update_names(
  [
    %{price: 40, name: "Black T-shirt", quantity_by_size: %{}},
    %{price: 70, name: "Denim Pants", quantity_by_size: %{}},
    %{price: 65, name: "Denim Skirt", quantity_by_size: %{}},
    %{price: 40, name: "Orange T-shirt", quantity_by_size: %{}}
  ],
  "T-shirt",
  "Tee"
)

# => [
#      %{price: 40, name: "Black Tee", quantity_by_size: %{}},
#      %{price: 70, name: "Denim Pants", quantity_by_size: %{}},
#      %{price: 65, name: "Denim Skirt", quantity_by_size: %{}},
#      %{price: 40, name: "Orange Tee", quantity_by_size: %{}}
#    ]

4. Az elem mennyiségének növelése

Néhány elem különösen jól fogyott, ezért minden méretben rendeltél belőle többet.

Valósítsd meg az increase_quantity/2 függvényt. Egyetlen elemet és egy n számot kap, és visszaadja azt az elemet, amelyben minden méret mennyisége n-nel nőtt.

BoutiqueInventory.increase_quantity(
  %{
    name: "Polka Dot Skirt",
    price: 68,
    quantity_by_size: %{s: 3, m: 5, l: 3, xl: 4}
  },
  6
)

# => %{
#      name: "Polka Dot Skirt",
#      price: 68,
#      quantity_by_size: %{l: 9, m: 11, s: 9, xl: 10}
#    }

5. Az elem teljes mennyiségének kiszámítása

Ahhoz, hogy tudd, mennyi helyre lesz szükséged a raktáradban, tudnod kell, hogy összesen hány darab van az egyes elemekből.

Valósítsd meg a total_quantity/1 függvényt. Egyetlen elemet kap, és visszaadja, hogy összesen hány darabod van belőle, bármilyen méretben.

BoutiqueInventory.total_quantity(%{
  name: "Red Shirt",
  price: 62,
  quantity_by_size: %{s: 3, m: 6, l: 5, xl: 2}
})

# => 16
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Elixir Exercism

Készen állsz elkezdeni a(z) Butikleltár feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Elixir nyelvet 58 fogalom168 feladat segítségével, valódi emberi mentorálással, mindez ingyen.