[前][次][番号順一覧][スレッド一覧]

ruby-changes:4168

From: ko1@a...
Date: Sat, 1 Mar 2008 13:12:28 +0900 (JST)
Subject: [ruby-changes:4168] akr - Ruby:r15658 (trunk): * test/ruby/allpairs.rb: new file for all pairs method.

akr	2008-03-01 13:12:13 +0900 (Sat, 01 Mar 2008)

  New Revision: 15658

  Added files:
    trunk/test/ruby/allpairs.rb
  Modified files:
    trunk/ChangeLog
    trunk/test/ruby/test_m17n_comb.rb
    trunk/test/ruby/test_sprintf_comb.rb

  Log:
    * test/ruby/allpairs.rb: new file for all pairs method.
    
    * test/ruby/test_m17n_comb.rb: use allpairs.rb to reduce test cases.
    
    * test/ruby/test_sprintf_comb.rb: ditto.
    


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/test_m17n_comb.rb?r1=15658&r2=15657&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15658&r2=15657&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/allpairs.rb?revision=15658&view=markup
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/allpairs.rb?r1=15658&r2=15657&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/test_sprintf_comb.rb?r1=15658&r2=15657&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 15657)
+++ ChangeLog	(revision 15658)
@@ -1,3 +1,11 @@
+Sat Mar  1 13:11:03 2008  Tanaka Akira  <akr@f...>
+
+	* test/ruby/allpairs.rb: new file for all pairs method.
+
+	* test/ruby/test_m17n_comb.rb: use allpairs.rb to reduce test cases.
+
+	* test/ruby/test_sprintf_comb.rb: ditto.
+
 Sat Mar  1 12:34:21 2008  Yukihiro Matsumoto  <matz@r...>
 
 	* string.c (sym_inspect): use rb_str_inspect() instead of
Index: test/ruby/test_m17n_comb.rb
===================================================================
--- test/ruby/test_m17n_comb.rb	(revision 15657)
+++ test/ruby/test_m17n_comb.rb	(revision 15658)
@@ -1,5 +1,7 @@
 require 'test/unit'
 require 'stringio'
+require 'require_relative'
+require_relative 'allpairs'
 
 class TestM17NComb < Test::Unit::TestCase
   def assert_encoding(encname, actual, message=nil)
@@ -113,20 +115,8 @@
     #"aaa".force_encoding("utf-32be"),
   ]
 
-  def combination(*args)
-    args = args.map {|a| a.to_a }
-    i = 0
-    while true
-      n = i
-      as = []
-      args.reverse_each {|a|
-        n, m = n.divmod(a.length)
-        as.unshift a[m]
-      }
-      break if 0 < n
-      yield as
-      i += 1
-    end
+  def combination(*args, &b)
+    AllPairs.each(*args, &b)
   end
 
   def encdump(str)
Index: test/ruby/test_sprintf_comb.rb
===================================================================
--- test/ruby/test_sprintf_comb.rb	(revision 15657)
+++ test/ruby/test_sprintf_comb.rb	(revision 15658)
@@ -1,4 +1,6 @@
 require 'test/unit'
+require 'require_relative'
+require_relative 'allpairs'
 
 class TestSprintfComb < Test::Unit::TestCase
   VS = [
@@ -106,20 +108,8 @@
   ]
   VS.reverse!
 
-  def combination(*args)
-    args = args.map {|a| a.to_a }
-    i = 0
-    while true
-      n = i
-      as = []
-      args.reverse_each {|a|
-        n, m = n.divmod(a.length)
-        as.unshift a[m]
-      }
-      break if 0 < n
-      yield as
-      i += 1
-    end
+  def combination(*args, &b)
+    AllPairs.each(*args, &b)
   end
 
   def emu(format, v)
Index: test/ruby/allpairs.rb
===================================================================
--- test/ruby/allpairs.rb	(revision 0)
+++ test/ruby/allpairs.rb	(revision 15658)
@@ -0,0 +1,103 @@
+module AllPairs
+  module_function
+
+  def make_prime(v)
+    return 2 if v < 2
+    ary = [true] * (v*2)
+    2.upto(Math.sqrt(ary.length).ceil) {|i|
+      return i if ary[i] && v <= i
+      (i*2).step(ary.length, i) {|j|
+        ary[j] = false
+      }
+    }
+    v.upto(ary.length-1) {|i|
+      return i if ary[i]
+    }
+    raise "[bug] prime not found greater than #{v}"
+  end
+
+  def make_basic_block(prime)
+    prime.times {|i|
+      prime.times {|j|
+        row = [i]
+        0.upto(prime-1) {|m|
+          row << (i*m + j) % prime
+        }
+        yield row
+      }
+    }
+  end 
+
+  def combine_block(tbl1, tbl2)
+    result = []
+    tbl2.each {|row|
+      result << row * tbl1.first.length
+    }
+    tbl1.each_with_index {|row, k|
+      next if k == 0
+      result << row.map {|i| [i] * tbl2.first.length }.flatten
+    }
+    result
+  end
+
+  def make_large_block(v, prime)
+    if prime <= v+1
+      make_basic_block(v) {|row|
+        yield row
+      }
+    else
+      tbl = []
+      make_basic_block(v) {|row|
+        tbl << row
+      } 
+      tbls = [tbl]
+      while tbl.first.length ** 2 < prime
+        tbl = combine_block(tbl, tbl)
+        tbls << tbl
+      end
+      tbl1 = tbls.find {|t| prime <= t.first.length * tbl.first.length }
+      tbl = combine_block(tbl, tbl1)
+      tbl.each {|row|
+        yield row
+      }
+    end
+  end
+
+  def each_index(*vs)
+    n = vs.length
+    max_v = vs.max
+    prime = make_prime(max_v)
+    h = {}
+    make_large_block(max_v, n) {|row|
+      row = vs.zip(row).map {|v, i| i % v }
+      next if h[row]
+      h[row] = true
+      yield row
+    }
+  end
+
+  # generate all pairs test.
+  def each(*args)
+    args.map! {|a| a.to_a }
+    each_index(*args.map {|a| a.length}) {|is|
+      yield is.zip(args).map {|i, a| a[i] }
+    }
+  end
+
+  # generate all combination in cartesian product.  (not all-pairs test)
+  def exhaustive_each(*args)
+    args = args.map {|a| a.to_a }
+    i = 0
+    while true
+      n = i
+      as = []
+      args.reverse_each {|a|
+        n, m = n.divmod(a.length)
+        as.unshift a[m]
+      }
+      break if 0 < n
+      yield as
+      i += 1
+    end
+  end
+end

Property changes on: test/ruby/allpairs.rb
___________________________________________________________________
Name: svn:eol-style
   + LF


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]