組み合わせ

combination

1つの配列の箱から2つをピックする組み合わせ。

[1,2,3].combination(2).to_a
# => [[1, 2], [1, 3], [2, 3]]

repeated_combination

2つの同じ配列の箱から2つをピックする組み合わせ。

[1,2,3].repeated_combination(2).to_a
# => [[1, 1], [1, 2], [1, 3], [2, 2], [2, 3], [3, 3]]

順列

permutation

1つの配列の箱から2つをピックする順列。

[1,2,3].permutation(2).to_a
# => [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]

repeated_permutation

2つの同じ配列の箱から2つをピックする順列。

[1,2,3].repeated_permutation(2).to_a
#=> [[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]]

product

repeated_permutation と同じ結果は product を使うことでも得られる。

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

[1,2,3].product([1,2,3])
# => [[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]]

複数の配列の箱を用意して順列を構築するようなイメージ。

> [1,2,3].product([4,5,6])
# => [[1, 4], [1, 5], [1, 6], [2, 4], [2, 5], [2, 6], [3, 4], [3, 5], [3, 6]]
> [1,2,3].product([4,5],[6,7])
# =>
# [[1, 4, 6],
#  [1, 4, 7],
#  [1, 5, 6],
#  [1, 5, 7],
#  [2, 4, 6],
#  [2, 4, 7],
#  [2, 5, 6],
#  [2, 5, 7],
#  [3, 4, 6],
#  [3, 4, 7],
#  [3, 5, 6],
#  [3, 5, 7]]

番外編

それぞれの箱から一個ずつ取る、という場合は Array#zip が使える。

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

[1,2,3].zip([4,5,6], [7,8])
# => [[1, 4, 7], [2, 5, 8], [3, 6, nil]]
[1,2].zip([:a,:b,:c], [:A,:B,:C,:D])
# => [[1, :a, :A], [2, :b, :B]]

参考