Euler : Problem 42

Posted by TAKAIY On 2011年6月29日水曜日 0 コメント
文字のアルファベット順での位置(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の使いかたが間違ってるけど、動いたのでこのまま。



;;
;; 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 コメント:

コメントを投稿