2014年3月12日水曜日

プロジェクトオイラー問22

Problem 22 「名前のスコア」 

5000個以上の名前が書かれている46Kのテキストファイル filenames.txt を用いる. まずアルファベット順にソートせよ.
のち, 各名前についてアルファベットに値を割り振り, リスト中の出現順の数と掛け合わせることで, 名前のスコアを計算する.
たとえば, リストがアルファベット順にソートされているとすると, COLINはリストの938番目にある. またCOLINは 3 + 15 + 12 + 9 + 14 = 53 という値を持つ. よってCOLINは 938 × 53 = 49714 というスコアを持つ.
ファイル中の全名前のスコアの合計を求めよ.

ファイルなどの詳細はリンク先参照のこと。
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2022

解法
Prolog言語
データファイルはテキストエディタでリスト形式にしてから読み込んでいる。

name_score([],0):-!.
name_score([X|Xs],Result):-
       name_score(Xs,Re),
       Result is Re+X-64.

sum_score([],_,Sum,Sum):-!.
sum_score([Name|Names],No,Sum,Result):-
       !,
       name_score(Name,Score),
       Sum1 is Sum+Score*No,
       No1 is No+1,
       sum_score(Names,No1,Sum1,Result).

main22:-
        open('pe22.txt',read,IS),
        read_term(IS,Names,[]),
        close(IS),
        sort(Names,Names1),
        sum_score(Names1,1,0,Ans),

        write(Ans).

0 件のコメント:

コメントを投稿