2022-03-22 Ruby で組み合わせ(combination, permutation, product, zip)
組み合わせ
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]]