いわゆる卍研究所。
In: Project Euler
16 1月 2010Project EulerをClojureでおさらいシリーズ。
Problem 22
日本語訳:
5000個以上の名前を含む46Kのテキストファイル name.txt を用いる。 まずアルファベット順にソートすること。 そしてそれぞれの名前のについてアルファベットの数値とリスト内での順番を掛けて名前のスコアを計算する。
たとえばアルファベット順にソートされたリストの938番目に COLIN があるとすると、COLINは 3 + 15 + 12 + 9 + 14 = 53 であるので 938 × 53 = 49714 がスコアとなる。
ファイルに含まれるすべての名前のスコアの合計を求めよ。
外部ファイルからデータを読み込む最初の問題。
以前Rubyで解いたもの:
#!/usr/bin/env ruby f = open('names.txt') names_orig = f.read f.close def score_base(name) name.unpack("C*").inject(0){|s,x| s + x - 64} end names = names_orig.split(',').map{|name| name.tr('"','')}.sort p names.enum_for(:each_with_index).map{|name,i| score_base(name) * (i+1)}.inject(:+)
Clojureではこのように:
(ns euler.p022) (def names (slurp "names.txt")) (defn name-score "Return name score. ex) COLIN at 938th in list -> 938 * (3 + 15 + 12 + 9 + 14) = 49714" [pos name] (* pos (reduce + (map #(-> % int (- 64)) name)))) (println "Anster : " (reduce + (map name-score (iterate inc 1) (sort (re-seq #"\w+" names)))))
mapが使える言語だととっても楽チン。
私 manjilab のポータル的サイトになっております。日々気付いたこと、考えたこと、発表したいものを載せていきます。