Project Euler: Problem 36

The decimal number, 585 = 1001001001_(2) (binary), is palindromic in both bases.

Find the sum of all numbers, less than one million, which are palindromic in base
10 and base 2.

(Please note that the palindromic number, in either base, may not include leading zeros.)

1000000 以下の整数の中で、10進数で書いても2進数で書いても回文になってる数字を全て探してその合計を求めよ、とのこと。

Gauche で書いてみた。

#!/usr/bin/env gosh

(define (reverse-string str)
  (list->string (reverse (string->list str))))

(define (number-palindromic? num)
  (and (number-palindromic-decimal? num)
       (number-palindromic-binary?  num)))

(define (number-palindromic-decimal? num)
  (let1 str (number->string num 10)
        (equal? str (reverse-string str))))

(define (number-palindromic-binary? num)
  (let1 str (number->string num 2)
        (equal? str (reverse-string str))))

(define (main args)
  (let loop ((num 1)
             (sum 0))
    (if (< num 1000000)
      (loop (+ num 1)
            (if (number-palindromic? num)
              (+ sum num)
              sum))
      (print sum)))
  0)

10進数をひっくり返すのは以前に作ったものを流用しようかと思ったけど、2進数をうまい具合に逆順にする方法が思いつかず。1 bitづつコピーするのもアホっぽいので、とりあえず、文字列にして処理してる。やっぱりアホっぽい。