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