Hi Rodolfo,
I think solution 2 is generally preferred, and
solution 1 would be considered a slight abuse of apply.
On the other hand, I find that summing comes up sufficiently
often to deserve its own compact syntax, so I propose:
;; Solution 3
(require (planet "mathsymbols.rkt" ("stephanh" "mathsymbols.plt" 1 0)))
(Σ ([i (in-range 1 (add1 N))])
(string-length (integer->string i)))
Stephan
On 07/24/2011 06:25 AM, Rodolfo Carvalho wrote:
Some days ago I came across Williams' describe
<http://planet.racket-lang.org/display.ss?package=describe.plt&owner=williams>
collection from PLaneT. That's pretty awesome.
And coincidentally came this problem
<http://projecteuler.net/index.php?section=problems&id=17> from Project Euler.
Then I wrote two solutions, and I was wondering which one of them have the best
style, according to Racket's philosophy.
#lang racket
(require (planet williams/describe/describe))
(define N 1000)
;; Solution 1
(apply + (build-list N (compose string-length integer->string add1)))
;; Solution 2
(for/fold ([sum 0])
([i (in-range 1 (add1 N))])
(+ sum ((compose string-length integer->string) i)))
For me solution 1 is compact, however it allocates the list without need (which
gives out of memory error for large N). Solution 2 is more memory efficient,
but more verbose.
BTW what's the recommended way to check "per-function" memory usage? There's an
unanswered question about memory profiling
<http://groups.google.com/group/racket-users/browse_thread/thread/d48ce09209a5aea4>
in the mailing list, and I could find my way out searching PLaneT, the docs and the
mailing list archive.
[]'s
Rodolfo Carvalho
_________________________________________________
For list-related administrative tasks:
http://lists.racket-lang.org/listinfo/users
_________________________________________________
For list-related administrative tasks:
http://lists.racket-lang.org/listinfo/users