Percursos
/
Ruby
Ruby
/
Exercícios
/
Contagem de aves
Contagem de aves

Contagem de aves

Exercício de aprendizagem

Introdução

Arrays

Em Ruby, um array (a que também se chama vetor) é uma coleção ordenada de qualquer objeto, indexada por números inteiros. A indexação de arrays começa em 0. Um índice negativo é considerado relativo ao fim do array. Por exemplo, um índice de -1 indica o último elemento do array, -2 é o penúltimo elemento, e assim por diante.

Criar arrays

Normalmente, os arrays criam-se com a notação []. Podem conter objetos de qualquer tipo.

array = [1, "two", 3.0]

Referência a elementos

Os elementos de um array podem ser obtidos através dos seus índices com o método #[]. Isto devolve o elemento no índice indicado, ou devolve um subarray que começa no índice inicial e se prolonga por um comprimento especificado. Os índices negativos contam a partir do fim do array.

a = [ "a", "b", "c", "d", "e" ]

a[2]       #=> "c"
a[6]       #=> nil
a[1, 3]    #=> [ "b", "c", "d" ]

a[-1]      #=> "e"
a[-2]      #=> "d"
a[-3, 2]   #=> ["c", "d"]

Métodos auxiliares

Há muitos métodos auxiliares úteis nos arrays. Aqui ficam alguns dos mais comuns:

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

fibonacci.size      #=> 8
fibonacci.sum       #=> 33
fibonacci.reverse   #=> [13, 8, 5, 3, 2, 1, 1, 0]

Enumeração

Em vez de usar ciclos para percorrer coleções, em Ruby usamos a enumeração.

A enumeração é o ato de percorrer uma coleção (neste caso, um array) e realizar alguma ação sobre cada objeto. A enumeração é um conceito fundamental em Ruby e é usada para coisas como ordenar, agrupar, mapear, reduzir e muito mais.

Uma enumeração para imprimir cada palavra de um array seria assim:

words = ["the", "cat", "sat"]
words.each do |word|
  puts word
end

# Output:
# the
# cat
# sat

Neste exemplo, chamámos o método .each ao nosso array e passámos um bloco que recebe um parâmetro (word) e o imprime.

Vamos ver os blocos com muito mais detalhe mais adiante no percurso, mas por agora pensa neles como funções anónimas que podem receber zero ou mais argumentos. Podem ser definidos com a sintaxe do...end (acima) ou com a sintaxe {} (abaixo).

Aqui ficam outros exemplos de métodos de arrays que usam blocos:

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

fibonacci.count  { |number| number == 1 }   #=> 2
fibonacci.any?   { |number| number == 6 }   #=> false
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]

Instruções

És um observador de aves entusiasta que regista quantas aves visitaram o teu jardim nos últimos sete dias.

Tens cinco tarefas, todas relacionadas com o número de aves que visitaram o teu jardim.

1. Verifica quais foram as contagens da semana passada

Para efeitos de comparação, guardas sempre por perto uma cópia das contagens da semana passada, que foram: 0, 2, 5, 3, 7, 8 e 4. Implementa o método BirdCount.last_week, que devolve as contagens da semana passada:

BirdCount.last_week
# => [0, 2, 5, 3, 7, 8, 4]

2. Verifica quantas aves visitaram ontem

Implementa o método BirdCount#yesterday para devolver quantas aves visitaram o teu jardim ontem. As contagens de aves estão ordenadas por dia: o primeiro elemento é a contagem do dia mais antigo e o último é a contagem de hoje.

birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.yesterday
# => 4

3. Calcula o número total de aves que visitaram o jardim

Implementa o método BirdCount#total para devolver o número total de aves que visitaram o teu jardim:

birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.total
# => 19

4. Calcula o número de dias movimentados

Alguns dias são mais movimentados do que outros. Um dia movimentado é aquele em que cinco ou mais aves visitaram o teu jardim. Implementa o método BirdCount#busy_days para devolver o número de dias movimentados:

birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.busy_days
# => 2

5. Verifica se houve algum dia sem aves a visitar o jardim

Implementa o método BirdCount#day_without_birds? que devolve true se houve um dia em que zero aves visitaram o jardim; caso contrário, devolve false:

birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.day_without_birds?
# => true
Editar via GitHub A ligação abre numa nova janela ou separador
Ruby Exercism

Estás pronto para começar Contagem de aves?

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