我正在寫卡片發電機組,這裏是我想出的解決方案,但我發現它跨越多行,看起來不太好,有沒有其他方式來構建此卡?如何寫一個壓縮卡片卡片發生器?
deck = []
'23456789TJQKA'.each_char do |rank|
'SHDC'.each_char do |suit|
deck << rank + suit
end
end
我正在寫卡片發電機組,這裏是我想出的解決方案,但我發現它跨越多行,看起來不太好,有沒有其他方式來構建此卡?如何寫一個壓縮卡片卡片發生器?
deck = []
'23456789TJQKA'.each_char do |rank|
'SHDC'.each_char do |suit|
deck << rank + suit
end
end
您可以使用Array#product
從兩個陣列產生笛卡爾乘積。
# ruby 2.0
deck = '23456789TJQKA'.chars.product('SHDC'.chars).map{|a| a.join}
# ruby 1.9
deck = '23456789TJQKA'.split(//).product('SHDC'.split(//)).map{|a| a.join}
由於DNNX評論,你可以使用.map(&:join)
獲得更短的一個。
但是,我認爲寫一個清晰的程序比一個精簡的程序更好。
作爲使用的塊的變體product(other_ary, ...) { |p| block }
deck = []
'23456789TJQKA'.split('').product('SHDC'.split('')){|el| deck << el.join}
作爲阿瑞建議的一個例子,它更好地寫一個明確的方案比較短的一個。我覺得這個很簡單:
deck = %w(2S 2H 2D 2C
3S 3H 3D 3C
4S 4H 4D 4C
5S 5H 5D 5C
6S 6H 6D 6C
7S 7H 7D 7C
8S 8H 8D 8C
9S 9H 9D 9C
TS TH TD TC
JS JH JD JC
QS QH QD QC
KS KH KD KC
AS AH AD AC)
只是在開玩笑。
如果您希望此代碼正常工作,您必須在'.chars'之後調用'.to_a'。 – DNNX
此外,.map(&:join)會稍微更短一些:) – DNNX
@DNNX我忘記多次使用'&:symbol'符號:-(。謝謝。 –