From: Eric Date: 2006-06-25T23:24:40+09:00 Subject: Re: [QUIZ] pp Pascal (#84) Hi everybody, here's my solution, next to few examples. The result might look pretty poor displayed on an email client :-(, but the script does print a perfectly equilateral triangle. Thanks for the interesting quiz! $ ./pascal.rb 12 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 1 10 45 120 210 252 210 120 45 10 1 1 11 55 165 330 462 462 330 165 55 11 1 1 12 66 220 495 792 924 792 495 220 66 12 1 $ ./pascal.rb 12 -1 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 1 10 45 120 210 252 210 120 45 10 1 1 11 55 165 330 462 462 330 165 55 11 1 $ ./pascal.rb 12 1 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 1 10 45 120 210 252 210 120 45 10 1 1 11 55 165 330 462 462 330 165 55 11 1 $ ./pascal.rb 12 0.7 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 1 10 45 120 210 252 210 120 45 10 1 1 11 55 165 330 462 462 330 165 55 11 1 By tweaking a bit the script you can easily obtain a Sierpinski triangle, as mentioned in a previous post: ./sierpinski.rb 32 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #! /usr/bin/ruby # ############### Pascal Triangle by Eric DUMINIL ############### # # This program is free software; you can redistribute it # and/or modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; # either version 2 of the License, or (at your option) any # later version. # # How-to use it? # pascal.rb height excentricity # with: # height, pretty self-explanatory # excentricity, float between -1 and 1. # # height set to 5 and excentricity set to -1: # # 1 # 1 1 # 1 2 1 # 1 3 3 1 # 1 4 6 4 1 # # height set to 5 and excentricity set to 1 : # # 1 # 1 1 # 1 2 1 # 1 3 3 1 # 1 4 6 4 1 # # # By default, excentricity is set to 0: # # 1 # 1 1 # 1 2 1 # 1 3 3 1 # 1 4 6 4 1 # #Just to make sure we can calculate C(n,n/2) #without having to build the whole tree class Fixnum def fact return 1 if self<2 self*(self-1).fact end def cnp(p) self.fact/(p.fact*(self-p).fact) end end class PascalTriangle def initialize (height=15,excentricity=0) @height=height @excentricity=excentricity #maxLength should be odd, so that the alignment is preserved @maxLength=(height-1).cnp((height-1)/2).to_s.length|1 createAndShow end attr_reader :height, :maxLength, :excentricity def createAndShow previous=[1] current=Array.new height.times{|i| current[0]=current[i]=1 #Taking care of the symetry 1.upto(i/2){|j| current[j]=current[i-j]=previous[j]+previous[j-1] } puts " "*((maxLength+1)*(excentricity+1)/2)*(height-i-1)+ current.map{|number| number.to_s.rjust(maxLength) }.join(" ") #No need to remember the whole triangle, #the previous row will be enough previous.replace(current) } end end PascalTriangle.new(ARGV[0].to_i,ARGV[1].to_f) ############################################################################### Bye, Eric Le Vendredi 23 Juin 2006 15:31, Ruby Quiz a écrit : > The three rules of Ruby Quiz: > > 1. Please do not post any solutions or spoiler discussion for this quiz > until 48 hours have passed from the time on this message. > > 2. Support Ruby Quiz by submitting ideas as often as you can: > > http://www.rubyquiz.com/ > > 3. Enjoy! > > Suggestion: A [QUIZ] in the subject of emails about the problem helps > everyone on Ruby Talk follow the discussion. Please reply to the original > quiz message, if you can. > > -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- >=-=-= > > by Dirk Meijer > > I recently showed a friend what an amazing language Ruby was, by quickly > programming up a script to calculate Fibonacci's Sequence, and his first > response was: "Can you do Pascal's Triangle?" So I did, which proved > harder than expected. > > For those not familiar with Pascal's Triangle, it is very similar to > Fibonacci's Sequence. It's a pyramid of numbers. The outside of the pyramid > is all ones, the other numbers are the sum of the two numbers above, like > this: > > 1 > 1 1 > 1 2 1 > 1 3 3 1 > 1 4 6 4 1 > > The input and output should be as follows: > > $ ruby pp_pascal.rb 10 > 1 > 1 1 > 1 2 1 > 1 3 3 1 > 1 4 6 4 1 > 1 5 10 10 5 1 > 1 6 15 20 15 6 1 > 1 7 21 35 35 21 7 1 > 1 8 28 56 70 56 28 8 1 > 1 9 36 84 126 126 84 36 9 1 > > A number should be given as command-line argument. This is the amount of > rows the triangle has. For the output, there should be spacing between the > numbers based on the size of the numbers with the most digits, so it will > look like a proper triangle. > > Good luck! > > [Editor's Note: If you are working through Chris Pine's Learn to Program, > you can do this problem using only things you learned in the first eight > chapters. Since he doesn't teach how to grab the row count in those pages > though, just add this as the first line of your program: `rows = > ARGV[0].to_i]`. After that, the rows variable will hold the number of rows > to print. --JEG2]