Percursos
/
Ruby
Ruby
/
Exercícios
/
Inventário da boutique
Inventário da boutique

Inventário da boutique

Exercício de aprendizagem

Introdução

Mais métodos de enumeração

Na Contagem de Aves, foste apresentado aos métodos de enumeração count, any?, select, all? e map. Aqui tens um resumo desses métodos, com alguns extras adicionados:

fibonacci = [0, 1, 1, 2, 3, 5, 8, 13]

fibonacci.count  { |number| number == 1 }   #=> 2
fibonacci.any?   { |number| number > 20 }   #=> false
fibonacci.none?  { |number| number > 20 }   #=> true
fibonacci.select { |number| number.odd? }   #=> [1, 1, 3, 5, 13]
fibonacci.all?   { |number| number < 20 }   #=> true
fibonacci.map    { |number| number * 2  }   #=> [0, 2, 2, 4, 6, 10, 16, 26]
fibonacci.select { |number| number >= 5 }   #=> [5, 8, 13]
fibonacci.find   { |number| number >= 6 }   #=> 8

# Some methods work with or without a block
fibonacci.sum  #=> 33
fibonacci.sum { |number| number * number }  #=> 273

# There are also methods to help with nested arrays:
animals = [ ['cat', 'bob'], ['horse', 'caris'], ['mouse', 'arya'] ]
animals.flatten  #=> ["cat", "bob", "horse", "caris", "mouse", "arya"]

Enumerar hashes

Enumerar objetos Hash é exatamente o mesmo que enumerar objetos Array, exceto que o bloco recebe dois argumentos: a chave e o valor:

pet_names = {cat: "bob", horse: "caris", mouse: "arya"}
pet_names.each { |animal, name| ... }

Se só precisares de um dos valores, podes usar o símbolo especial _ para indicar que um dos valores não é necessário. Isto ajuda tanto na clareza para o programador como é uma otimização de desempenho.

pet_names = {cat: "bob", horse: "caris", mouse: "arya"}
pet_names.map { |_, name| name }  #=> ["bob", "caris", "arya"]

Enumerações aninhadas

Também podes enumerar em blocos aninhados e encadear métodos uns nos outros. Por exemplo, se tivermos um array de hashes de animais e quisermos extrair os animais com nomes curtos, podemos fazer algo assim:

pets = [
  { animal: "cats", names: ["bob", "fred", "sandra"] },
  { animal: "horses", names: ["caris", "black beard", "speedy"] },
  { animal: "mice", names: ["arya", "jerry"] }
]

pets.map { |pet|
  pet[:names].select { |name| name.length <= 5 }
}.flatten.sort
#=> ["arya", "bob", "caris", "fred", "jerry"]

Instruções

Tens uma boutique de moda online. A tua grande promoção anual está a chegar, por isso queres criar alguma funcionalidade que te ajude a fazer o balanço do teu inventário e a garantir que estás preparado.

Cada artigo do inventário é representado por um hash, e o inventário completo é um array desses hashes.

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

1. Devolve uma lista com os nomes dos artigos

Implementa BoutiqueInventory.item_names, que deve devolver uma lista com os nomes dos artigos por ordem alfabética.

BoutiqueInventory.new([
  {price: 65.00, name: "Maxi Brown Dress", quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}},
  {price: 50.00, name: "Red Short Skirt", quantity_by_size: {}},
  {price: 29.99, name: "Black Short Skirt", quantity_by_size: {s: 1, xl: 4}},
  {price: 20.00, name: "Bamboo Socks Cats", quantity_by_size: {s: 7, m: 2}}
]).item_names

#=> ["Bamboo Socks Cats", "Black Short Skirt", "Maxi Brown Dress", "Red Short Skirt"]

2. Devolve os artigos baratos

Implementa BoutiqueInventory.cheap, que deve devolver os artigos que custam menos de $30.

BoutiqueInventory.new([
  {price: 65.00, name: "Maxi Brown Dress", quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}},
  {price: 50.00, name: "Red Short Skirt", quantity_by_size: {}},
  {price: 29.99, name: "Black Short Skirt", quantity_by_size: {s: 1, xl: 4}},
  {price: 20.00, name: "Bamboo Socks Cats", quantity_by_size: {s: 7, m: 2}}
]).cheap

# => [
#      {price: 29.99, name: "Black Short Skirt", quantity_by_size: {s: 1, xl: 4}},
#      {price: 20.00, name: "Bamboo Socks Cats", quantity_by_size: {s: 7, m: 2}}
#    ]

3. Devolve os artigos esgotados

Implementa BoutiqueInventory.out_of_stock, que deve devolver os artigos que não têm stock (aqueles em que quantity_by_size está vazio).

BoutiqueInventory.new([
  {price: 65.00, name: "Maxi Brown Dress", quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}},
  {price: 50.00, name: "Red Short Skirt", quantity_by_size: {}},
  {price: 29.99, name: "Black Short Skirt", quantity_by_size: {s: 1, xl: 4}},
  {price: 20.00, name: "Bamboo Socks Cats", quantity_by_size: {s: 7, m: 2}}
]).out_of_stock

#=> [{price: 50.00, name: "Red Short Skirt", quantity_by_size: {}}]

4. Devolve o stock de um artigo

Implementa BoutiqueInventory.stock_for_item(name) para devolver o stock de um artigo a partir do seu nome:

BoutiqueInventory.new([
  {price: 65.00, name: "Maxi Brown Dress", quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}},
  {price: 50.00, name: "Red Short Skirt", quantity_by_size: {}},
  {price: 29.99, name: "Black Short Skirt", quantity_by_size: {s: 1, xl: 4}},
  {price: 20.00, name: "Bamboo Socks Cats", quantity_by_size: {s: 7, m: 2}}
]).stock_for_item("Black Short Skirt")

#=> {s: 1, xl: 4}

5. Devolve o stock total

Implementa BoutiqueInventory.total_stock para calcular o número total de artigos no teu armazém:

BoutiqueInventory.new([
  {price: 65.00, name: "Maxi Brown Dress", quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}},
  {price: 50.00, name: "Red Short Skirt", quantity_by_size: {}},
  {price: 29.99, name: "Black Short Skirt", quantity_by_size: {s: 1, xl: 4}},
  {price: 20.00, name: "Bamboo Socks Cats", quantity_by_size: {s: 7, m: 2}}
]).total_stock

#=> 36
Editar via GitHub A ligação abre numa nova janela ou separador
Ruby Exercism

Estás pronto para começar Inventário da boutique?

Inscreve-te no Exercism para aprenderes e dominares Ruby com 21 conceitos121 exercícios, e mentoria humana real, tudo grátis.