Menu
Coddy logo textTech

Snapshot do Inventário

Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy — lição 55 de 56.

Um relatório de inventário que exercita hashes, encadeamentos Enumerable, group_by e um toque de formatação.

challenge icon

Desafio

Médio

O array inventory é fornecido. Cada item é um hash com :name, :category, :qty, e :price.

Imprima quatro linhas:

  1. O valor total do inventário de todos os itens (qty * price, somados), impresso como um número inteiro.
  2. A categoria com a maior contagem de itens, no formato Top category: <name> (<count>). Empates são resolvidos alfabeticamente pelo nome da categoria.
  3. Nomes dos itens out of stock (qty == 0), ordenados alfabeticamente, unidos por , . Se não houver nenhum, imprima (none).
  4. Nomes dos 3 itens mais caros por preço unitário, do maior para o menor, unidos por , . Empates são resolvidos pelo nome alfabeticamente.

Para o inventário padrão, a saída é:

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

Folha de consulta

Trabalhando com arrays de hashes usando métodos Enumerable:

# Soma com cálculo por elemento
inventory.sum { |item| item[:qty] * item[:price] }

# Agrupar por uma chave e contar
groups = inventory.group_by { |item| item[:category] }
groups.max_by { |cat, items| [items.count, ...] }

# Filtrar, ordenar e juntar
inventory.select { |item| item[:qty] == 0 }
         .map { |item| item[:name] }
         .sort
         .join(", ")

# Ordenar por múltiplos critérios (desempate em ordem alfabética)
inventory.sort_by { |item| [-item[:price], item[:name]] }
         .first(3)
         .map { |item| item[:name] }
         .join(", ")

Desempatando em ordem alfabética ao usar max_by com contagens:

# A contagem maior vence; em caso de empate, o primeiro em ordem alfabética (negue a string para max_by)
groups.max_by { |cat, items| [items.count, -cat.ord] }
# Ou use min_by na contagem negada + ordem natural da string
groups.sort_by { |cat, items| [-items.count, cat] }.first

Experimente você mesmo

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: imprimir valor total, categoria principal, nomes fora de estoque, os 3 mais caros por preço
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e Fluxo