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/