2017-01-18 23 views
-5

私は10個のボタンでコンビネーションロックを持っており、4個のボタンを押してからOpenを押す必要があります。ボタンの順序は問題ではなく、各ボタンは一度しか押すことができません。文字列または整数の数字をソートする?

これは簡単な問題になる確率論と順列があると確信していますが、Rubyで解決したいと思います。

私の考えは、カウンタで数字を並べ替えることです。各桁が1回だけ出現する場合は、最後にハッシュの長さを取得できるハッシュに挿入してみてください組み合わせの数を持つ。

しかし、どのように文字列またはインターの中の数字を並べ替えることができますか?

これにはよりスマートなアルゴリズムがありますか?

+0

問題を解決しようとしたコードを含めて質問を改善してください。 – Bustikiller

+0

私が持っているのは、whileループです。どうにかして何とか数字を並べ替える必要があることが分かりました。 –

+0

コードを投稿するとよいスタートポイントになります。あなたがやろうとしていることをもっと明確にしてくれるでしょう。 – Bustikiller

答えて

1

数学

私は右のそれを理解していれば、「賢いアルゴリズムが」ちょうど10 choose 4を計算することです。あなただけのユニークな要素をカウントしたい場合

あなたの質問

SetHashより良く適しているかもしれません。

あなたは文字列を持っていると数字をソートしたい場合は、あなたが使用することができます。

'4132'.chars.sort 
#=> ["1", "2", "3", "4"] 
'4132'.chars.sort.join 
#=> "1234" 

代替

あなたは、任意のコードを提供しなかったので、私はちょうどのためにいくつかのヒントを書きますそれを計算する別の方法は:

  • あなたは10の10 Sとボタンの組み合わせを記述することができます。
  • これらの1および0は、2進数と見ることができます。あなたは4つのボタンかどうかを確認するために1秒数をカウントすることができ、この範囲内のすべての番号を反復し、バイナリ(number.to_s(2)
  • に変換することができます
  • (1023)
  • 0間と 2**10-1
  • この2進数でありますあなたは、だから、いくつかのことを正確に4 1
+0

Downvoter:建設的な批評は大歓迎です。 –

2

を持っ進数をカウントすることができ

  • を押されて、あなたは順序は重要ではありませんでしたので、私達はちょうどユニークな組み合わせを必要とすると述べました。また、各ボタンは一度しか押せないと言った。

    また、あなたはそれをルビーを使って解決したいと言っていました。なぜ、完全に簡単な方法があるときに、あなた自身の複雑な方法を書くのですか?

    ハッシュではなく配列を必要としているようです。

    これはそれを実現しますが、配列に:

    [0,1,2,3,4,5,6,7,8,9].combination(4).to_a 
    

    これはハッシュに入れます。

    combinations_in_hash = Hash.new 
    [0,1,2,3,4,5,6,7,8,9].combination(4).to_a.each_with_index { |x,i| combinations_in_hash[i] = x } 
    combinations_in_hash 
    

    しかし

    combinations_in_hash = Hash.new 
    [0,1,2,3,4,5,6,7,8,9].combination(4).to_a.each_with_index { |x,i| combinations_in_hash[x] = Array.new(x.permutation.to_a) } 
    combinations_in_hash 
    

    またはアレイ状に...のは、組み合わせの順序は問題DID言わせて:

    [0,1,2,3,4,5,6,7,8,9].permutation(4).to_a 
    

    順列を渡すことによって、組み合わせ/順列効果を組み合わせることができます長さの引数。念のため!

    これは5,040種類の組み合わせです。悪くない!

  • +0

    非常に良い解決策。しかし正解は '10!/(4!(10-4)!)= 210'です。 5040は注文が問題のように見えます。 –

    +0

    @JasmineLognnesそれは最初のものが何をしているか、最後のものは全ての順列に入り、2番目のコードスニペットの後に私は "順序が問題であれば"という意味になります1234の意味は2134です。 – OneNeptune

    関連する問題