2011-08-10 60 views

答えて

21

正しくあなたを理解していれば、あなたはこれをしたい:

def string_shuffle(s) 
    s.split("").shuffle.join 
end 

string_shuffle("The Ruby language") 
=> "ea gu bgTayehRlnu" 
+1

シャッフルがたくさん必要な場合は、 'shuffle'の代わりに' shuffle! 'を使うのが理にかなっています。それは少し速いです。 – defhlt

+2

'split(" ")'の代わりに 'chars'を使うことができます –

2

シャッフルは引数を受け入れません(必要とします)。用途:

s.split(//).shuffle.to_s 
6

return sが必要と間違っていません両方。 Rubyはあなたがsを変更していないために最後に実行されたものと間違って実行されたものを返しますので、新しい文字列を作成する必要はありません。

さらに、shuffleメソッドを直接Stringに追加すると便利ですが、あまりにも多くのモンスキッチングが発生することに注意してください。

class String 

    def shuffle 
    self.split('').shuffle.join 
    end 
end 
+1

これをモジュールに入れて、影響を与えたい文字列にモジュールを適用すると、アプリ内の他の文字列に影響を与えず、 。 –

+0

@Joseph、モジュールを特定の文字列インスタンスにどのように影響させるのですか?例やリンクは素晴らしいでしょう。また、Josh、あなたはこれを知ることができます[monkeypatchingに関する質問](http://stackoverflow.com/questions/394144/what-does-monkey-patching-exactly-mean-in-ruby)有用です。 – Zabba

+0

@Zabba http://www.ruby-doc.org/core/classes/Module.html拡張を確認してください。それは猿がクラスではなく変数をパッチします。 –

1

これは高速である。この

s.split('').shuffle.join 
2

を試してみてください。 'hello'.chars.shuffle.join

テスト自分自身:

require 'benchmark' 

str = 'Hello' * 100 
Benchmark.bm(10) do |x| 
    x.report('chars')  { str.chars.shuffle.join } 
    x.report('split')  { str.split('').shuffle.join } 
    x.report('split regex') { str.split(//).shuffle.join } 
end 
0

これが行います。

s.chars.shuffle.join 

例:

s = "Hello, World!" 
puts s.chars.shuffle.join 

出力:

olH!l rWdel,o 
関連する問題