Trilhas
/
Elixir
Elixir
/
Exercícios
/
Adega de vinhos
Adega de vinhos

Adega de vinhos

Exercício de aprendizagem

Introdução

Listas de palavras-chave

Listas de palavras-chave são uma estrutura de dados de chave-valor.

[month: "April", year: 2018]

Listas de palavras-chave são listas de tuplas {key, value}, e também podem ser escritas dessa forma, mas a sintaxe mais curta é mais usada.

[month: "April"] == [{:month, "April"}]
# => true

As chaves em uma lista de palavras-chave precisam ser átomos, mas os valores podem ser qualquer coisa. Cada chave pode ser usada mais de uma vez. Os pares de chave-valor em uma lista de palavras-chave são ordenados.

Você pode trabalhar com listas de palavras-chave usando as mesmas abordagens das listas, ou pode usar o módulo Keyword.

Instruções

Você gerencia um restaurante chique que tem uma adega considerável. Muitos dos seus clientes são entusiastas de vinho exigentes. Encontrar a garrafa certa de vinho para um cliente específico não é uma tarefa fácil.

Como alguém que entende de tecnologia e está à frente do restaurante, você decidiu agilizar o processo de seleção de vinhos escrevendo um aplicativo que permita aos convidados filtrar seus vinhos conforme as preferências de cada um.

1. Explique as cores dos vinhos

Na tela de boas-vindas do seu aplicativo, você quer exibir uma breve explicação de cada cor de vinho.

Implemente a função WineCellar.explain_colors/0. Ela não recebe argumentos e retorna uma keyword list com as cores de vinho como chaves e as explicações como valores.

Cor Explicação
:white Fermentado sem contato com a casca.
:red Fermentado com contato com a casca, usando uvas escuras.
:rose Fermentado com algum contato com a casca, mas não o suficiente para ser considerado um vinho tinto.

2. Obtenha todos os vinhos de uma determinada cor

Uma garrafa de vinho é representada como uma tupla de 3 elementos com a variedade da uva, o ano e o país de origem. Os vinhos são armazenados por cor de vinho em uma keyword list.

[
  white: {"Chardonnay", 2015, "Italy"},
  white: {"Pinot grigio", 2017, "Germany"},
  red: {"Pinot noir", 2016, "France"},
  rose: {"Dornfelder", 2018, "Germany"}
]

Implemente a função WineCellar.filter/3. Ela deve receber uma keyword list de vinhos, um átomo de cor e uma keyword list de opções, com um valor padrão de []. A função deve retornar uma lista de vinhos de uma determinada cor.

WineCellar.filter(
  [
    white: {"Chardonnay", 2015, "Italy"},
    white: {"Pinot grigio", 2017, "Germany"},
    red: {"Pinot noir", 2016, "France"},
    rose: {"Dornfelder", 2018, "Germany"}
  ],
  :white
)

# => [
#      {"Chardonnay", 2015, "Italy"},
#      {"Pinot grigio", 2017, "Germany"}
#    ]

3. Obtenha todos os vinhos de uma determinada cor engarrafados em um determinado ano

Estenda a função WineCellar.filter/3. Quando receber a opção :year, a função deve retornar uma lista de vinhos de uma determinada cor de um determinado ano.

Use a função WineCellar.filter_by_year/2, que já está implementada. Ela recebe uma lista de vinhos e um ano como argumentos e retorna uma lista de vinhos de um determinado ano.

WineCellar.filter(
  [
    white: {"Chardonnay", 2015, "Italy"},
    white: {"Pinot grigio", 2017, "Germany"},
    red: {"Pinot noir", 2016, "France"},
    rose: {"Dornfelder", 2018, "Germany"}
  ],
  :white,
  year: 2015
)

# => [
#      {"Chardonnay", 2015, "Italy"}
#    ]

4. Obtenha todos os vinhos de uma determinada cor engarrafados em um determinado país

Estenda a função WineCellar.filter/3. Quando receber a opção :country, a função deve retornar uma lista de vinhos de uma determinada cor de um determinado país.

Use a função WineCellar.filter_by_country/2, que já está implementada. Ela recebe uma lista de vinhos e um país como argumentos e retorna uma lista de vinhos de um determinado país.

Certifique-se de que a função funcione quando receber tanto a opção :year quanto a :country, em qualquer ordem.

WineCellar.filter(
  [
    white: {"Chardonnay", 2015, "Italy"},
    white: {"Pinot grigio", 2017, "Germany"},
    red: {"Pinot noir", 2016, "France"},
    rose: {"Dornfelder", 2018, "Germany"}
  ],
  :white,
  year: 2015,
  country: "Germany"
)

# => []
Editar via GitHub O link abre em uma nova janela ou aba
Elixir Exercism

Tudo pronto para começar Adega de vinhos?

Crie sua conta no Exercism para aprender e dominar Elixir com 58 conceitos168 exercícios e mentoria humana de verdade, tudo de graça.