Hi Joel
Amazing! When will you write a full book about Rebol ?
Great post! Thanks
Patrick
----- Original Message -----
From: "Joel Neely" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Sunday, September 29, 2002 2:52 PM
Subject: [REBOL] Re: cyclic values
> Hi, Pat,
>
> Ingeneous!!!
>
> (...of course, with me, there's always a "but"... ;-)
>
> pat665 wrote:
> >
> > I want to get values in order from a block, the first value
> > coming again after the last, and this forever. Is there a
> > better way than the one I am using now ?
> >
> > colors: [red green blue]
> >
> > ; I want color to be red, then green, then blue, then red
> > ; again forever
> > ; the first value is duplicated
> >
> > color: first colors
> > append colors color
> >
> > ; then forever
> > color: select colors color
> >
>
> That's a nice compact way to accomplish your stated result,
> but under two constraints:
>
> 1) the number of values in the block is very small, and
> 2) the values are all distinct.
>
>
> SMALL NUMBER OF VALUES
> ----------------------
>
> Given REBOL 1-origin indexing, the fastest/simplest way I've
> found for cycling an integer counter through the range of
> values 1..N is
>
> cnt: 0 ;; initialization
>
> cnt: cnt // N + 1
>
> which means we could get your "forever" case above by using
>
> color: pick colors cnt: cnt // + 1
>
> The alternative to using the modulus operator is explicit
> logic, as in
>
> color: pick colors counter:
> either counter < length? colors [counter + 1] [1]
>
> but that is very sub-optimal...
>
> In any case, the time complexity of modifying the integer
> index is O(1) -- constant -- while the time complexity of
> SELECT on an ordinary block is O(N) -- linear on the size
> of the block. A little quick benchmarking shows that this
> adds up very quickly. On my old slow benchmarking box
> (200 MHz Pentium, w95) the timings are (in microseconds)
>
> SELECT modulus EITHER...
> 3 elements 13.94 14.28 18.73
> 10 elements 16.76 14.72 19.33
>
> (As you can see from the second column, there's still some
> statistical variability...)
>
> The above times were taken using function evaluations, so
> after removing that overhead, we get the following ratios:
>
> SELECT EITHER...
> vs vs
> modulus modulus
> 3 elements 0.97 1.41
> 10 elements 1.18 1.41
>
> With only three elements, the SELECT approach saves 3% over
> the modulus approach, but the EITHER strategy costs 41% extra.
> But with ten elements, SELECT is now 18% slower than modulus,
> while EITHER is still 41% slower.
>
> CONCLUSION: The SELECT strategy doesn't scale well.
>
>
> DISTINCT VALUES
> ---------------
>
> Suppose you wanted to simulate a monitor which was cycling between
> the primary colors (e.g. using your original COLORS data), but went
> off in between each color (e.g. interspersed black displays). If
> we change our block to contain:
>
> colors: [red black green black blue black]
> color: first colors
>
> and then try
>
> color: select colors color
>
> We'll find that we're stuck in a green/black cycle, since the first
> occurrence of black is always the one that's found by SELECT.
>
> CONCLUSION: The SELECT strategy doesn't handle cases with values
> that occur more than once in the block.
>
>
> HOWEVER... With all of the above said, for small blocks with
> distinct values, your approach is quite elegant. Thanks for
> posting it!
>
> -jn-
>
> --
> ; Joel Neely joeldotneelyatfedexdotcom
> REBOL [] do [ do func [s] [ foreach [a b] s [prin b] ] sort/skip
> do function [s] [t] [ t: "" foreach [a b] s [repend t [b a]] t ] {
> | e s m!zauafBpcvekexEohthjJakwLrngohOqrlryRnsctdtiub} 2 ]
> --
> To unsubscribe from this list, please send an email to
> [EMAIL PROTECTED] with "unsubscribe" in the
> subject, without the quotes.
>
________________________________________________________________
Etudiant: Wanadoo t'offre le Pack eXtense Haut D�bit soit 150,92 euros d'�conomies !
Et pour 1 euro de plus, re�ois le CD-ROM du jeu Dark Age of Camelot
+ 1 mois de jeu en r�seau offert !
Clique ici : http://www.ifrance.com/_reloc/mail.etudiant
--
To unsubscribe from this list, please send an email to
[EMAIL PROTECTED] with "unsubscribe" in the
subject, without the quotes.