Problem 22 「名前のスコア」 †
5000個以上の名前が書かれている46Kのテキストファイルを用いる. まずアルファベット順にソートせよ.
のち, 各名前についてアルファベットに値を割り振り, リスト中の出現順の数と掛け合わせることで, 名前のスコアを計算する.
たとえば, リストがアルファベット順にソートされているとすると, COLINはリストの938番目にある. またCOLINは 3 + 15 + 12 + 9 + 14 = 53 という値を持つ. よってCOLINは 938 × 53 = 49714 というスコアを持つ.
ファイル中の全名前のスコアの合計を求めよ.
(詳細はリンク先を参照のこと)
解法
テキストをPrologのリスト形式に変換して一気に読み込みます。
後はソートして一個一個の要素のスコアを計算して出力するだけです。
nameScore([],Score,Score):-!.
nameScore([C|Name],Score,Result):-
Score1 is Score+C-64,
nameScore(Name,Score1,Result).
score(No,Name,Result):-
nameScore(Name,0,Score),
Result is Score*No.
allScore(_,[],AllScore,AllScore):-!.
allScore(No,[Name|Names],AllScore,Result):-
score(No,Name,Score),
AllScore1 is AllScore+Score,
No1 is No+1,
allScore(No1,Names,AllScore1,Result).
myread(FN):-
open(FN,read,IS),
read_term(IS,Names,[]),
sort(Names,Names1),
allScore(1,Names1,0,Ans),
write(Ans),
close(IS).
main22:-myread('pe22.txt').
最終更新:2014年02月13日 18:42