2016-03-23 7 views
0

私はこのルビーモンクチャレンジhttp://rubymonk.com/learning/books/1-ruby-primer/problems/154-permutationsをやって、この溶液を思い付いた:ルビーモンク数シャッフル - ソリューションの比較

def number_shuffle(number) 
    string_rep = number.to_s 
    ary = string_rep.split('').permutation(number.to_s.length).to_a 

    result = [] 

    ary.each do |i| 
    x = i.join.to_i 
    result << x 
    end 

    return result.sort 
end 

はまた、ここではRubyのモンクのソリューションです:

def number_shuffle(number) 
    no_of_combinations = number.to_s.size == 3 ? 6 : 24 
    digits = number.to_s.split(//) 
    combinations = [] 
    combinations << digits.shuffle.join.to_i while combinations.uniq.size!=no_of_combinations 
    combinations.uniq.sort 
end 

私はルビーを感知モンクの解決策はルビースタイルではありますが、私はその理由をよりよく理解したいと思います。 あなたの考えを分かち合い、いくつかのヒントを教えてください。 事前に感謝します。

+0

リンクだけでなく、質問内で問題を追加する必要があります。 –

+0

'return'キーワードは不要です。 –

+0

おかげさまで、将来完全な問題を投稿することを心掛けています。 – do20i

答えて

0
  1. 添えていますその正確な値を含む変数(すなわちstring_rep)を作成しました。メソッド呼び出しを複数回行う必要はありません。
  2. 誰かが触れたように、新しい配列を作成し、単純にmapまたはcollectのメソッドを使うことができるときは、その配列に追加するのは初心者のミスです(同じことをします)。だから、コードを読むと良いでしょうresult = ary.map {|i| i.join.to_i}
  3. return result.sortを入力する必要はありません。 Rubyはデフォルトで最後のコマンドを返します。したがって、returnディレクティブを省略してresult.sortと書くだけです。

また、解決策の例では数値が一意になります。同じことをしていますか?

+0

素敵な要約、ありがとう! – do20i

+0

問題はありません、私の喜び: – DaniG2k

1

「非ルビー」されていることの一つ...

result = [] 

ary.each do |i| 
    x = i.join.to_i 
    result << x 
end 

方法map意志それは、eachを使用し、各反復上のアレイに追加する間違いを、典型的な「ルビーする新しい」です自動的に配列を返します。あなたも、あなたかかわらず、二回number.to_sを呼び出している

result = ary.map {|i| i.join.to_i } 

はまた、我々は中間結果xを必要としなかった注意、およびブロックが比較的短いよう私たちはより良い{}代わりのdo end

+0

ありがとうございます、これを覚えておいてください! – do20i

2

Ruby Monkのソリューションはプログラミングが悪いですが、スタイルは問題ありません。あなたの解決策は受け入れられますが、スタイルを改善することができます。

とにかく、これはワンライナーで行うことができます。

def number_shuffle(number) 
    number.to_s.split('').permutation.to_a.collect {|a| a.join.to_i}.sort 
end 

編集:のでpermutation makes no guarantees about the ordersortが必要とされています。

+0

恐ろしい解決策、多くの感謝! – do20i