2014-05-12 2 views
-1

Я пытаюсь создать все покер карты (52 карт), вот как я это делаю:Refactor: Ликвидировать два в Руби

ranks = '23456789TJQKA'.split '' 
suits = 'SHDC'.split '' 
my_deck = [] 

ranks.each do |r| 
    suits.each { |s| my_deck << r+s } 
end 

my_deck # => ["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"] 

Мои друзья, которые используют питона показывает мне это:

[r+s for r in '23456789TJQKA' for s in 'SHDC'] 

Кто-нибудь может дать мне совет о том, как сделать приведенный выше код более красивым как версия Python? Заранее спасибо.

+0

Это прекрасно, как его написал. – meagar

+0

Спасибо. Попросить увидеть другие возможности. – juanitofatas

+0

Этот вопрос кажется не по теме, потому что речь идет о просмотре кода. –

ответ

6

Другой способ, чтобы написать это с помощью Array#product:

ranks = %w(2 3 4 5 6 7 8 9 T J Q K A) 
suits = %w(S H D C) 

my_deck = ranks.product(suits).map(&:join) 
#=> ["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"] 
+0

Спасибо, использование 'product',' map' и 'join' прекрасное. – juanitofatas

+0

О да, лучше! –

+0

Нет другого выбора, чтобы сделать его более приятным .. :) +1 –

-1

Это вопрос мнения. Вы можете использовать %w() вместо .split, более описательные имена переменных, строчную интерполяцию и более идиоматический map, а не итеративный программный код each s.

ranks = %w{2 3 4 5 6 7 8 9 T J Q K A} 
suits = %w{S H D C} 

my_deck = ranks.map{|rank| suits.map{|suit| "#{rank}#{suit}" }}.flatten 
Смежные вопросы