```"Suraj N. Kurapati" <skurapat / ucsc.edu> writes:

> Daniel Martin wrote:
>> I'm a little bit surprised at the paucity of solutions based around
>> sprintf-format strings.
>
> Same here. So far I have seen only two solutions, including mine,
> which use sprintf-format strings.

So here's one more addition to the sprintf-formatted solution pool:

#!ruby
# solution to Ruby quiz #84

# lnnb stands for "ln of n-bang"
# value is from Stirling's approximation
def lnnb(n);
n*Math.log(n)-n+Math.log(2*n*Math::PI)/2 + 1/(12*n) - 1/(360*n*n*n);
end

# how many digits in the largest number in row "n"
# where the rows get counted from 0
def npasdig(n)
return 1 if (n < 5)
nh = n/2
((lnnb(n)-lnnb(nh)-lnnb(n-nh))/Math.log(10)).ceil
end

def pp_pascal(n)
width = npasdig(n-1)
fmt = "%#{width}s" * (2*n-1)
row = [0] * (n-1) + [1] + [0] * n
while true do
puts(fmt % row.map{|a|if a==0 then "" else a end})
return if row[0] > 0
row = row[1,2*n].zip([0]+row).map{|a,b|a+b}+[0]
end
end

if __FILE__ == \$0
n = 4
n = ARGV[0].to_i if ARGV[0]
pp_pascal(n)
end

```