T. Onoma
10/13/2004 4:47:00 AM
Here's a coding challenge you.
The R language has the following nifty features for working with arrays. To
what degree can you get Ruby to do the same?
The solution that is closest/nicest gets forever embedded in my growing
library of Ruby enhancements, and it's author's name wrapped in shiny
asterisks and number signs! Joy, joy! :)
Listing 1. Elementwise operations in R
> a = 1:10 # Range of numbers 1 through 10
> b = a+5 # Add 5 to each element
> b # Show b vector
[1] 6 7 8 9 10 11 12 13 14 15
Or you can operate selectively only on elements with certain indices, by using
an "index array":
Listing 2. Using index arrays to select elements
> c = b # Make a (lazy) copy of b
> pos = c(1,2,3,5,7) # Change the prime indices
> c[pos] = c[pos]*10 # Reassign to indexed positions
> c # Show c vector
[1] 60 70 80 9 100 11 120 13 14 15
Or, maybe best of all, you can use a syntax much akin to list comprehensions
in Haskell or Python, and only operate on elements that have a desired
property:
Listing 3. Using predicates to select elements
> d = c
> d[d %% 2 == 0] = -1 # Reassign -1 to all even elements
> d
[1] -1 -1 -1 9 -1 11 -1 13 -1 15
---
Note, I've gotten pretty far on my own solution, but can't seem to get passed
a certain point --the Functor class I presented a week or so ago has proven
useful.
Finally special thanks to Martin DeMello who got me hell bent on this ;)
T.