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

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2022
Problem 22 「名前のスコア」 †
名前の書かれたテキストファイルを読み込んで、スコアを計算する問題。





ファイルをリストにして読み込んで、ソートし、順番にスコアを計算していくだけです。

ファイルが巨大になった場合、全ての名前を一つの木構造に圧縮してから計算するとよいでしょう。


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,[]),
  msort(Names,Names1),
  allScore(1,Names1,0,Ans),
  write(Ans),
  close(IS).

main22:-myread('pe22.txt').
最終更新:2014年12月05日 02:17