From 03c4e447fab16864abed71b174a0636d9524b5b9 Mon Sep 17 00:00:00 2001 From: matz Date: Mon, 19 Nov 2007 07:06:03 +0000 Subject: * array.c (rb_ary_permutation): gives all permutations of elements if no argument given. a patch from Yusuke ENDOH . [ruby-dev:32309] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13965 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ array.c | 16 +++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 15d69df12a..f03870f755 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Mon Nov 19 16:04:08 2007 Yukihiro Matsumoto + + * array.c (rb_ary_permutation): gives all permutations of elements + if no argument given. a patch from Yusuke ENDOH . + [ruby-dev:32309] + Mon Nov 19 02:44:07 2007 Nobuyoshi Nakada * compile.c (iseq_compile_each): alias and undef accept dsyms as well diff --git a/array.c b/array.c index aee476a688..403d8b3c5a 100644 --- a/array.c +++ b/array.c @@ -3001,11 +3001,14 @@ permute0(long n, long r, long *p, long index, int *used, VALUE values) /* * call-seq: + * ary.permutation { |p| block } -> array + * ary.permutation -> enumerator * ary.permutation(n) { |p| block } -> array * ary.permutation(n) -> enumerator * * When invoked with a block, yield all permutations of length n * of the elements of ary, then return the array itself. + * If n is not specified, yield all permutations of all elements. * The implementation makes no guarantees about the order in which * the permutations are yielded. * @@ -3013,6 +3016,7 @@ permute0(long n, long r, long *p, long index, int *used, VALUE values) * * 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]] @@ -3021,13 +3025,15 @@ permute0(long n, long r, long *p, long index, int *used, VALUE values) */ static VALUE -rb_ary_permutation(VALUE ary, VALUE num) +rb_ary_permutation(int argc, VALUE *argv, VALUE ary) { + VALUE num; long r, n, i; - RETURN_ENUMERATOR(ary, 1, &num); /* Return enumerator if no block */ - r = NUM2LONG(num); /* Permutation size from argument */ - n = RARRAY_LEN(ary); /* Array length */ + RETURN_ENUMERATOR(ary, argc, argv); /* Return enumerator if no block */ + n = RARRAY_LEN(ary); /* Array length */ + rb_scan_args(argc, argv, "01", &num); + r = NIL_P(num) ? n : NUM2LONG(num); /* Permutation size from argument */ if (r < 0 || n < r) { /* no permutations: yield nothing */ @@ -3310,7 +3316,7 @@ Init_Array(void) rb_define_method(rb_cArray, "shuffle", rb_ary_shuffle, 0); rb_define_method(rb_cArray, "choice", rb_ary_choice, 0); rb_define_method(rb_cArray, "cycle", rb_ary_cycle, 0); - rb_define_method(rb_cArray, "permutation", rb_ary_permutation, 1); + rb_define_method(rb_cArray, "permutation", rb_ary_permutation, -1); rb_define_method(rb_cArray, "combination", rb_ary_combination, 1); rb_define_method(rb_cArray, "product", rb_ary_product, -1); -- cgit v1.2.3