Gorgeous! Thanks Justin. To speed it up, change the second "101" to "first"
To speed it up even a little more, you could do this, but it not quite as pretty: (define (euler4e) (for*/fold ([greatest 0]) ([first (in-range 101 1000)] [second (in-range first 1000)]) (let ([prod (* first second)]) (if (palindromic? prod) (max greatest prod) greatest)))) Just out of curiosity, have you used for/fold with >1 accum? It seems very powerful. thanks again, -Joe On Sun, Mar 11, 2012 at 1:33 PM, Justin Zamora <jus...@zamora.com> wrote: > This is a great situation to use Racket's advanced list > comprehensions. There is no need to use set!. You can keep track of > the maximum as you loop. Here is my solution. > > ; Problem 4 > ; Find the largest palindrome made from the product of two 3-digit numbers. > ; 3-digit numbers are the numbers 100-999 > (define (pe-004) > (for*/fold ([greatest 0]) > ([first (in-range 101 1000)] > [second (in-range 101 1000)] > #:when (palindrome? (* first second))) > (max greatest (* first second)))) > > Justin > > On Sun, Mar 11, 2012 at 4:12 PM, Joe Gilray <jgil...@gmail.com> wrote: > > Hi, I'm redoing the ProjectEuler problems to learn Racket (great fun!). > > Below are three solutions to PE#4. Which is most in the spirit of > Racket? > > Of course, I'd love to see solutions that are more idiomatic too. Is > there > > a better way that doesn't use "for" at all? > > > > Thanks! > > -Joe > > > > ; function that turns a positive integer into a list of digits (in > reverse > > order) > > ; invoke as (listize 234511) or (set-count (list->set (listize 112342))) > > (define (listize num) > > (if (= num 0) > > '() > > (cons (remainder num 10) (listize (quotient num 10))))) > > > > ; function that returns #t if the passed number is palindromic > > ; invoke as (palindromic? n) > > (define (palindromic? n) > > (if (equal? (listize n) (reverse (listize n))) #t #f)) > > ) > > > > ; ProjectEuler problem #4 > > (define (euler4a) > > (let ([max 100000]) > > (for ([i (build-list 899 (lambda (x) (+ 100 x)))]) > > (for ([j (build-list (- 999 i) (lambda (y) (+ i y)))]) > > (let ([prod (* i j)]) > > (when (palindromic? prod) > > (begin > > (when (> prod max) (set! max prod)) > > (printf "~a * ~a = ~a~n" i j prod)))))) > > (printf "Max palindromic product is ~a~n" max))) > > > > ; ProjectEuler problem #4 using for* > > (define (euler4b) > > (let ([max 100000]) > > (for* ([i (build-list 899 (lambda (x) (+ 100 x)))] > > [j (build-list 899 (lambda (y) (+ 100 y)))] > > #:when (and (>= j i) (palindromic? (* i j)))) > > (let ([prod (* i j)]) > > (when (> prod max) (set! max prod)) > > (printf "~a * ~a = ~a~n" i j prod))) > > (printf "Max palindromic product is ~a~n" max))) > > > > ; ProjectEuler problem #4 - a mix of 4a and 4b > > (define (euler4c) > > (let ([max 100000]) > > (for* ([i (build-list 899 (lambda (x) (+ 100 x)))] > > [j (build-list (- 999 i) (lambda (y) (+ i y)))] > > #:when (palindromic? (* i j))) > > (let ([prod (* i j)]) > > (when (> prod max) (set! max prod)) > > (printf "~a * ~a = ~a~n" i j prod))) > > (printf "Max palindromic product is ~a~n" max))) > > > > ____________________ > > Racket Users list: > > http://lists.racket-lang.org/users > > >
____________________ Racket Users list: http://lists.racket-lang.org/users