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/