Problem 4

今日もやろう。

Problem 4 - PukiWiki

左右どちらから読んでも同じ値になる数を回文数という。 2桁の数の積で表される回文数のうち、最大のものは 9009 = 91 × 99 である。

では、3桁の数の積で表される回文数のうち最大のものはいくらになるか。


n桁 * n桁のリストを全部出してからフィルタリングしてみた。

;; for MzScheme
(require (lib "1.ss" "srfi"))
(require (lib "13.ss" "srfi"))

(define (problem4 n)
  (let* ((start (expt 10 (- n 1)))
         (seed (iota (* start 9) start))
         (all (fold-right (lambda (x acc)
                            (append (map (lambda (y) (* x y)) seed)
                                    acc))
                          '() seed))
         (palindromic? (lambda (n)
                         (let ((s (number->string n)))
                              (equal? s (string-reverse s))))))
        (filter palindromic? all)))

(apply max (problem4 2)) ; 9009
(apply max (problem4 3)) ; 906609

もうちょっとうまいやり方がありそうな気がする。