Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Re^2: Challenge: Another Infinite Lazy List

by tall_man (Parson)
on Mar 18, 2005 at 01:13 UTC ( #440603=note: print w/ replies, xml ) Need Help??


in reply to Re: Challenge: Another Infinite Lazy List
in thread Challenge: Another Infinite Lazy List

If you want a pure iterative solution, you could compute a factor wheel and print everything but the usual trial divisors. The code looks messier, but it requires no mod calculations in the loop, just adds. I computed the wheel using Math::Big::Factors (so for people following the original articles, we have come full circle...).

use strict; sub limit_print { my ($count,@lst) = @_; return if $count <= 0; if (@lst <= $count) { print join(" ",@lst,""); } else { print join(" ",@lst[0..$count-1],""); } } # factor wheel for 2,3,5 my @add = (2,2,4,2,4,2,4,6,2,6,4,2,4,2,4,6,2); # wheel restart point. my $ws = 9; my $we = scalar @add - 1; my @lst = (2,3,4,5); my $count = $ARGV[0]; limit_print($count, @lst); $count -= @lst; if ($count <= 0) { print "\n" if $count > -4; exit(0); } my $lastskip = 5; my $place = 6; my $w = 1; while ($count > 0) { # find the next nonmultiple of 2,3, and 5. my $nextskip = $lastskip + $add[$w]; my @lst = ($place..$nextskip-1); limit_print($count, @lst); $count -= @lst; $place = $nextskip+1; $lastskip = $nextskip; $w = $ws if $w++ == $we; } print "\n";


Comment on Re^2: Challenge: Another Infinite Lazy List
Download Code
Re^3: Challenge: Another Infinite Lazy List
by tlm (Prior) on Mar 18, 2005 at 02:01 UTC

    I am confused. Where is the "infinite lazy list"?

    In the implementation I posted, a variable like

    my $lazy235 = challenge( 2, 3, 5 );
    is, effectively, an infinite lazy list. One can repeatedly extract an arbitrarily long prefix from it, using take, or repeatedly find its n-th element with something like:
    sub nth { my $ll = shift; my $n = shift; die "Invalid argument: $n\n" if $n < 0; return $n == 0 ? head( $ll ) : nth( tail( $ll ), $n - 1 ); }
    For example, the following:
    my @first_50 = take( 50, $lazy235 ); my @again = take( 50, $lazy235 ); print "@first_50\n\n@again\n\n"; for ( map int( rand( 1000 ) ), ( 1 .. 5 ) ) { printf "%3d %d\n", $_, nth( $lazy235, $_ ); }
    prints out something like
    0 2 3 4 5 6 8 9 10 12 14 15 16 18 20 21 22 24 25 26 27 28 30 32 33 34 +35 36 38 39 40 42 44 45 46 48 50 51 52 54 55 56 57 58 60 62 63 64 65 +66 0 2 3 4 5 6 8 9 10 12 14 15 16 18 20 21 22 24 25 26 27 28 30 32 33 34 +35 36 38 39 40 42 44 45 46 48 50 51 52 54 55 56 57 58 60 62 63 64 65 +66 347 474 857 1168 530 723 994 1355 579 789

    the lowliest monk

      My reply was not meant to be an "infinite lazy list". It was a reply to another poster who had an interative solution, giving another way to do it. I perfer the lazy list solutions myself.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://440603]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (5)
As of 2015-07-03 00:33 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (47 votes), past polls