Created
January 4, 2013 09:04
-
-
Save bouzuya/4451081 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;;; Project Euler #22 | |
;;; http://projecteuler.net/problem=22 | |
;;; http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2022 | |
; [org.clojure/data.csv "0.1.2"] | |
(require '[clojure.test :refer [deftest is]] | |
'[clojure.data.csv :as csv]) | |
(defn char-score | |
[c] | |
(- (Character/getNumericValue c) 9)) | |
(defn str-score | |
[s] | |
(apply + (map char-score s))) | |
(defn problem-22 | |
([] (problem-22 "names.txt")) | |
([file] | |
(let [names (first (csv/read-csv (slurp file))) | |
sorted (sort names) | |
scores (map str-score sorted)] | |
(apply + | |
(map-indexed | |
(fn [idx score] | |
(* (inc idx) score)) scores))))) | |
(deftest char-score-test | |
(is (= (char-score \C) 3)) | |
(is (= (char-score \O) 15)) | |
(is (= (char-score \L) 12)) | |
(is (= (char-score \I) 9)) | |
(is (= (char-score \N) 14))) | |
(deftest str-score-test | |
(is (= (str-score "COLIN") 53)) | |
(is (= (str-score "YUKIHO") 89))) | |
(deftest problem-22-test | |
(is (= (problem-22) 871198282))) |
clojure.data.csv
知りませんでした。よいですね。
最初 (clojure.string/split (slurp "names.txt") #",")
でよいのでは、と思いましたが、名前が "
で囲まれていることを忘れていました。
@tnoda のコードでは、read-string
による S式の文字列表現のデシリアライズが行なわれていますが、こちらも便利な機能ですね。勉強になります。
Clojure だけで完結する処理ならば、中間データとして JSON や XML ではなく S式を用いるのは、選択肢として大いにありだと思います。
Clojure だけで完結する処理ならば、中間データとして JSON や XML ではなく S式を用いるのは、選択肢として大いにありだと思います。
edn ですね.JSON よりも速いので,Clojure で使うだけなら迷うことはないですね.参考→ http://tnoda-clojure.tumblr.com/post/28499910150/collection-literals-instead-of-json (edn が発表される前に書いたもの)
変数が多いのをすこし気にしています。 @tnoda のコードはいつも -> などがうまく使われていてすっきりしている気がします。
->
などを使うと意図が見えにくくなるという欠点もありますよね。複数回使うからでなくて、説明のために変数に束縛するというのもありだと思います。
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
いつも必要十分, 簡潔, 明解なコードとテストでとても素敵です. 見習いたいです.
map-indexed
いいですね.手動で
(map vector foo (range))
みたいにしてた気がします. 今度からこれを使います.clojure.data.csv
も知りませんでした. 紹介ありがとうございます.こちらは今度からと言わず, 既存コードもこれを使うように直そうと思います.