Hi Reichart,

> This exact same problem in other languages would be just: 
>  Matlab:      sum(rand(100,1)>1/3)
>  C:       for(int i=0,j=0;i<100;i++)j+=rand(3)>1;cout<<j;
>  In Perl:     $i=0;$j=0;for(;$i<100;$i++){$j+=rand(3)>1;}print $j
>  Rebol:       w: 100 print [loop w [w: w - first random [0 0 1]]]
>  
>  Does not look good for Rebol. 

We can use the same algorithm as you have for Perl and C, and get something 
like:

s: 0 n: 100 loop n[if 1 < Random 3 [s: s + 1]]s

Which is 47 bytes -- exactly the same as your C (actually C++) example  And 
shorter than your Perl, though longer than Joel's improvement.

(You ask that we count the Rebol [] as an extra 8 bytes overhead. Fair 
enough, but shouldn't your C++ have a standard header include?)

Unlike Perl and C,  Rebol needs an explicit type cast to go from true/false 
to an integer, so to follow exactly the Perl/C++ examples we'd have to write 
something like:
 

s: 0 n: 100 loop n[s: s + to-integer (1 < Random 3)]
or
s: 0 n: 100 loop n[s: s + pick[0 1](2 < Random 3)]

but they are longer.

Rebol "loses out" on sheer shortness here because it needs spaces between 
operators, and its RAND function is spelt RANDOM. Some people would see these 
as sufficient compensation for coming second in such a race.

An, of course, bear in mind that the entire Rebol environment needed to run 
these programs is under 252K (Rebol/Core, Windows 3.1).

If I am allowed to have a slightly larger environment (though still way 
smaller than C or Perl -- I don't know about Matlab), then I'd define:

L: :Loop
R: :Random

And roll my code home in 39 bytes:

s: 0 n: 100 L n[if 1 < R 3 [s: s + 1]]s

Sunanda.
-- 
To unsubscribe from this list, please send an email to
[EMAIL PROTECTED] with "unsubscribe" in the 
subject, without the quotes.

Reply via email to