學習軌道
/
Ruby
Ruby
/
練習
/
鳥類計數
鳥類計數

鳥類計數

學習練習

簡介

陣列

在 Ruby 中,陣列是有序、以整數索引的集合,可以存放任何物件。 陣列的索引從0開始。 負索引代表從陣列尾端往回算,例如索引-1代表陣列的最後一個元素,-2代表倒數第二個元素,依此類推。

建立陣列

陣列通常使用[]語法來建立。 它們可以包含任何不同型別的物件。

array = [1, "two", 3.0]

元素參考

可以使用#[]方法,透過索引取出陣列中的元素。 這會回傳位於該索引的元素,或回傳從起始索引開始、長度為指定數量的子陣列。 負索引會從陣列尾端往回計算。

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"]

輔助方法

陣列有許多實用的輔助方法。 以下是幾個比較常見的:

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]

列舉

在 Ruby 中,我們不使用迴圈來走訪集合,而是使用列舉。

列舉是指逐一走訪集合(在這裡是陣列),並對每個物件執行某些動作。列舉是 Ruby 的重要概念,常用於排序、分組、映射、縮減等各種場合。

如果要列舉並印出陣列中的每個單字,程式碼會像這樣:

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

# Output:
# the
# cat
# sat

在這個例子中,我們對陣列呼叫.each方法,並傳入一個 區塊,這個區塊接受一個參數(word)並將它印出。

我們之後會在課程中更深入地探討 區塊,現在先把它們想成可以接受零個或多個引數的匿名函式。 區塊可以用do...end語法(如上)或{}語法(如下)定義。

以下還有一些使用區塊的陣列方法範例:

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]

說明

你是個熱衷的賞鳥者,會記錄過去七天有多少鳥造訪你的花園。

你有 5 個任務,全都和造訪你花園的鳥的數量有關。

1. 查看上週的計數

為了方便比較,你總是隨身保留一份上週的計數副本,分別是:0、2、5、3、7、8 和 4。實作 BirdCount.last_week 方法,回傳上週的計數:

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

2. 查看昨天有多少鳥造訪

實作 BirdCount#yesterday 方法,回傳昨天有多少鳥造訪你的花園。鳥的計數是按日期排序的,第一個元素是最早那天的計數,最後一個元素則是今天的計數。

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

3. 計算造訪鳥隻的總數

實作 BirdCount#total 方法,回傳造訪你花園的鳥的總數:

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

4. 計算忙碌的天數

有些日子比其他日子更忙碌。忙碌的一天,是指有 5 隻以上的鳥造訪你的花園的那一天。 實作 BirdCount#busy_days 方法,回傳忙碌的天數:

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

5. 查看是否有完全沒有鳥造訪的一天

實作 BirdCount#day_without_birds? 方法,如果有一天沒有任何鳥造訪花園,就回傳 true;否則回傳 false:

birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.day_without_birds?
# => true
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Ruby Exercism

準備好開始 鳥類計數 了嗎?

註冊 Exercism,透過 21 個概念121 個練習 和真人引導來學習並精通 Ruby,全部免費。