Problem 22 - 名前のスコア
ちょっとおサボリしちゃった。
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
わーい。