Menu
Coddy logo textTech

Instantánea de inventario

Parte de la sección Lógica y flujo del Journey de Ruby de Coddy — lección 55 de 56.

Un informe de inventario que pone en práctica hashes, cadenas de Enumerable, group_by y un toque de formato.

challenge icon

Desafío

Intermedio

Se proporciona el array inventory. Cada elemento es un hash con :name, :category, :qty, y :price.

Imprime cuatro líneas:

  1. El valor total del inventario de todos los artículos (qty * price, sumados), impreso como un entero.
  2. La categoría con el mayor número de artículos, en el formato Top category: <name> (<count>). Los empates se resuelven alfabéticamente por el nombre de la categoría.
  3. Nombres de los artículos out of stock (qty == 0), ordenados alfabéticamente, unidos por , . Si no hay ninguno, imprime (none).
  4. Nombres de los 3 artículos más caros por precio unitario, del más alto al más bajo, unidos por , . Los empates se resuelven alfabéticamente por nombre.

Para el inventario por defecto, la salida es:

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

Hoja de referencia

Trabajando con arreglos de hashes usando métodos de Enumerable:

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

# Agrupar por una clave y contar
groups = inventory.group_by { |item| item[:category] }
groups.max_by { |cat, items| [items.count, ...] }

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

# Ordenar por múltiples criterios (los empates se resuelven alfabéticamente)
inventory.sort_by { |item| [-item[:price], item[:name]] }
         .first(3)
         .map { |item| item[:name] }
         .join(", ")

Resolviendo empates alfabéticamente al usar max_by con conteos:

# El conteo más alto gana; en caso de empate, el primero alfabéticamente (negar cadena para max_by)
groups.max_by { |cat, items| [items.count, -cat.ord] }
# O usar min_by con el conteo negado + orden natural de cadenas
groups.sort_by { |cat, items| [-items.count, cat] }.first

Pruébalo tú mismo

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: print total value, top category, out-of-stock names, top 3 by price
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y flujo