#| Euler #45 in Racket """ Triangle, pentagonal, and hexagonal numbers are generated by the following formulae: Triangle Tn=n(n+1)/2 1, 3, 6, 10, 15, ... Pentagonal Pn=n(3n−1)/2 1, 5, 12, 22, 35, ... Hexagonal Hn=n(2n−1) 1, 6, 15, 28, 45, ... It can be verified that T(285) = P(165) = H(143) = 40755. Find the next triangle number that is also pentagonal and hexagonal. """ This Racket program was created by Hakan Kjellerstrand, hakank@gmail.com See also my Racket page: http://www.hakank.org/racket/ |# #lang racket (provide (all-defined-out)) (require (only-in math/number-theory triangle-number pentagonal-number hexagonal-number )) ;;; (require racket/trace) (require (only-in "utils_hakank.rkt" time-function )) ;;; cpu time: 359 real time: 360 gc time: 6 (define (euler45a) (let* ([t 286] [tt (triangle-number t)] [p 165] [pp (pentagonal-number p)] [h 143] [hh (hexagonal-number h)]) (for ([_ (in-naturals)]) ;;; It's annoying that this is needed. How to fix it? #:break (and (= tt pp) (= pp hh)) (set! t (add1 t)) (set! tt (triangle-number t)) (when (> tt pp) (set! p (add1 p)) (set! pp (pentagonal-number p))) (when (> pp hh) (set! h (add1 h)) (set! hh (hexagonal-number h))) (when (> tt hh) (set! h (add1 h)) (set! hh (hexagonal-number h))) ) tt) ) (define (run) (time-function euler45a) ) (run)