[racket] spirit of Racket?
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)))
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20120311/d1d4cbe7/attachment.html>