Ruby_Array_47

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

class Array (Ruby 3.1 リファレンスマニュアル)

インスタンスメソッド

repeated_combination(n) { |c| ... } -> Array
repeated_combination(n) -> Enumerator
  • サイズnの重複組合せをすべて作成し、それを引数としてブロックを実行
    • 組み合わせの順序は保障されない
    • nは生成される配列のサイズ。整数で指定する。整数以外の(暗黙の型変換が行えない)オブジェクトを指定するとTypeError
  • ブロックなしで呼び出されると、組み合わせを生成するEnumeratorオブジェクトを返す
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> arr.repeated_combination(1).to_a
=> [[1], [2], [3]]

irb(main):003:0> arr.repeated_combination(2).to_a
=> [[1, 1], [1, 2], [1, 3], [2, 2], [2, 3], [3, 3]]

irb(main):004:0> arr.repeated_combination(3).to_a
=> [[1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 2, 2], [1, 2, 3], [1, 3, 3], [2, 2, 2], [2, 2, 3], [2, 3, 3], [3, 3, 3]]

irb(main):005:0> arr.repeated_combination(4).to_a
=> [[1, 1, 1, 1], [1, 1, 1, 2], [1, 1, 1, 3], [1, 1, 2, 2], [1, 1, 2, 3], [1, 1, 3, 3], [1, 2, 2, 2], [1, 2, 2, 3], [1, 2, 3, 3], [1, 3, 3, 3], [2, 2, 2, 2], [2, 2, 2, 3], [2, 2, 3, 3], [2, 3, 3, 3], [3, 3, 3, 3]]

irb(main):00:0> arr.repeated_combination(0).to_a
=> [[]]

# memo
# nが0のときの挙動は覚えておきたい
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> arr.repeated_combination(1.0).to_a
=> [[1], [2], [3]]

irb(main):003:0> arr.repeated_combination('1').to_a
Traceback (most recent call last):
        5: from /Users/mfham/.rbenv/versions/3.0.0/bin/irb:23:in `<main>'
        4: from /Users/mfham/.rbenv/versions/3.0.0/bin/irb:23:in `load'
        3: from /Users/mfham/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/irb-1.3.0/exe/irb:11:in `<top (required)>'
        2: from (irb):3:in `<main>'
        1: from (irb):3:in `repeated_combination'
TypeError (no implicit conversion of String into Integer)
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> brr = arr.repeated_combination(2)
=> #<Enumerator: [1, 2, 3]:repeated_combination(2)>

irb(main):003:0> brr.each { |v| pp v }
[1, 1]
[1, 2]
[1, 3]
[2, 2]
[2, 3]
[3, 3]
=> [1, 2, 3]

irb(main):004:0> arr[2] = 5
=> 5

irb(main):005:0> arr
=> [1, 2, 5]

irb(main):006:0> brr
=> #<Enumerator: [1, 2, 5]:repeated_combination(2)>

irb(main):007:0> brr.each { |v| pp v }
[1, 1]
[1, 2]
[1, 5]
[2, 2]
[2, 5]
[5, 5]
=> [1, 2, 5]
repeated_permutation(n) { |p| ... } -> Array
repeated_permutation(n) -> Enumerator
  • サイズnの重複順列をすべて作成し、それを引数としてブロックを実行
    • 順列の順序は保障されない
    • nは生成される配列のサイズ。整数で指定する。整数以外の(暗黙の型変換が行えない)オブジェクトを指定するとTypeError
  • ブロックなしで呼び出されると、組み合わせを生成するEnumeratorオブジェクトを返す
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> arr.repeated_permutation(1).to_a
=> [[1], [2], [3]]

irb(main):003:0> arr.repeated_permutation(2).to_a
=> [[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]]

irb(main):004:0> arr.repeated_permutation(3).to_a
=> [[1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 2, 1], [1, 2, 2], [1, 2, 3], [1, 3, 1], [1, 3, 2], [1, 3, 3], [2, 1, 1], [2, 1, 2], [2, 1, 3], [2, 2, 1], [2, 2, 2], [2, 2, 3], [2, 3, 1], [2, 3, 2], [2, 3, 3], [3, 1, 1], [3, 1, 2], [3, 1, 3], [3, 2, 1], [3, 2, 2], [3, 2, 3], [3, 3, 1], [3, 3, 2], [3, 3, 3]]

irb(main):005:0> arr.repeated_permutation(4).to_a
=> [[1, 1, 1, 1], [1, 1, 1, 2], [1, 1, 1, 3], [1, 1, 2, 1], [1, 1, 2, 2], [1, 1, 2, 3], [1, 1, 3, 1], [1, 1, 3, 2], [1, 1, 3, 3], [1, 2, 1, 1], [1, 2, 1, 2], [1, 2, 1, 3], [1, 2, 2, 1], [1, 2, 2, 2], [1, 2, 2, 3], [1, 2, 3, 1], [1, 2, 3, 2], [1, 2, 3, 3], [1, 3, 1, 1], [1, 3, 1, 2], [1, 3, 1, 3], [1, 3, 2, 1], [1, 3, 2, 2], [1, 3, 2, 3], [1, 3, 3, 1], [1, 3, 3, 2], [1, 3, 3, 3], [2, 1, 1, 1], [2, 1, 1, 2], [2, 1, 1, 3], [2, 1, 2, 1], [2, 1, 2, 2], [2, 1, 2, 3], [2, 1, 3, 1], [2, 1, 3, 2], [2, 1, 3, 3], [2, 2, 1, 1], [2, 2, 1, 2], [2, 2, 1, 3], [2, 2, 2, 1], [2, 2, 2, 2], [2, 2, 2, 3], [2, 2, 3, 1], [2, 2, 3, 2], [2, 2, 3, 3], [2, 3, 1, 1], [2, 3, 1, 2], [2, 3, 1, 3], [2, 3, 2, 1], [2, 3, 2, 2], [2, 3, 2, 3], [2, 3, 3, 1], [2, 3, 3, 2], [2, 3, 3, 3], [3, 1, 1, 1], [3, 1, 1, 2], [3, 1, 1, 3], [3, 1, 2, 1], [3, 1, 2, 2], [3, 1, 2, 3], [3, 1, 3, 1], [3, 1, 3, 2], [3, 1, 3, 3], [3, 2, 1, 1], [3, 2, 1, 2], [3, 2, 1, 3], [3, 2, 2, 1], [3, 2, 2, 2], [3, 2, 2, 3], [3, 2, 3, 1], [3, 2, 3, 2], [3, 2, 3, 3], [3, 3, 1, 1], [3, 3, 1, 2], [3, 3, 1, 3], [3, 3, 2, 1], [3, 3, 2, 2], [3, 3, 2, 3], [3, 3, 3, 1], [3, 3, 3, 2], [3, 3, 3, 3]]

irb(main):006:0> arr.repeated_permutation(0).to_a
=> [[]]

# memo
# nが0のときの挙動は覚えておきたい
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> arr.repeated_permutation(1.0).to_a
=> [[1], [2], [3]]

irb(main):003:0> arr.repeated_permutation('1').to_a
Traceback (most recent call last):
        7: from /Users/mfham/.rbenv/versions/3.0.0/bin/irb:23:in `<main>'
        6: from /Users/mfham/.rbenv/versions/3.0.0/bin/irb:23:in `load'
        5: from /Users/mfham/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/irb-1.3.0/exe/irb:11:in `<top (required)>'
        4: from (irb):3:in `<main>'
        3: from (irb):3:in `to_a'
        2: from (irb):3:in `each'
        1: from (irb):3:in `repeated_permutation'
TypeError (no implicit conversion of String into Integer)
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> brr = arr.repeated_permutation(1)
=> #<Enumerator: [1, 2, 3]:repeated_permutation(1)>

irb(main):003:0> brr.each { |v| pp v }
[1]
[2]
[3]
=> [1, 2, 3]

irb(main):004:0> arr[2] = 5
=> 5

irb(main):005:0> brr
=> #<Enumerator: [1, 2, 5]:repeated_permutation(1)>
irb(main):006:0> brr.each { |v| pp v }
[1]
[2]
[5]
=> [1, 2, 5]

メモ