William James
9/2/2015 6:05:00 PM
WJ wrote:
> Peter Seibel wrote:
>
> > > ; Prints the first 16 rows of Pascal's triangle
> > > ; not tested, I'm writing it from memory right here!
> > > (loop repeat 16
> > > for list = '(1) then (mapcar #'+ (cons 0 list) (append list
> > > '(0)))
> > > do (format t "~{~6D~^,~}~%" list))
> > >
> > > That's definitely one of the most beautiful pieces of code I've ever
> > > written. I wrote it for a programming language comparison contest,
> > > and blew every other language out of the water, except Mathematica,
> > > of course. ;-)
> >
> > Hmmm. I'm not sure any code that repeatedly APPENDs to the end of a
> > growing list can be all that elegant. If you're into this sort of
> > thin, both the versions below, while slightly longer in terms of
> > number of characters than yours, are, I'd argue, algorithmically more
> > elegant:
> >
> > (loop repeat 16 for list = '(1)
> > then (maplist #'(lambda (cons) (+ (car cons) (or (cadr cons) 0))) (cons 0 l
> > ist))
> > do (format t "~{~6D~^,~}~%" list))
> >
> > (loop repeat 16 for list = '(1)
> > then (maplist #'(lambda (cons) (apply #'+ (ldiff cons (cddr cons)))) (cons
> > 0 list))
> > do (format t "~{~6D~^,~}~%" list))
>
> Gauche Scheme:
>
> (do ((row '(1) `(1 ,@(map + row (cdr row)) 1))
> (i 0 (+ 1 i)))
> ((= i 16))
> (print row))
>
> (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)
> (1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1)
> (1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1)
> (1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1)
MatzLisp (Ruby):
row=[1];16.times{p row;row=[0,*row].zip(row+[0]).map{|a,b|a+b}}