Menu
Coddy logo textTech

Envanter Anlık Görüntüsü

Coddy'nin Ruby Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 55 / 56.

Hash'leri, Enumerable zincirlerini, group_by metodunu ve biraz biçimlendirmeyi kullanan bir envanter raporu.

challenge icon

Görev

Orta

inventory dizisi verilmiştir. Her öğe :name, :category, :qty ve :price anahtarlarını içeren bir hash yapısıdır.

Dört satır yazdırın:

  1. Tüm öğelerdeki toplam envanter değeri (qty * price toplamı), tam sayı olarak yazdırılmalıdır.
  2. En fazla öğe sayısına sahip kategori, Top category: <name> (<count>) formatında yazdırılmalıdır. Eşitlik durumunda kategori adına göre alfabetik olarak öncelik verilir.
  3. Stokta kalmayan (qty == 0) öğelerin adları, alfabetik olarak sıralanmış ve , ile birleştirilmiş şekilde yazdırılmalıdır. Eğer hiç yoksa, (none) yazdırın.
  4. Birim fiyatına göre en pahalı ilk 3 öğenin adı, en yüksekten başlayarak , ile birleştirilmiş şekilde yazdırılmalıdır. Eşitlik durumunda isme göre alfabetik olarak sıralanmalıdır.

Varsayılan envanter için çıktı şöyledir:

232
Top category: food (3)
milk
chair, lamp, milk

Kopya kağıdı

Enumerable metotlarını kullanarak hash dizileriyle çalışma:

# Eleman başına hesaplama ile toplama
inventory.sum { |item| item[:qty] * item[:price] }

# Bir anahtara göre gruplandırma ve sayma
groups = inventory.group_by { |item| item[:category] }
groups.max_by { |cat, items| [items.count, ...] }

# Filtreleme, sıralama ve birleştirme
inventory.select { |item| item[:qty] == 0 }
         .map { |item| item[:name] }
         .sort
         .join(", ")

# Birden fazla kritere göre sıralama (eşitlik durumunda alfabetik)
inventory.sort_by { |item| [-item[:price], item[:name]] }
         .first(3)
         .map { |item| item[:name] }
         .join(", ")

Sayım ile max_by kullanırken eşitlikleri alfabetik olarak bozma:

# Daha yüksek sayı kazanır; eşitlik durumunda, alfabetik olarak ilk (max_by için dizeyi tersine çevirin)
groups.max_by { |cat, items| [items.count, -cat.ord] }
# Veya negatif sayı + doğal dize sırası üzerinde min_by kullanın
groups.sort_by { |cat, items| [-items.count, cat] }.first

Kendin dene

inventory = [
  { name: "apple",  category: "food",        qty: 10, price: 2 },
  { name: "bread",  category: "food",        qty: 4,  price: 3 },
  { name: "milk",   category: "food",        qty: 0,  price: 4 },
  { name: "chair",  category: "furniture",   qty: 2,  price: 35 },
  { name: "lamp",   category: "furniture",   qty: 5,  price: 20 },
  { name: "pencil", category: "stationery",  qty: 30, price: 1 }
]

# TODO: toplam değeri, en popüler kategoriyi, stokta olmayan isimleri ve fiyata göre ilk 3'ü yazdır
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Mantık ve Akış bölümündeki tüm dersler