Problem 22 - 名前のスコア

ちょっとおサボリしちゃった。

Problem 22 - PukiWiki

5000個以上の名前が書かれている46Kのテキストファイル names.txt を用いる. まずアルファベット順にソートせよ.

のち, 各名前についてアルファベットに値を割り振り, リスト中の出現順の数と掛け合わせることで, 名前のスコアを計算する.

たとえば, リストがアルファベット順にソートされているとすると, COLINはリストの938番目にある. またCOLINは3 + 15 + 12 + 9 + 14 = 53という値を持つ. よってCOLINは938 × 53 = 49714というスコアを持つ.

ファイル中の全名前のスコアの合計を求めよ.

まずはデータをダウンロードしてきてっと。シェルスクリプトで加工。

% (echo "("; tr , '\n' < problem22.txt | sort; echo ")") > problem22_data.txt

ソート&リストにして、データを読み込む。

(define data (call-with-input-file "problem22_data.txt" read))

後はスコアを計算する。

(define (problem22 data)
  (define (calc name)
    (fold (lambda (c acc)
            (+ 1 (- (char->integer c) (char->integer #\A))
               acc))
          0
          (string->list name)))
  (define (iter n data)
    (if (null? data)
        0
        (+ (* n (calc (car data)))
           (iter (+ n 1) (cdr data)))))
  (iter 1 data))


(problem22 data) ; 871198282

わーい。