Ruby_Array_41

この記事は、以下のドキュメントを改変(自分なりに整理)して利用しています。

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>