зеркало из https://github.com/github/ruby.git
* 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] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13965 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
126bd20141
Коммит
03c4e447fa
|
@ -1,3 +1,9 @@
|
|||
Mon Nov 19 16:04:08 2007 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* 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@ruby-lang.org>
|
||||
|
||||
* compile.c (iseq_compile_each): alias and undef accept dsyms as well
|
||||
|
|
16
array.c
16
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 <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 @@ 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);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче