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

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2089
Problem 89 「ローマ数字」 †
ローマ数字は同じ数でも色々な書き方がある。
最短でない書き方で表せれたローマ数字が幾つか与えられるので、それを最短で書きなおした場合何文字節約できるか答えよ。

10進になおして最短で書いた場合の長さを計算するだけです。


len(N,Len):-
	nth0(N,[0,1,2,3,2,1,2,3,4,2,-100],Len).

calcRest(0,Len,_,Len):-!.

calcRest(N,Len,Mod,Result):-
	N1 is N // Mod,
	len(N1,Add),
	N2 is N mod Mod,
	Len1 is Len+Add,
	Mod1 is Mod//10,
	calcRest(N2,Len1,Mod1,Result).

calc1000(N,Result):-
	Len1 is N//1000,
	N1 is N mod 1000,
	calcRest(N1,Len1,100,Result). 

num2([73,86],4):-!.
num2([73,88],9):-!.
num2([88,76],40):-!.
num2([88,67],90):-!.
num2([67,68],400):-!.
num2([67,77],900):-!. 

num(73,1):-!.
num(86,5):-!.
num(88,10):-!.
num(76,50):-!.
num(67,100):-!.
num(68,500):-!.
num(77,1000):-!.

to_num([],Num,Num):-!.
to_num([X,Y|Rest],Num,Result):-
	num2([X,Y],Add),
	!,
	Num1 is Num+Add,
	to_num(Rest,Num1,Result).
to_num([X|Rest],Num,Result):-
	!,
	num(X,Add),
	Num1 is Num+Add,
	to_num(Rest,Num1,Result).

sum([],Sum,Sum):-!.
sum([X|Xs],Sum,Result):-
	Sum1 is Sum+X,
	sum(Xs,Sum1,Result).

sumLen([],Sum,Sum):-!.
sumLen([X|Xs],Sum,Result):-
	length(X,Len),
 	Sum1 is Sum+Len,
	sumLen(Xs,Sum1,Result).


main:-
	see('pe89.txt'),
	read(Data),
	seen,
	sumLen(Data,0,SumLen),
	findall(E,
 		(member(X,Data)
		,to_num(X,0,Num)
		,calc1000(Num,E))
	       ,Es),
	sum(Es,0,Ans),
 	Ans1 is SumLen-Ans,
	write(Ans1).
最終更新:2014年12月19日 09:13