2014-03-06 216 views
0

我試圖自動化測試。有沒有更好的方法來解決這個問題?我試圖創建一個只包含三個數的倍數的數組。紅寶石:生成陣列

(1...100).each_with_object([]) { |i, a| a << i if i % 3 == 0 }.reject { |i| i % 5 == 0 } 
+0

我不太清楚你後有什麼一連串的數字,但每個可以被3整除的數字可以被另一個數字整除。如果'x'均勻地除以3來給出'y','x'將被均勻地除以'y'得到3.除了3和9之外沒有數字符合您的標準是「3的倍數」 「這就是假設你會忽略每個數字都是1的倍數。 – meagar

+0

我有一個採訪,涉及與RSpec做FizzBu​​zz。我想出了一個很好的解決方案,但是我沒有時間來自動化測試。我希望確保我創建的這個數組只能打印出「Fizz」,僅用於三個和三個的倍數。我會做同樣的事情五倍的倍數。而不是說:'''[3,6,9] .each {| x | expect(fizzbuzz(x))。to eq('Fizz')}' – theGrayFox

+0

@meagar:「(三的倍數),沒有別的」。不是「(三不是其他)的倍數」。 :) – Amadan

回答

1

我試圖創建一個只包含三個,沒有別的倍數的數組。

使用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 

比拒絕的方式更清晰一點,但可能有點慢。

+0

我從來沒有用過一步,很酷。你教給我一些新的東西。 :-) – theGrayFox

+0

'(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'。 –

2

爲什麼不map數字1至33由每個由三個相乘,然後拒絕的5倍數?

(1..33).map { |i| i * 3 }.reject { |i| i % 5 == 0 } 
+0

我完全忘了地圖!感謝您的洞察力。 – theGrayFox

+0

+1對於地圖和降低枚舉數。甚至可以做'(1.33).map {| i |我* 3除非我* 3%5 == 0} .compact!' – engineersmnky

0

一百萬和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} 
+0

'collect'在這裏並不適合;使用'select'或'reject' – meagar

+0

夠公平的,因爲我必須調用'compact!'加上'select' – engineersmnky