Here's my solution.
It's not brief but works anyway.
-------------------------------------------
class PascalTriangle
include Enumerable
attr_reader :rows
def initialize row_count
raise ArgumentException unless row_count.class == Fixnum
raise "row_count must be greater than 0." unless row_count > 0
@row_count = row_count
generate_rows
end
def to_s
max_width = @rows.flatten.max.to_s.size
max_count = @rows.map{ |i| i.size }.max
line_width = max_count * max_width * 2 - max_width
separator = " " * max_width
self.map do |row|
row.map { |num| num.to_s.center(max_width)
}.join(separator).center(line_width)
end.join("\n")
end
def each
@rows.each { |row| yield row }
end
private
def generate_rows
row = []
@rows = (0...@row_count).to_a.inject([]) do |m, i|
m << row = generate_row(row)
end
@rows.freeze
@rows.each { |r| r.freeze }
end
def generate_row row
result = [1]
row.each_with_index do |el, idx|
result << (idx == row.size - 1 ? 1 : el + row[idx + 1])
end
result
end
end
if ARGV[0].nil? or ARGV[0] !~ /^\d+$/
puts "Example: ruby pascal.rb 10"
exit
end
row_count = ARGV[0].to_i
puts PascalTriangle.new(row_count).to_s
-----------------------
Sam Kong
--
Posted via http://www.ruby-forum.com/.