我試圖自動化測試。有沒有更好的方法來解決這個問題?我試圖創建一個只包含三個數的倍數的數組。紅寶石:生成陣列
(1...100).each_with_object([]) { |i, a| a << i if i % 3 == 0 }.reject { |i| i % 5 == 0 }
我試圖自動化測試。有沒有更好的方法來解決這個問題?我試圖創建一個只包含三個數的倍數的數組。紅寶石:生成陣列
(1...100).each_with_object([]) { |i, a| a << i if i % 3 == 0 }.reject { |i| i % 5 == 0 }
我試圖創建一個只包含三個,沒有別的倍數的數組。
使用Numeric#step
枚舉:
3.step(100, 3).to_a
創建三個的倍數高達100
你的代碼似乎有太多過濾掉五歲以下兒童的附加效果。您可以篩選出來:
3.step(100, 3).reject { |i| i % 5 == 0 }
或者你也可以做一些完全不同的:
require 'set'
((1..100).to_set - 3.step(100, 3) - 5.step(100, 5)).to_a
比拒絕的方式更清晰一點,但可能有點慢。
我從來沒有用過一步,很酷。你教給我一些新的東西。 :-) – theGrayFox
'(1..100).to_set'也可以寫成'Set.new(1..100)'。我不知道'to_set'可用於將Enumerable對象(因此Enumerator對象,例如'3.step(100,3)',因爲Enumerator包含Enumerable)轉換爲集合,但[它確實](http://www.ruby-doc.org/stdlib-2.1.1/libdoc/set/rdoc/Set.html),但我仍然不明白爲什麼沒有'Enumerable#to_set' 。我只找到'Set.to_set'。 –
爲什麼不map
數字1至33由每個由三個相乘,然後拒絕的5倍數?
(1..33).map { |i| i * 3 }.reject { |i| i % 5 == 0 }
我完全忘了地圖!感謝您的洞察力。 – theGrayFox
+1對於地圖和降低枚舉數。甚至可以做'(1.33).map {| i |我* 3除非我* 3%5 == 0} .compact!' – engineersmnky
一百萬和1紅寶石
(1..100).collect{|i| i if i % 3 == 0 && i % 5 != 0}.compact!
(1..100).select{|i| i if i % 3 == 0 && i % 5 != 0}
這裏迭代的方式是另一個之一,它讀取真的很好
(1..100).find_all{|i| i % 3 ==0 && i % 5 !=0}
'collect'在這裏並不適合;使用'select'或'reject' – meagar
夠公平的,因爲我必須調用'compact!'加上'select' – engineersmnky
我不太清楚你後有什麼一連串的數字,但每個可以被3整除的數字可以被另一個數字整除。如果'x'均勻地除以3來給出'y','x'將被均勻地除以'y'得到3.除了3和9之外沒有數字符合您的標準是「3的倍數」 「這就是假設你會忽略每個數字都是1的倍數。 – meagar
我有一個採訪,涉及與RSpec做FizzBuzz。我想出了一個很好的解決方案,但是我沒有時間來自動化測試。我希望確保我創建的這個數組只能打印出「Fizz」,僅用於三個和三個的倍數。我會做同樣的事情五倍的倍數。而不是說:'''[3,6,9] .each {| x | expect(fizzbuzz(x))。to eq('Fizz')}' – theGrayFox
@meagar:「(三的倍數),沒有別的」。不是「(三不是其他)的倍數」。 :) – Amadan