如何编写压缩卡片组生成器?

时间:2013-03-29 14:03:28

标签: ruby

我正在写一个卡片组生成器,这是我提出的解决方案,但我发现它跨越了多行并且看起来不太好,有没有其他方法来构建这张卡?

deck = []
'23456789TJQKA'.each_char do |rank|
  'SHDC'.each_char do |suit|
    deck << rank + suit
  end
end

3 个答案:

答案 0 :(得分:5)

您可以使用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)来缩短版本。

但是,我认为编写一个清晰的程序而不是一个紧凑的程序会更好。

答案 1 :(得分:0)

作为使用块变体product(other_ary, ...) { |p| block }

的示例
deck = []
'23456789TJQKA'.split('').product('SHDC'.split('')){|el| deck << el.join}

答案 2 :(得分:0)

正如Arie建议的那样,写一个清晰的程序比写一个更短的程序更好。我认为这个很简单:

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)

开个玩笑。