My version follows the same algorithm (and so runs in the same amount
of time), just arranged differently:
(defn corner-nums [n]
(for [i (range 4)]
(- (* n n) (* i (dec n)))))
(defn sum-all-corner-nums [max-n]
(let [ns (range 3 (inc max-n) 2)
all-corner-nums (mapcat corner-nums ns)]
(apply + 1 all-corner-nums)))
Tidbits of interest:
* I suck at reading nested code, so I move all but the most trivial
lambdas into separate functions, and use (let) liberally to name
things. Consequently, my code tends to be more verbose, but I think
it makes life easier when revisiting code.
* (range) takes an optional step size argument, so generating all odd
numbers from 3 to max-n (inclusive) can be done via (range 3 (inc max-
n) 2).
* (+ 1 (reduce + collection)) can also be written as (apply + 1
collection).
* (mapcat) performs a map, then concatenates the results into a single
list. I find this quite handy.
* It's a purely subjective thing, but I like using (inc x) and (dec x)
when incrementing and decrementing x by 1, respectively.
On Feb 14, 11:13 pm, Andreas Kostler
<[email protected]> wrote:
> Hi all,
> Does anyone wanna have a look at my solution for Project Euler Problem 28?
>
> (defn diagonal-sum [n-max]
> (+ 1 (reduce +
> (map (fn[n]
> (reduce + (map #(- (* n n) (* % (- n 1))) (range 4))))
> (take-nth 2 (range 3 (+ 2 n-max)))))))
>
> The function does the job. The solution takes about 1.5msec on my machine to
> compute.
> I'd like to discuss more performant and/or more idiomatic solutions to that
> problem :)
>
> The parts I'm not quite happy with are the take-nth and range constructs with
> all the magic numbers in there...
>
> Cheers
> Andreas
>
> --
> "Programs must be written for people to read, and only incidentally for
> machines to execute."
> - Abelson & Sussman, SICP
> --
> **********************************************************
> Andreas Koestler, Software Engineer
> Leica Geosystems Pty Ltd
> 270 Gladstone Road, Dutton Park QLD 4102
> Main: +61 7 3891 9772 Direct: +61 7 3117 8808
> Fax: +61 7 3891 9336
> Email: [email protected]
>
> ************www.leica-geosystems.com*************
>
> when it has to be right, Leica Geosystems
>
> Please consider the environment before printing this email.
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en