Problem 17 » 履歴 » バージョン 2
Noppi, 2023/12/31 02:37
1 | 1 | Noppi | [ホーム](https://redmine.noppi.jp) - [[Wiki|Project Euler]] |
---|---|---|---|
2 | # [[Problem 17]] |
||
3 | |||
4 | ## Number Letter Counts |
||
5 | If the numbers $1$ to $5$ are written out in words: one, two, three, four, five, then there are $3 + 3 + 5 + 4 + 4 = 19$ letters used in total. |
||
6 | If all the numbers from $1$ to $1000$ (one thousand) inclusive were written out in words, how many letters would be used? |
||
7 | **NOTE:** Do not count spaces or hyphens. For example, $342$ (three hundred and forty-two) contains $23$ letters and $115$ (one hundred and fifteen) contains $20$ letters. The use of "and" when writing out numbers is in compliance with British usage. |
||
8 | |||
9 | ## 数字の文字数 |
||
10 | 1 から 5 までの数字を英単語で書けば one, two, three, four, five であり, 全部で 3 + 3 + 5 + 4 + 4 = 19 の文字が使われている. |
||
11 | では 1 から 1000 (one thousand) までの数字をすべて英単語で書けば, 全部で何文字になるか. |
||
12 | 注: 空白文字やハイフンを数えないこと. 例えば, 342 (three hundred and forty-two) は 23 文字, 115 (one hundred and fifteen) は20文字と数える. なお, "and" を使用するのは英国の慣習. |
||
13 | |||
14 | ```scheme |
||
15 | 2 | Noppi | #!r6rs |
16 | #!chezscheme |
||
17 | |||
18 | (import (chezscheme)) |
||
19 | |||
20 | (define (number-letter num) |
||
21 | (assert (and (<= 1 num) (<= num 1000))) |
||
22 | (case num |
||
23 | [1 "one"] |
||
24 | [2 "two"] |
||
25 | [3 "three"] |
||
26 | [4 "four"] |
||
27 | [5 "five"] |
||
28 | [6 "six"] |
||
29 | [7 "seven"] |
||
30 | [8 "eight"] |
||
31 | [9 "nine"] |
||
32 | [10 "ten"] |
||
33 | [11 "eleven"] |
||
34 | [12 "twelve"] |
||
35 | [13 "thirteen"] |
||
36 | [14 "fourteen"] |
||
37 | [15 "fifteen"] |
||
38 | [16 "sixteen"] |
||
39 | [17 "seventeen"] |
||
40 | [18 "eighteen"] |
||
41 | [19 "nineteen"] |
||
42 | [20 "twenty"] |
||
43 | [30 "thirty"] |
||
44 | [40 "forty"] |
||
45 | [50 "fifty"] |
||
46 | [60 "sixty"] |
||
47 | [70 "seventy"] |
||
48 | [80 "eighty"] |
||
49 | [90 "ninety"] |
||
50 | [1000 "one thousand"] |
||
51 | [else |
||
52 | (if (< num 100) |
||
53 | ; 2桁(10の位と1の位に分けて処理) |
||
54 | (let-values ([(upper lower) (div-and-mod num 10)]) |
||
55 | (format "~D-~D" (number-letter (* upper 10)) (number-letter lower))) |
||
56 | ; 3桁(100の位と残り2桁に分けて処理) |
||
57 | (let-values ([(upper lower) (div-and-mod num 100)]) |
||
58 | (if (zero? lower) |
||
59 | (format "~D hundred" (number-letter upper)) |
||
60 | (format "~D hundred and ~D" |
||
61 | (number-letter upper) |
||
62 | (number-letter lower)))))])) |
||
63 | |||
64 | (define all-number-letters |
||
65 | (map number-letter (cdr (iota 1001)))) |
||
66 | |||
67 | (define concatenate-all-number-letters |
||
68 | (fold-left |
||
69 | (lambda (result letter) |
||
70 | (string-append result letter)) |
||
71 | "" |
||
72 | all-number-letters)) |
||
73 | |||
74 | (define (erase-space-hyphen str) |
||
75 | (list->string |
||
76 | (filter |
||
77 | (lambda (char) |
||
78 | (case char |
||
79 | [(#\space #\-) #f] |
||
80 | [else #t])) |
||
81 | (string->list str)))) |
||
82 | |||
83 | (define answer-17 |
||
84 | (string-length (erase-space-hyphen concatenate-all-number-letters))) |
||
85 | |||
86 | (printf "17: ~D~%" answer-17) |
||
87 | 1 | Noppi | ``` |