※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

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').