def tableize(rows, &block)
      rows = rows.map(&block) if block
      widths = max_length_of_each_column(rows)
      rows.map do |row|
        row.zip(widths).map { |value, width| value.ljust(width) }.join(" ")
      end
    end
def tableize(rows, &block)
      rows = rows.map(&block) if block
      widths = max_length_of_each_column(rows)
      rows.map do |row|
        row.zip(widths).map { |value, width| value.ljust(width) }.join(" ")
      end
    end
Given a two-dimensional Array of strings representing a table of data,
 translate each row into a single string by joining the values with
 whitespace such that all the columns are nicely aligned.

 If a block is given, map the rows through the block first. These two
 usages are equivalent:

   tableize(rows.map(&something))
   tableize(rows, &something)

 Returns a one-dimensional Array of strings, each representing a formatted
 row of the resulting table.