Skip to content

Instantly share code, notes, and snippets.

@ahirschberg
Created April 2, 2015 21:32
Show Gist options
  • Select an option

  • Save ahirschberg/9c68738301f3aea92e07 to your computer and use it in GitHub Desktop.

Select an option

Save ahirschberg/9c68738301f3aea92e07 to your computer and use it in GitHub Desktop.
def permutations_lazy(list)
# return [list] if list.size == 1
en = Enumerator.new do |y|
if list.size == 1
# yield a new array with the list as its only element (instead of returning)
y.yield [list]
end
list.each do |locked|
puts "locking #{locked}"
list_copy = list.dup
list_copy.delete locked
permutations_lazy(list_copy).each do |permutation|
puts "permutation #{permutation}, locked #{locked}"
y.yield permutation.insert(0, locked)
end
end
end
en
end
if __FILE__ == $0
pl = permutations_lazy %w[a b c d]
pl.first(5).each {|i| p i}
end
Output:
["a", "b", "c", ["d"]]
["a", "b", "d", ["c"]]
["a", "c", "b", ["d"]]
["a", "c", "d", ["b"]]
["a", "d", "b", ["c"]]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment