Project Euler #022 – 名前のスコア

In: Project Euler

16 1月 2010

Project 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が使える言語だととっても楽チン。

blog comments powered by Disqus
Get Adobe Flash playerPlugin by wpburn.com wordpress themes

About this blog

私 manjilab のポータル的サイトになっております。日々気付いたこと、考えたこと、発表したいものを載せていきます。

Photostream

    Lisp indent 考察Lisp indent 考察Lisp indent 考察Lisp indent 考察Lisp indent 考察Tips to use Clojure(Lisp) with TextMateTips to use Clojure(Lisp) with TextMateTips to use Clojure(Lisp) with TextMate