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

Adega de vinhos

Exercício de aprendizagem

Introdução

Listas de palavras-chave

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

[month: "April", year: 2018]

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

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

As chaves numa lista de palavras-chave têm de ser átomos, mas os valores podem ser qualquer coisa. Cada chave pode ser usada mais do que uma vez. Os pares chave-valor numa lista de palavras-chave estão ordenados.

Podes trabalhar com listas de palavras-chave usando as mesmas abordagens que usas com listas, ou podes usar o módulo Keyword.

Instruções

És o gerente de um restaurante elegante com uma cave de vinhos considerável. Muitos dos teus clientes são apreciadores de vinho exigentes. Encontrar a garrafa certa de vinho para um determinado cliente não é tarefa fácil.

Como proprietário de um restaurante que percebe de tecnologia, decidiste acelerar o processo de seleção de vinhos escrevendo uma aplicação que permite aos clientes filtrar os teus vinhos de acordo com as suas preferências.

1. Explica as cores de vinho

No ecrã de boas-vindas da tua aplicação, queres mostrar uma breve explicação de cada cor de vinho.

Implementa a função WineCellar.explain_colors/0. Não recebe argumentos e devolve uma lista de palavras-chave com as cores de vinho como chaves e as explicações como valores.

Cor Explicação
:white Fermentado sem contacto com as cascas.
:red Fermentado com contacto com as cascas, usando uvas de cor escura.
:rose Fermentado com algum contacto com as cascas, mas não o suficiente para ser considerado um vinho tinto.

2. Obtém todos os vinhos de uma dada cor

Uma garrafa de vinho é representada por um tuplo de 3 elementos: casta, ano e país de origem. Os vinhos estão guardados por cor de vinho numa lista de palavras-chave.

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

Implementa a função WineCellar.filter/3. Deve receber uma lista de palavras-chave de vinhos, um átomo de cor e uma lista de palavras-chave de opções, com o valor por omissão []. A função deve devolver uma lista de vinhos de uma dada 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. Obtém todos os vinhos de uma dada cor engarrafados num dado ano

Estende a função WineCellar.filter/3. Quando recebe a opção :year, a função deve devolver uma lista de vinhos de uma dada cor de um dado ano.

Usa a função WineCellar.filter_by_year/2, já implementada. Recebe uma lista de vinhos e um ano como argumentos e devolve uma lista de vinhos de um dado 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. Obtém todos os vinhos de uma dada cor engarrafados num dado país

Estende a função WineCellar.filter/3. Quando recebe a opção :country, a função deve devolver uma lista de vinhos de uma dada cor de um dado país.

Usa a função WineCellar.filter_by_country/2, já implementada. Recebe uma lista de vinhos e um país como argumentos e devolve uma lista de vinhos de um dado país.

Certifica-te de que a função funciona quando recebe tanto a opção :year como a opção :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 A ligação abre numa nova janela ou separador
Elixir Exercism

Estás pronto para começar Adega de vinhos?

Inscreve-te no Exercism para aprenderes e dominares Elixir com 58 conceitos168 exercícios, e mentoria humana real, tudo grátis.