Euler : Problem 17

Posted by TAKAIY On 2011年4月24日日曜日 0 コメント

パターンがあるので、それを数えるのがいいかなと思ったんだけど、それだと、手で計算できちゃうので、なんならということで、1000までの数字を読み下ろす関数を作ってみた。

user> (writedown 999)
"nine hundred and ninety nine"

ということで、あえて力ずく。

関係ないけど、four で fourteen なのに forty なんだね。「u」はどこへいっちゃうんだろ。
この問題を解くまで気づかなかったというか、忘れていたというか、ねぇ。

;;
;; Problem 17 : 2011/4/22
;; "Elapsed time: 106.548179 msecs"
(def number-table
'{ 1 "one"
2 "two"
3 "three"
4 "four"
5 "five"
6 "six"
7 "seven"
8 "eight"
9 "nine"
10 "ten"
11 "eleven"
12 "twelve"
13 "thirteen"
14 "fourteen"
15 "fifteen"
16 "sixteen"
17 "seventeen"
18 "eihgteen"
19 "nineteen"
20 "twenty"
30 "thirty"
40 "forty"
50 "fifty"
60 "sixty"
70 "seventy"
80 "eighty"
90 "ninety"
100 "hundred" })

(defn writedown-tys [n]
(cond (<= n 0) nil
(< n 20)
(number-table n)
:else
(apply str (interpose " "
(list (number-table (* 10 (floor (/ n 10))))
(number-table (rem n 10)))))))

(defn writedown-hdrs [n]
(cond (<= n 0) nil
:else (apply str (interpose " "
(list (number-table n)
"hundred")))))

(defn writedown [n]
(if (= n 1000)
"one thousand"
(let [hundreds (floor (/ n 100))
tys (rem n 100)]
(apply str
(interpose " "
(filter #(not (nil? %))
(list
(writedown-hdrs hundreds)
(if (and (> hundreds 0) (> tys 0))
"and"
nil)
(writedown-tys tys))))))))


(loop [nums (range 1 1001) total 0]
(if (empty? nums)
total
(recur (rest nums)
(+ total
(.length (.replace (writedown (first nums)) " " ""))))))

;;

0 コメント:

コメントを投稿