repellent:

Sweet! So of course I had to take another look:

sub pascal_tri_row { my $r = shift; return () if $r < 0; my @row = (1) x ($r + 1); for my $i (1 .. $r - 1) { $row[$_] += $row[$_ - 1] for reverse 1 .. $i; } return @row; } sub robo_2 { my $row = shift; my @cols = (1); ++$row; $cols[$_] = $cols[$_-1] * ($row-$_)/$_ for 1 .. $row-1; return @cols; } sub triangle { my $numTosses = shift; my @triangle = (0, 1, 0); for (1 .. $numTosses) { my @newTriangle=(0); push @newTriangle, $triangle[$_]+$triangle[$_+1] for 0 .. $#tr +iangle-1; push @newTriangle, 0; @triangle = @newTriangle; } return @triangle[1..$#triangle-1]; } use Benchmark qw(cmpthese); print "robo_1: ", join(" ",triangle(8)), "\n"; print "repel1: ", join(" ",pascal_tri_row(8)), "\n"; print "robo_2: ", join(" ",robo_2(8)), "\n"; cmpthese -1, { robo_tri => sub { triangle(32) }, repel_tri => sub { pascal_tri_row(32) }, robo_2 => sub { robo_2(32) }, };

First I put in a trace so I could be sure I wasn't generating useless values. Next, I couldn't bear the zeroes you had to add to your function to match my original return value. They were just sentinel values to simplify the calculation, anyway. So I fixed the original to return only the values of interest. Finally, I had to squeeze a little more speed out of it:

$ perl 892898.pl robo_1: 1 8 28 56 70 56 28 8 1 repel1: 1 8 28 56 70 56 28 8 1 robo_2: 1 8 28 56 70 56 28 8 1 Rate robo_tri repel_tri robo_2 robo_tri 2196/s -- -42% -93% repel_tri 3775/s 72% -- -88% robo_2 31946/s 1355% 746% --

You should've read a bit further down in the wikipedia article you linked. It had a much better algorithm for calculating the coefficients of any row. It saved a nested loop.

;^)

...roboticus

When your only tool is a hammer, all problems look like your thumb.


In reply to Re^5: Monte Carlo - Coin Toss by roboticus
in thread Monte Carlo - Coin Toss by James_H

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.