permutations_iter.sf 442 B

123456789101112131415161718192021222324
  1. #!/usr/bin/ruby
  2. func permutations(callback, arr) {
  3. var end = arr.end;
  4. var idx = arr.indices;
  5. loop {
  6. callback([arr[idx]]);
  7. var p = end;
  8. while (idx[p-1] > idx[p]) {p--};
  9. p == 0 && return();
  10. var d = p;
  11. idx += idx.splice(p).reverse;
  12. while (idx[p-1] > idx[d]) {d++};
  13. idx[p-1, d] = idx[d, p-1];
  14. }
  15. }
  16. var list = [1,2,3];
  17. permutations({|set| say set.join }, list);