iT邦幫忙

2021 iThome 鐵人賽

DAY 2
0
自我挑戰組

從真「新」鎮出發!30天的刷題修行篇,讓寫程式成為新必殺技系列 第 2

吾即是汝,汝即是吾,Ruby 30 天刷題修行篇第二話

大家好,這裡是 A Fei,今天是鐵人賽開賽第二天,也是連假開始前的小週末,在這先祝各位讀者中秋佳節愉快!

可能有人已經注意到,標題我借用了遊戲《Persona 5》的知名台詞。在遊戲中,主角一行人遭逢逆境,卻不甘屈服命運,傾聽心中「另一個我」的心聲,覺醒力量後化身「怪盜團」與惡人對抗,對比正在為轉職奮鬥的我,心境上頗為類似,也藉此勉勵自己不要輕易放棄,莫忘初衷。說個題外話,《Persona 5》的爵士風格音樂非常好聽,在此也推薦給大家。

蛤?你問我說了這麼多,那跟今天的題目有什麼關聯性?其實,今天的題目就叫做「
Are they the "same"?」

什麼?你說關聯性很牽強,啊...讓我們直接看題目:


Given two arrays a and b write a function comp(a, b) (orcompSame(a, b)) that checks whether the two arrays have the "same" elements, with the same multiplicities. "Same" means, here, that the elements in b are the elements in a squared, regardless of the order.

Examples

Valid arrays

a = [121, 144, 19, 161, 19, 144, 19, 11]  
b = [121, 14641, 20736, 361, 25921, 361, 20736, 361]

Invalid arrays

a = [121, 144, 19, 161, 19, 144, 19, 11]  
b = [132, 14641, 20736, 361, 25921, 361, 20736, 361]

Remarks

a or b might be [] or {} (all languages except R, Shell).
a or b might be nil or null or None or nothing (except in C++, Elixir, Haskell, PureScript, Pascal, Perl, R, Rust, Shell).
If a or b are nil (or null or None, depending on the language), the problem doesn't make sense so return false.


題目難度:6 kyu
是否有在時限內回答正確:是

題目很長,我省略了裡面一部分的解釋。簡單來說,題目要我們比較 a、b 兩個陣列,b 陣列中的每個數字,要等於 a 陣列每個數字的平方(不管排列順序),而且 a、b 有可能是 [] 或 {}、nil 或 null。解題重點如下:

  1. 要對 a 和 b 陣列每一個元素做平方或開平方的運算,對陣列中每個元素做某件事,我們會用到 map 方法;而開平方這件事,我用了 Math.sqrt 方法。
  2. 為了能讓 a 和 b 陣列中每個元素依照大小順序排好,方便我們依照索引值比對每個元素,要使用 sort 方法。
  3. 要先判斷 a 和 b 陣列是否為 nil,對此,神奇語法師 Ruby 有提供物件 nil? 方法,如果該物件是 nil,則會回傳 true;另外,我還使用 hash 方法,去比較兩個陣列的內容是否一樣。

我最後的答案如下:

def comp(array1, array2)
  if !array1.nil? and !array2.nil?
    array2.map { |e| Math.sqrt(e) }.sort.hash == array1.map { |e| e.to_f }.sort.hash 
  else
    false
  end  
end

對比評分最高的解答:

def comp(array1, array2)
  return false if array1.nil? || array2.nil?
  array1.map {|num| num ** 2}.sort == array2.sort 
end

可以看到我程式碼寫得比較囉嗦外,大致上邏輯是常不多的,只是我「給敖」用了 hash 方法去比較兩個陣列,其實只要用 == 就可以了。還有,為了避免有些數字開平方會有小數,我還「貼心地」用 to_f 方法將每個整數轉為浮點數,好讓它們可以互相比較,結果只是白操心。

好啦,修行篇第二話就寫到這,我要繼續趕專案進度了,各位 bye~


上一篇
鐵人賽開場就決定是你了,Ruby 30 天刷題修行篇第一話
下一篇
活到老,學到老,Ruby 30 天刷題修行篇第三話
系列文
從真「新」鎮出發!30天的刷題修行篇,讓寫程式成為新必殺技16

尚未有邦友留言

立即登入留言