Hatena::Grouprubyist

Rubyで遊ぶよ

 | 

2009-04-16

PermutationとCombination

06:10

Ruby 1.9の Permutation と Combination のことがふと気になったので、ついに Ruby 1.9.1 を make してみた。

% /usr/local/ruby1.9/bin/irb   
irb(main):001:0> [1,2,3].permutation.to_a
=> [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
irb(main):002:0> [1,2,1].permutation.to_a
=> [[1, 2, 1], [1, 1, 2], [2, 1, 1], [2, 1, 1], [1, 1, 2], [1, 2, 1]]
irb(main):003:0> [1,2,1].permutation(2).to_a
=> [[1, 2], [1, 1], [2, 1], [2, 1], [1, 1], [1, 2]]
irb(main):004:0> [1,2,1].permutation(3).to_a
=> [[1, 2, 1], [1, 1, 2], [2, 1, 1], [2, 1, 1], [1, 1, 2], [1, 2, 1]]
irb(main):005:0> [1,2,3].combination.to_a
ArgumentError: wrong number of arguments(0 for 1)
	from (irb):5:in `combination'
	from (irb):5
	from /usr/local/ruby1.9/bin/irb:12:in `<main>'
irb(main):006:0> [1,2,3].combination(2).to_a
=> [[1, 2], [1, 3], [2, 3]]
irb(main):007:0> [1,2,1].combination(2).to_a
=> [[1, 2], [1, 1], [2, 1]]
irb(main):008:0> [1,2,1].combination(3).to_a
=> [[1, 2, 1]]
irb(main):009:0> 

permutation も combination も、元から重複のある配列の重複を除いてくれたりはしない。

permutation は引数を渡さないと勝手に配列の長さと解釈されるが、combination のほうは引数がないとエラー。これはどうにも納得がいかない。ちゃんと挙動を揃えてほしい。

これだけのことが知りたかっただけなのに、Google さんは答えてくれませんでした。


 * Examples:
 *
 *     a = [1, 2, 3]
 *     a.permutation.to_a     #=> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
 *     a.permutation(1).to_a  #=> [[1],[2],[3]]
 *     a.permutation(2).to_a  #=> [[1,2],[1,3],[2,1],[2,3],[3,1],[3,2]]
 *     a.permutation(3).to_a  #=> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
 *     a.permutation(0).to_a  #=> [[]] # one permutation of length 0
 *     a.permutation(4).to_a  #=> []   # no permutations of length 4
permutation (Array)
 * Examples:
 *
 *     a = [1, 2, 3, 4]
 *     a.combination(1).to_a  #=> [[1],[2],[3],[4]]
 *     a.combination(2).to_a  #=> [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]
 *     a.combination(3).to_a  #=> [[1,2,3],[1,2,4],[1,3,4],[2,3,4]]
 *     a.combination(4).to_a  #=> [[1,2,3,4]]
 *     a.combination(0).to_a  #=> [[]] # one combination of length 0
 *     a.combination(5).to_a  #=> []   # no combinations of length 5
combination (Array)

結局やりたかったのはこれでした。

 |