Problem 43 » 履歴 » バージョン 2
Noppi, 2024/01/16 04:54
1 | 1 | Noppi | [ホーム](https://redmine.noppi.jp) - [[Wiki|Project Euler]] |
---|---|---|---|
2 | # [[Problem 43]] |
||
3 | |||
4 | ## Sub-string Divisibility |
||
5 | The number, $1406357289$, is a $0$ to $9$ pandigital number because it is made up of each of the digits $0$ to $9$ in some order, but it also has a rather interesting sub-string divisibility property. |
||
6 | |||
7 | Let $d_1$ be the $1$<sup>st</sup> digit, $d_2$ be the $2$<sup>nd</sup> digit, and so on. In this way, we note the following: |
||
8 | |||
9 | * $d_2d_3d_4=406$ is divisible by $2$ |
||
10 | * $d_3d_4d_5=063$ is divisible by $3$ |
||
11 | * $d_4d_5d_6=635$ is divisible by $5$ |
||
12 | * $d_5d_6d_7=357$ is divisible by $7$ |
||
13 | * $d_6d_7d_8=572$ is divisible by $11$ |
||
14 | * $d_7d_8d_9=728$ is divisible by $13$ |
||
15 | * $d_8d_9d_{10}=289$ is divisible by $17$ |
||
16 | |||
17 | Find the sum of all $0$ to $9$ pandigital numbers with this property. |
||
18 | |||
19 | ## 部分文字列被整除性 |
||
20 | 数1406357289は0から9のパンデジタル数である (0から9が1度ずつ現れるので). この数は部分文字列が面白い性質を持っている. |
||
21 | |||
22 | $d_1$を上位1桁目, $d_2$を上位2桁目の数とし, 以下順に$d_n$を定義する. この記法を用いると次のことが分かる. |
||
23 | |||
24 | * $d_2d_3d_4=406$ は 2 で割り切れる |
||
25 | * $d_3d_4d_5=063$ は 3 で割り切れる |
||
26 | * $d_4d_5d_6=635$ は 5 で割り切れる |
||
27 | * $d_5d_6d_7=357$ は 7 で割り切れる |
||
28 | * $d_6d_7d_8=572$ は 11 で割り切れる |
||
29 | * $d_7d_8d_9=728$ は 13 で割り切れる |
||
30 | * $d_8d_9d_{10}=289$ は 17 で割り切れる |
||
31 | |||
32 | このような性質をもつ0から9のパンデジタル数の総和を求めよ. |
||
33 | |||
34 | ```scheme |
||
35 | 2 | Noppi | (import (scheme base) |
36 | (gauche base)) |
||
37 | |||
38 | (define pandigital-num-list |
||
39 | (let loop ([index 1] |
||
40 | [rest (iota 10)] |
||
41 | [current 0] |
||
42 | [lis '()]) |
||
43 | (let ([next-loop (^[fold-rest] |
||
44 | (fold-right (^[n lis] |
||
45 | (loop (+ index 1) |
||
46 | (delete n rest) |
||
47 | (+ (* current 10) |
||
48 | n) |
||
49 | lis)) |
||
50 | lis |
||
51 | fold-rest))]) |
||
52 | (cond |
||
53 | [(null? rest) |
||
54 | (cons current lis)] |
||
55 | ; 先頭は 0 以外 |
||
56 | [(= index 1) |
||
57 | (next-loop (iota 9 1))] |
||
58 | ; 先頭から 4 桁目は偶数になる |
||
59 | [(= index 4) |
||
60 | (let ([rest-even (filter even? rest)]) |
||
61 | (if (null? rest-even) |
||
62 | lis |
||
63 | (next-loop rest-even)))] |
||
64 | ; 先頭から 6 桁目は 0 または 5 になる |
||
65 | [(= index 6) |
||
66 | (let ([rest-5 (filter (^n (zero? (mod n 5))) |
||
67 | rest)]) |
||
68 | (if (null? rest-5) |
||
69 | lis |
||
70 | (next-loop rest-5)))] |
||
71 | [else |
||
72 | (next-loop rest)])))) |
||
73 | |||
74 | (define (match-num? num) |
||
75 | (filter (^n |
||
76 | (let ([d345 (div (mod n 100_000_000) |
||
77 | 100_000)] |
||
78 | [d567 (div (mod n 1_000_000) |
||
79 | 1_000)] |
||
80 | [d678 (div (mod n 100_000) |
||
81 | 100)] |
||
82 | [d789 (div (mod n 10_000) |
||
83 | 10)] |
||
84 | [d890 (mod n 1_000)]) |
||
85 | (and (zero? (mod d345 3)) |
||
86 | (zero? (mod d567 7)) |
||
87 | (zero? (mod d678 11)) |
||
88 | (zero? (mod d789 13)) |
||
89 | (zero? (mod d890 17))))) |
||
90 | pandigital-num-list)) |
||
91 | |||
92 | (define answer-43 |
||
93 | (apply + (match-num? pandigital-num-list))) |
||
94 | |||
95 | (format #t "43: ~d~%" answer-43) |
||
96 | 1 | Noppi | ``` |