Problems? Is your data what you think it is? 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
# 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";

Replies are listed 'Best First'.
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.

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 chanting in the Monastery: (6)
As of 2019-10-18 18:23 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
In 2019 the site I miss most is:

Results (45 votes). Check out past polls.

Notices?