2013-12-17 3 views
3

Просто работает с 2-9 в колоде карт.Более эффективный способ создания списка в Ruby

Что является предпочтительным и/или наиболее эффективным способом получения колоды, созданной в Ruby?

Это то, что у меня есть, или как еще я могу это сделать?

deck = [] 
suits = ["spades", "diamonds", "clubs", "hearts"] 

for x in suits 
    for y in 2..9 
    w = y.to_s 
    deck.push(w+" of "+x) 
    end 
end 

ответ

2
suits = ["spades", "diamonds", "clubs", "hearts"] 
deck = suits.product((2..9).to_a).map { |x,y| "#{y} of #{x}" } 

Если вы хотите, чтобы все 52 карты:

suits = ["spades", "diamonds", "clubs", "hearts"] 
faces = { 1 => 'Ace', 11 => 'Jack', 12 => 'Queen', 13 => 'King' } 
deck = suits.product((1..13).to_a).map { |x,y| "#{faces[y]||y} of #{x}" } 
# => Ace of spades, 2 of spades, ..., King of spades, Ace of diamonds, etc. 
1

Как насчет:

suits.flat_map {|s| (2..9).map{|r| "#{r} of #{s}"}} 
2

Ну, вы могли бы просто использовать карты:

suits = ["spades", "diamonds", "clubs", "hearts"] 
deck = suits.map { |d| (2..9).map { |x| "#{x} of #{d}" } }.flatten 

Но эффективность в основном та же.

4

мне нравится product ж/блок

a, suits = [], ["spades", "diamonds", "clubs", "hearts"] 
suits.product((2..9).to_a) {|t,n| a << "#{n} of #{t}"} 
0
suits, values, deck = %w(spades hearts diamonds clubs), [*2..9], values.product(suits).map { |card| card * ' of ' } 
Смежные вопросы