I was presented with the question "How many gifts, total, are
mentioned in the song 'The 12 Days of Christmas'?" I thought, "Aha!
I'll use clojure to figure it out."  But I wanted to do it
idiomatically, using some functional constructs (with which I'm not
very familiar).  First, I needed to know how many presents were given
on day n:
(defn sum-up-to [n]
  "returns the sum of the positive integers from 1 to n"
  (apply + 0
         (map #(+ 1 %) (range n))))

(As an aside, yes, I know this is the same series from the apocryphal
story about Gauss as a child, and that the result is n+1/(n/2), but
using that would defeat the purpose of learning these functional
constructs).
   The "apply + 0" is a little wonky, though, yes?  I think that
reduce would be better, right?  So I change the function:
(defn sum-up-to [n]
  "returns the sum of the positive integers from 1 to n"
  (reduce + (map #(+ 1 %) (range n))))

   Then we need to find the sum of each of those days, from 1 to 12;
first, let's get that sequence (just to make sure I'm doing it right),
then let's add it up:
user> (map sum-up-to (range 1 13))
(1 3 6 10 15 21 28 36 45 55 66 78)
user> (reduce + (map sum-up-to (range 1 13)))
364

   (Originally, I didn't know about the 2-argument version of range,
so I was using map and an anonymous inline function to add 1 to each
result from range, like:
(map #(sum-up-to (inc %)) (range 12))
Then I thought "This can't be right, there has to be a way to do this
already", and looked at the docs for range.  It's nice when you find
something you want already exists - thanks, Rich!)
   Fun times - thanks, clojure!
-Matt
PS I'm sure there are versions of this that are shorter (1 line?) or
perform better (e.g., by caching previous sums or something) - but
I'll leave those as an exercise for somebody else. ;)
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to