Fix for JRUBY-2882. Handle error messages related to constructors better
[jruby.git] / bench / yarv / bm_so_pidigits.rb
blobacffe71ae78a3d53fcfa63d79b6f450cdfd2ebf9
1 # The Great Computer Language Shootout\r
2 # http://shootout.alioth.debian.org/\r
3 #\r
4 # contributed by Gabriele Renzi\r
5 \r
6 class PiDigitSpigot\r
7 \r
8     def initialize()\r
9         @z = Transformation.new 1,0,0,1\r
10         @x = Transformation.new 0,0,0,0\r
11         @inverse = Transformation.new 0,0,0,0\r
12     end\r
14     def next!\r
15         @y = @z.extract(3)\r
16         if safe? @y\r
17             @z = produce(@y)\r
18             @y\r
19         else\r
20             @z = consume @x.next!()\r
21             next!()\r
22         end\r
23     end\r
25     def safe?(digit)\r
26         digit == @z.extract(4)\r
27     end\r
29     def produce(i)\r
30         @inverse.qrst(10,-10*i,0,1).compose(@z)\r
31     end\r
33     def consume(a)\r
34         @z.compose(a)\r
35     end\r
36 end\r
39 class Transformation\r
40     attr_reader :q, :r, :s, :t\r
41     def initialize (q, r, s, t)\r
42         @q,@r,@s,@t,@k = q,r,s,t,0\r
43     end\r
45     def next!()\r
46         @q = @k = @k + 1\r
47         @r = 4 * @k + 2\r
48         @s = 0\r
49         @t = 2 * @k + 1\r
50         self\r
51     end\r
53     def extract(j)\r
54         (@q * j + @r) / (@s * j + @t)\r
55     end\r
57     def compose(a)\r
58         self.class.new( @q * a.q,\r
59                         @q * a.r + r * a.t,\r
60                         @s * a.q + t * a.s,\r
61                         @s * a.r + t * a.t\r
62                     )\r
63     end\r
65     def qrst *args\r
66         initialize *args\r
67         self\r
68     end\r
71 end\r
74 WIDTH = 10\r
75 n = 2_500 # Integer(ARGV[0])\r
76 j = 0\r
78 digits = PiDigitSpigot.new\r
80 while n > 0\r
81     if n >= WIDTH\r
82         WIDTH.times {print digits.next!}\r
83         j += WIDTH\r
84     else\r
85         n.times {print digits.next!}\r
86         (WIDTH-n).times {print " "}\r
87         j += n\r
88     end\r
89     puts "\t:"+j.to_s\r
90     n -= WIDTH\r
91 end\r