[#12312] Need Japanese Help - VRuby & new One-Click Ruby Installer with patch 110 — "Curt Hibbs" <curt.hibbs@...>
I'm trying to build a new release of the One-Click Ruby Installer for
Hello,
Hello,
[#12328] Dir.chdir patch for MS Windows — "Berger, Daniel" <Daniel.Berger@...>
Hi,
[#12344] patch to implement Array.permutation — David Flanagan <david@...>
Hi,
[#12372] Release compatibility/train — Prashant Srinivasan <Prashant.Srinivasan@...>
Hello all,
Hi,
Yukihiro Matsumoto wrote:
Hi,
Yukihiro Matsumoto wrote:
Hi,
Yukihiro Matsumoto wrote:
Hi,
Hi --
On 10/3/07, David A. Black <dblack@rubypal.com> wrote:
Rick DeNatale wrote:
[#12383] Include Rake in Ruby 1.9 — "NAKAMURA, Hiroshi" <nakahiro@...>
-----BEGIN PGP SIGNED MESSAGE-----
On 10/3/07, NAKAMURA, Hiroshi <nakahiro@sarion.co.jp> wrote:
On Oct 3, 2007, at 08:59 , Jacob Fugal wrote:
-----BEGIN PGP SIGNED MESSAGE-----
On 10/15/07, NAKAMURA, Hiroshi <nakahiro@sarion.co.jp> wrote:
[#12539] Ordered Hashes in 1.9? — Michael Neumann <mneumann@...>
Hi all,
Hi,
Yukihiro Matsumoto wrote:
[#12568] $" and require — "Tim Morgan" <tmorgan99@...>
Hello!
[#12578] Possible memory leak in ruby-1.8.6-p110?? — "M. Edward (Ed) Borasky" <znmeb@...>
I haven't had a chance to narrow this down in enough detail yet, but
M. Edward (Ed) Borasky wrote:
On Thu, 11 Oct 2007, M. Edward (Ed) Borasky wrote:
[#12579] iconv enhancement in Ruby 1.9 — "Eugene Ossintsev" <eugoss@...>
Hi,
[#12587] Confusion about arities — Charles Oliver Nutter <charles.nutter@...>
It seems like a number of methods have unexpected arities. For example,
On Oct 10, 2007, at 22:44 , Charles Oliver Nutter wrote:
Eric Hodel wrote:
[#12588] MatchData#select rdoc and arity incorrect — Charles Oliver Nutter <charles.nutter@...>
Rdoc is here:
[#12617] Question about heap_slots in gc.c — Hongli Lai <h.lai@...>
I'm trying to modify the Ruby interpreter's garbage collector. At the
[#12618] StringIO is not IO? — Hongli Lai <h.lai@...>
According to irb,
[#12629] file encoding comments and a patch to parse.y — David Flanagan <david@...>
Matz, Nobu:
[#12632] Defining unicode methods — "Daniel Berger" <djberg96@...>
Hi all,
[#12670] Bug in Numeric#divmod — "Dirk Traulsen" <dirk.traulsen@...>
Hi all!
[#12681] Unicode: Progress? — murphy <murphy@...>
Hello!
murphy schrieb:
Hi,
Yukihiro Matsumoto wrote:
[#12693] retry: revised 1.9 http patch — Hugh Sasse <hgs@...>
I'm reposting this because I've had little response to this version
On Tue, Oct 16, 2007 at 01:32:42AM +0900, Hugh Sasse wrote:
Would this require that zlib be installed? I know that it's possible to
On Wed, 31 Oct 2007, Roger Pack wrote:
-----BEGIN PGP SIGNED MESSAGE-----
[#12697] Range.first is incompatible with Enumerable.first — David Flanagan <david@...>
The new Enumerable.first method is a generalization of Array.first to
Hi,
[#12703] Long encoding names with -K and bad error message — David Flanagan <david@...>
I noticed the following line in the change log:
Hi,
Nobuyoshi Nakada wrote:
Nobu,
At 16:04 07/10/17, David Flanagan wrote:
[#12706] Re: A couple of bugs? — "Gavin Kistner" <gavin.kistner@...>
From: John Lam (DLR) [mailto:jflam@microsoft.com]=20
On Wed, Oct 17, 2007 at 03:10:07AM +0900, Gavin Kistner wrote:
Well, that's interesting. Then this seems to be the only assignment that ha=
[#12710] enum.c patch: fixes Enumerable.cycle and rdoc bugs — David Flanagan <david@...>
The attached patch fixes:
Hi,
[#12714] Re: A couple of bugs? — "Gavin Kistner" <gavin.kistner@...>
> Well, that's interesting. Then this seems to be the only=20
[#12754] Improving 'syntax error, unexpected $end, expecting kEND'? — Hugh Sasse <hgs@...>
I've had a look at this, but can't see how to do it: When I get
On Fri, Oct 19, 2007 at 03:01:55AM +0900, Hugh Sasse wrote:
The patch below changes this message to:
At 04:15 07/10/24, David Flanagan wrote:
Thanks for filling these in Martin. I worry that this is such a simple
At 16:57 07/10/24, David Flanagan wrote:
Martin Duerst schrieb:
Hi,
[#12758] Encoding::primary_encoding — David Flanagan <david@...>
Hi,
Hi,
Nobuyoshi Nakada schrieb:
Hi,
Nobuyoshi Nakada schrieb:
Hi,
Nobuyoshi Nakada schrieb:
T24gMjIvMTAvMjAwNywgV29sZmdhbmcgTsOhZGFzaS1Eb25uZXIgPGVkLm9kYW5vd0B3b25hZG8u
Michal Suchanek schrieb:
Hi,
Nobuyoshi Nakada schrieb:
I made some tests with UFT-8, option "-Ku", option "-Ka" and both types of magic
[#12767] \u escapes in string literals: proof of concept implementation — David Flanagan <david@...>
Back at the end of August, Matz wrote (see
Hi,
Nobuyoshi Nakada wrote:
Hi,
Yukihiro Matsumoto wrote:
At 04:19 07/10/23, David Flanagan wrote:
Martin Duerst wrote:
Hi,
At 13:10 07/10/23, David Flanagan wrote:
Martin Duerst wrote:
Hi,
Yukihiro Matsumoto wrote:
Hi,
Nobuyoshi Nakada wrote:
Hi,
At 16:46 07/10/29, Nobuyoshi Nakada wrote:
Hi,
At 11:29 07/11/06, Nobuyoshi Nakada wrote:
Hi,
Yukihiro Matsumoto wrote:
[#12787] How to specify in Ruby 1.9 the expected file encoding — =?ISO-8859-15?Q?Wolfgang_N=E1dasi-Donner?= <ed.odanow@...>
Dear Ruby developers!
Wolfgang N疆asi-Donner wrote:
Gonzalo Garramu schrieb:
Hi,
Yukihiro Matsumoto schrieb:
I wouldn't want a program to write a BOM at the start of a file
[#12795] patch for String.concat — David Flanagan <david@...>
I don't think that String.<< currently handles appending codepoints
[#12825] clarification of ruby libraries installation paths? — Lucas Nussbaum <lucas@...>
Hi,
On Mon, Oct 22, 2007, Lucas Nussbaum wrote:
On 23/10/07 at 00:13 +0900, Ben Bleything wrote:
On 10/22/07, Lucas Nussbaum <lucas@lucas-nussbaum.net> wrote:
On 23/10/07 at 01:55 +0900, Austin Ziegler wrote:
Lucas Nussbaum wrote:
On 24/10/07 at 05:14 +0900, Gonzalo Garramu wrote:
Lucas Nussbaum wrote:
On 30/10/07 at 07:28 +0900, Gonzalo Garramu wrote:
On 10/29/07, Lucas Nussbaum <lucas@lucas-nussbaum.net> wrote:
Austin Ziegler wrote:
On 10/30/07, Mathieu Blondel <mblondel@rubyforge.org> wrote:
On Tue, Oct 23, 2007 at 01:55:29AM +0900, Austin Ziegler wrote:
On 10/22/07, Sam Roberts <sroberts@uniserve.com> wrote:
Austin Ziegler wrote:
On 10/28/07, Bob Proulx <bob@proulx.com> wrote:
Austin,
On 10/29/07, Lucas Nussbaum <lucas@lucas-nussbaum.net> wrote:
On 10/29/07, Luis Lavena <luislavena@gmail.com> wrote:
On 10/30/07, Austin Ziegler <halostatue@gmail.com> wrote:
Do we think that maybe, just maybe, things went off the rails when the
On 10/30/07, Rick Bradley <rick@rickbradley.com> wrote:
On Tue, 30 Oct 2007 22:52:29 +0900, "Luis Lavena" <luislavena@gmail.com> wrote:
[#12849] Problem reported in Rdoc (Ruby 1.9) Rdoc for Ruby 1.8 works — =?ISO-8859-15?Q?Wolfgang_N=E1dasi-Donner?= <ed.odanow@...>
Hi!
[#12867] constant lookup rules in 1.9 — David Flanagan <david@...>
Hi,
[#12895] OSX patches — "Laurent Sansonetti" <laurent.sansonetti@...>
Hi ruby-core,
[#12900] Hopefully Complete List of Possible Encoding Specifications - Existing Ones — Wolfgang Nádasi-Donner <ed.odanow@...>
Dear Ruby 1.9 architects, developers, and testers!
Hi,
Yukihiro Matsumoto schrieb:
Hi,
Yukihiro Matsumoto schrieb:
I have a (hopefully) final question before testing all
Hi,
Wolfgang N叩dasi-Donner wrote:
David Flanagan schrieb:
At 10:30 07/10/26, Nobuyoshi Nakada wrote:
Yukihiro Matsumoto wrote:
On 10/25/07, Yukihiro Matsumoto <matz@ruby-lang.org> wrote:
[#12951] Fluent programming in Ruby — David Flanagan <david@...>
From the ChangeLog:
At 14:01 07/10/26, David Flanagan wrote:
Martin Duerst schrieb:
[#12971] Re: Fluent programming in Ruby — Brent Roman <brent@...>
I suppose you could have irb require a terminating ';'
> -----Original Message-----
On 10/26/07, Berger, Daniel <Daniel.Berger@qwest.com> wrote:
[#12996] General hash keys for colon notation — murphy <murphy@...>
Dear language designer(s) and parser wizards,
On 10/28/07, murphy <murphy@rubychan.de> wrote:
On 10/28/07, Rick DeNatale <rick.denatale@gmail.com> wrote:
Rick DeNatale wrote:
[#13027] Implementation of "guessUTF" method - final questions — Wolfgang Nádasi-Donner <ed.odanow@...>
Dear Ruby designers, developers, and testers!
On 10/29/07, Wolfgang N=E1dasi-Donner <ed.odanow@wonado.de> wrote:
Nikolai Weibull schrieb:
On 10/29/07, Wolfgang N=E1dasi-Donner <ed.odanow@wonado.de> wrote:
Nikolai Weibull schrieb:
Hello Wolfgang,
At 17:50 07/10/29, Nikolai Weibull wrote:
On 10/29/07, Martin Duerst <duerst@it.aoyama.ac.jp> wrote:
[#13069] new Enumerable.butfirst method — David Flanagan <david@...>
Matz,
Hi,
Yukihiro Matsumoto wrote:
Hi,
[#13083] Didn't find String#subseq — Wolfgang Nádasi-Donner <ed.odanow@...>
Hi!
[#13096] 1.8.6 gc.c thoughts — "Roger Pack" <rogerpack2005@...>
After examining how the 1.8.6 gc works, I had a few thoughts:
[#13107] %s and utf8 ? — hadmut@... (Hadmut Danisch)
Hi,
[#13135] patch for lib/net/http.rb, self['User-Agent'] ||= 'Ruby' — Stephen Bannasch <stephen.bannasch@...>
I posted this patch before in the middle of another thread and didn't
Hi Stephen,
In article <9079DC13-476F-4C12-922E-E197BD5AAA5C@loveruby.net>,
[#13139] Required Space for Unicode Character Attribute Tables — Wolfgang Nádasi-Donner <ed.odanow@...>
Hi!
[#13143] Two Issues (open-uri's respond_to? and autoload's require) — Trans <transfire@...>
Hi--
-----BEGIN PGP SIGNED MESSAGE-----
patch to implement Array.permutation
Hi, The attached patch implements Array.permutation. Matz's change log when he checked in the stub for this method invited volunteers to implement it, so I've taken a stab at it. This is my first non-trivial patch, and its been a long time since I did any serious C coding, so please check my code. This patch also includes an update to the documentation for Array.permutation and Array.combination. And a minor change to Array.combination: combination(0) was yielding nothing rather than yielding the single value 0. Also, I've added a test case to test/ruby/test_array.c David
Attachments (1)
Index: array.c
===================================================================
--- array.c (revision 13588)
+++ array.c (working copy)
@@ -2954,37 +2954,95 @@
return Qnil;
}
-static long
-perm_len(long n, long k)
-{
- long i, val = 1;
+/*
+ * Recursively compute permutations of r elements of the set [0..n-1].
+ * When we have a complete permutation of array indexes, copy the values
+ * at those indexes into a new array and yield that array.
+ *
+ * n: the size of the set
+ * r: the number of elements in each permutation
+ * p: the array (of size r) that we're filling in
+ * index: what index we're filling in now
+ * used: an array of booleans: whether a given index is already used
+ * values: the Ruby array that holds the actual values to permute
+ */
+static void
+permute0(long n, long r, long p[], long index, int used[], VALUE values) {
+ long i,j;
+ for(i = 0; i < n; i++) {
+ if (used[i] == 0) {
+ p[index] = i;
+ if (index < r-1) { /* if not done yet */
+ used[i] = 1; /* mark index used */
+ permute0(n,r,p,index+1, /* recurse */
+ used, values);
+ used[i] = 0; /* index unused */
+ }
+ else {
+ /* We have a complete permutation of array indexes */
+ /* Build a ruby array of the corresponding values */
+ /* And yield it to the associated block */
+ VALUE result = rb_ary_new2(r);
+ VALUE *result_array = RARRAY_PTR(result);
+ VALUE *values_array = RARRAY_PTR(values);
- while (n > k) {
- val *= n--;
+ for(j = 0; j < r; j++) result_array[j] = values_array[p[j]];
+ RARRAY(result)->len = r;
+ rb_yield(result);
+ }
+ }
}
- return val;
}
/*
* call-seq:
- * ary.permutation(n)
+ * ary.permutation(n) { |p| block } -> array
+ * ary.permutation(n) -> enumerator
*
- * Returns an array of all permutations of length <i>n</i> of
- * elements from <i>ary</i>].
- *
+ * 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.
+ * The implementation makes no guarantees about the order in which
+ * the permutations are yielded.
+ *
+ * When invoked without a block, return an enumerator object instead.
+ *
+ * Examples:
* a = [1, 2, 3]
- * a.permutation(0).to_a #=> []
* 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]]
- * a.permutation(4).to_a #=> []
- *
+ * a.permutation(0).to_a #=> [[]]: one permutation of length 0
+ * a.permutation(4).to_a #=> [] : no permutations of length 4
*/
static VALUE
rb_ary_permutation(VALUE ary, VALUE num)
{
- /* TBD */
+ RETURN_ENUMERATOR(ary, 1, &num); /* Return enumerator if no block */
+ long r = NUM2LONG(num); /* Permutation size from argument */
+ long n = RARRAY_LEN(ary); /* Array length */
+ long i;
+
+ if (r < 0 || n < r) {
+ /* no permutations: yield nothing */
+ }
+ else if (r == 0) { /* exactly one permutation: the zero-length array */
+ rb_yield(rb_ary_new2(0));
+ }
+ else if (r == 1) { /* this is a special, easy case */
+ for (i = 0; i < RARRAY_LEN(ary); i++) {
+ rb_yield(rb_ary_new3(1, RARRAY_PTR(ary)[i]));
+ }
+ }
+ else { /* this is the general case */
+ ary = rb_ary_dup(ary); /* private defensive copy of ary */
+ long p[r]; /* array indexes of current permutation */
+ int used[n]; /* booleans: which indexes are already used */
+ for(i = 0; i < n; i++) used[i] = 0; /* initialize array */
+
+ permute0(n,r,p,0,used,ary); /* compute and yield permutations */
+ }
+ return ary;
}
static long
@@ -3005,18 +3063,24 @@
/*
* call-seq:
- * ary.combination(n)
+ * ary.combination(n) { |c| block } -> ary
+ * ary.combination(n) -> enumerator
*
- * Returns an enumerator of all combinations of length <i>n</i> of
- * elements from <i>ary</i>].
+ * When invoked with a block, yields all combinations of length <i>n</i>
+ * of elements from <i>ary</i> and then returns <i>ary</i> itself.
+ * The implementation makes no guarantees about the order in which
+ * the combinations are yielded.
+ *
+ * When invoked without a block, returns an enumerator object instead.
*
+ * Examples:
* a = [1, 2, 3, 4]
- * a.combination(0).to_a #=> []
* a.combination(1).to_a #=> [[1],[2],[3],[4]]
* a.combination(2).to_a #=> [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]
* a.combination(3).to_a #=> [[1,2,3],[1,2,4],[1,3,4],[2,3,4]]
* a.combination(4).to_a #=> [[1,2,3,4]]
- * a.combination(5).to_a #=> []
+ * a.combination(0).to_a #=> [[]]: one combination of length 0
+ * a.combination(5).to_a #=> [] : no combinations of length 5
*
*/
@@ -3028,10 +3092,10 @@
RETURN_ENUMERATOR(ary, 1, &num);
n = NUM2LONG(num);
len = RARRAY_LEN(ary);
- if (len < n) {
+ if (n < 0 || len < n) {
/* yield nothing */
}
- else if (n <= 0) {
+ else if (n == 0) {
rb_yield(rb_ary_new2(0));
}
else if (n == 1) {
@@ -3187,7 +3251,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: test/ruby/test_array.rb
===================================================================
--- test/ruby/test_array.rb (revision 13588)
+++ test/ruby/test_array.rb (working copy)
@@ -1199,4 +1199,20 @@
@cls[1,2,3].product([4,5]))
assert_equal(@cls[[1,1],[1,2],[2,1],[2,2]], @cls[1,2].product([1,2]))
end
+
+ def test_permutation
+ a = @cls[1,2,3]
+ assert_equal(@cls[[]], a.permutation(0).to_a)
+ assert_equal(@cls[[1],[2],[3]], a.permutation(1).to_a.sort)
+ assert_equal(@cls[[1,2],[1,3],[2,1],[2,3],[3,1],[3,2]],
+ a.permutation(2).to_a.sort)
+ assert_equal(@cls[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]],
+ a.permutation(3).sort.to_a)
+ assert_equal(@cls[], a.permutation(4).to_a)
+ assert_equal(@cls[], a.permutation(-1).to_a)
+ assert_equal("abcde".each_char.to_a.permutation(5).sort,
+ "edcba".each_char.to_a.permutation(5).sort)
+ assert_equal(@cls[].permutation(0).to_a, @cls[[]])
+
+ end
end