この記事は、以下のドキュメントを改変(自分なりに整理)して利用しています。
class Array (Ruby 3.0.0 リファレンスマニュアル)
インスタンスメソッド
permutation(n = self.length) { |p| block } -> Array[permalink][rdoc][edit]
permutation(n = self.length) -> Enumerator
- サイズnの順列をすべて生成し、それを引数としてブロックを実行する
- 順列 - Wikipedia
- 引数を省略した場合、nは配列の要素数
- 得られる順列の順序は保証されない
- ブロックなしで呼び出されると、順列を生成するEnumeratorオブジェクトを返す
irb(main):001:0> arr = %w[a b c] => ["a", "b", "c"] irb(main):002:0> arr.permutation.to_a => [["a", "b", "c"], ["a", "c", "b"], ["b", "a", "c"], ["b", "c", "a"], ["c", "a", "b"], ["c", "b", "a"]] irb(main):003:0> arr.permutation(1).to_a => [["a"], ["b"], ["c"]] irb(main):004:0> arr.permutation(2).to_a => [["a", "b"], ["a", "c"], ["b", "a"], ["b", "c"], ["c", "a"], ["c", "b"]] irb(main):005:0> arr.permutation(3).to_a => [["a", "b", "c"], ["a", "c", "b"], ["b", "a", "c"], ["b", "c", "a"], ["c", "a", "b"], ["c", "b", "a"]] irb(main):006:0> arr.permutation(4).to_a => [] irb(main):007:0> arr.permutation(0).to_a => [[]] # memo # n=0のときの挙動は覚えておきたい。 # 上記例の場合、サイズ4の順列は生成できないけど、サイズ0の順列は生成できる(空配列)ということなのか
irb(main):001:0> arr = %w[a b c] => ["a", "b", "c"] irb(main):002:0> enum = arr.permutation => #<Enumerator: ["a", "b", "c"]:permutation> irb(main):003:1* enum.each do |v| irb(main):004:1* pp v irb(main):005:1* end ["a", "b", "c"] ["a", "c", "b"] ["b", "a", "c"] ["b", "c", "a"] ["c", "a", "b"] ["c", "b", "a"] => ["a", "b", "c"] irb(main):006:0 arr << 'd' => ["a", "b", "c", "d"] irb(main):007:0> enum => #<Enumerator: ["a", "b", "c", "d"]:permutation>