From: "mame (Yusuke Endoh)" Date: 2012-11-20T21:40:51+09:00 Subject: [ruby-core:49713] [ruby-trunk - Feature #4907] enumerable#permutation and combination Issue #4907 has been updated by mame (Yusuke Endoh). Priority changed from Normal to Low Target version set to next minor This will not work for an enumerator created from IO. -- Yusuke Endoh ---------------------------------------- Feature #4907: enumerable#permutation and combination https://bugs.ruby-lang.org/issues/4907#change-33240 Author: neleai (Ondrej Bilka) Status: Assigned Priority: Low Assignee: mrkn (Kenta Murata) Category: Target version: next minor Hello Methods permutation and combination are defined for array but it make more sense to define them for enumerable. Here is sample implementation which for simplicity works only with blocks. Note that implementation works lazily. It changes traversal order but documentation states that order is unspecified. module Enumerable def perm(n) comb(n){|ary| ary.permutation{|p| yield(p)} } end def comb(n,&m) ary=[] e=to_enum.with_index _comb(e,n-1,1.0/0.0,ary,m) end def _comb(e,n,bound,ary,m) e.each{|el,i| return if i>=bound ary[n]=el if n==0 m.call(ary) else _comb(e,n-1,i,ary,m) end } end end [1,2,4,3,5].comb(2){|a| puts a.inspect} (1..4).comb(2){|a| puts a.inspect} (1..4).perm(2){|a| puts a.inspect} -- http://bugs.ruby-lang.org/