文字のアルファベット順での位置(A=1として)をその文字の値として、単語の文字の値の和が三角数になるものの個数を数える問題。
三角数かどうかの判定は、n番目の三角数xの式を変形して
x = n(n+1)/2
n^2 + n - 2x = 0
n = ( 1 +/- sqrt(8x + 1)) / 2
負の数にならないから、
n = ( 1 + sqrt(8x + 1)) / 2
ということで、8倍の平方根に1を足したものが2で割りきれるかどうかで判断します。
文字->数値変換は、文字コードを使うといいのかもしれないけど、換算表を使った。
ファイルからの読みこみのところは、今見るとwith-openの使いかたが間違ってるけど、動いたのでこのまま。
三角数かどうかの判定は、n番目の三角数xの式を変形して
x = n(n+1)/2
n^2 + n - 2x = 0
n = ( 1 +/- sqrt(8x + 1)) / 2
負の数にならないから、
n = ( 1 + sqrt(8x + 1)) / 2
ということで、8倍の平方根に1を足したものが2で割りきれるかどうかで判断します。
文字->数値変換は、文字コードを使うといいのかもしれないけど、換算表を使った。
ファイルからの読みこみのところは、今見るとwith-openの使いかたが間違ってるけど、動いたのでこのまま。
;;
;; Problem 42 : 2011/6/9
"Elapsed time: 22.138288 msecs"
(use '[clojure.contrib.duck-streams :only (reader read-lines)])
(def alpha-pos
'{\A 1 \B 2 \C 3 \D 4 \E 5 \F 6 \G 7 \H 8 \I 9 \J 10
\K 11 \L 12 \M 13 \N 14 \O 15 \P 16 \Q 17 \R 18 \S 19 \T 20
\U 21 \V 22 \W 23 \X 24 \Y 25 \Z 26})
(defn calc-words [st]
(reduce + (map #(alpha-pos %) st)))
(defn triangle-num? [n]
(zero? (rem (- (sqrt (+ (* 8 n) 1)) 1) 2)))
(count (let [file-data (with-open [] (read-lines *filename*))
word-list (.split (.replaceAll (first file-data) "\"" "") ",")]
(filter triangle-num? (map calc-words word-list))))
;;
0 コメント:
コメントを投稿