この記事は、以下のドキュメントを改変(自分なりに整理)して利用しています。
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]