ruby-changes:2474
From: ko1@a...
Date: 19 Nov 2007 16:06:23 +0900
Subject: [ruby-changes:2474] matz - Ruby:r13965 (trunk): * array.c (rb_ary_permutation): gives all permutations of elements
matz 2007-11-19 16:06:03 +0900 (Mon, 19 Nov 2007) New Revision: 13965 Modified files: trunk/ChangeLog trunk/array.c Log: * array.c (rb_ary_permutation): gives all permutations of elements if no argument given. a patch from Yusuke ENDOH <mame AT tsg.ne.jp>. [ruby-dev:32309] http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/array.c?r1=13965&r2=13964 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=13965&r2=13964 Index: array.c =================================================================== --- array.c (revision 13964) +++ array.c (revision 13965) @@ -3001,11 +3001,14 @@ /* * 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 <i>n</i> * of the elements of <i>ary</i>, then return the array itself. + * If <i>n</i> 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 @@ * * 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 @@ */ 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 @@ 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); Index: ChangeLog =================================================================== --- ChangeLog (revision 13964) +++ ChangeLog (revision 13965) @@ -1,3 +1,9 @@ +Mon Nov 19 16:04:08 2007 Yukihiro Matsumoto <matz@r...> + + * array.c (rb_ary_permutation): gives all permutations of elements + if no argument given. a patch from Yusuke ENDOH <mame AT tsg.ne.jp>. + [ruby-dev:32309] + Mon Nov 19 02:44:07 2007 Nobuyoshi Nakada <nobu@r...> * compile.c (iseq_compile_each): alias and undef accept dsyms as well -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml