プロジェクト

全般

プロフィール

Problem 36 » 履歴 » バージョン 2

Noppi, 2024/01/14 12:18

1 1 Noppi
[ホーム](https://redmine.noppi.jp) - [[Wiki|Project Euler]]
2
# [[Problem 36]]
3
4
## Double-base Palindromes
5
The decimal number, $585 = 1001001001_2$ (binary), is palindromic in both bases.
6
7
Find the sum of all numbers, less than one million, which are palindromic in base $10$ and base $2$.
8
9
(Please note that the palindromic number, in either base, may not include leading zeros.)
10
11
## 二種類の基数による回文数
12
$585 = 1001001001_2$ (2進) は10進でも2進でも回文数である.
13
14
100万未満で10進でも2進でも回文数になるような数の総和を求めよ.
15
16
(注: 先頭に0を含めて回文にすることは許されない.)
17
18
```scheme
19 2 Noppi
(import (scheme base)
20
        (gauche base)
21
        (scheme flonum))
22
23
(define (number-of-digit n base)
24
  (assume (exact-integer? n))
25
  (assume (<= 0 n))
26
  (assume (or (= base 2)
27
              (= base 10)))
28
  (if (zero? n)
29
    1
30
    (+ (floor->exact
31
         ((if (= base 2)
32
            fllog2
33
            fllog10)
34
          n))
35
       1)))
36
37
(define (palindrome? n base)
38
  (assume (exact-integer? n))
39
  (assume (<= 0 n))
40
  (assume (or (= base 2)
41
              (= base 10)))
42
  (let* ([dn (number-of-digit n base)]
43
         [loop-count (div dn 2)])
44
    (let loop ([index 0])
45
      (cond
46
        [(<= loop-count index) #t]
47
        [(= (div (mod n (expt base (+ 1 index)))
48
                 (expt base index))
49
            (div (mod n (expt base (- dn index)))
50
                 (expt base (- dn 1 index))))
51
         (loop (+ index 1))]
52
        [else #f]))))
53
54
(define answer-36
55
  (apply + 
56
         (filter (cut palindrome? <> 2)
57
                 (filter (cut palindrome? <> 10)
58
                         (iota 100_0000)))))
59
60
(format #t "36: ~d~%" answer-36)
61 1 Noppi
```