Skip to content

Instantly share code, notes, and snippets.

@epitron
Created December 9, 2015 09:05
Show Gist options
  • Save epitron/ee8a999caa0713108194 to your computer and use it in GitHub Desktop.
Save epitron/ee8a999caa0713108194 to your computer and use it in GitHub Desktop.
require 'pp'
class Array
def perms
return to_enum(:perms) unless block_given?
if size <= 1
yield self
else
for i in 0...size
e = self[i]
left = self[0...i]
right = self[i+1..-1]
p i: i, e: e, self: self, left: left, right: right
left.perms.each do |lperm|
right.perms.each do |rperm|
yield [e, *lperm, *rperm]
end
end
end
end
end
end
a = [1,2,3]
p1 = a.perms.sort
p2 = a.permutation(a.size).sort
pp p1size: p1.size, p2size: p2.size
pp both: p1 & p2
pp mine: p1 - p2
pp ruby: p2 - p1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment