Problem 17 「数字の文字数」 †
1 から 5 までの数字を英単語で書けば one, two, three, four, five であり, 全部で 3 + 3 + 5 + 4 + 4 = 19 の文字が使われている.
では 1 から 1000 (one thousand) までの数字をすべて英単語で書けば, 全部で何文字になるか.
注: 空白文字やハイフンを数えないこと. 例えば, 342 (three hundred and forty-two) は 23 文字, 115 (one hundred and fifteen) は20文字と数える. なお, "and" を使用するのは英国の慣習.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2017
解法
Prolog言語
マトリックスはmemberよりもnth0で配列風にアクセスしたほうがよかったかも。
and_add(L3,L21,3):-L3>0,L21>0,!.
マトリックスはmemberよりもnth0で配列風にアクセスしたほうがよかったかも。
and_add(L3,L21,3):-L3>0,L21>0,!.
and_add(_,_,0):-!.
calc1(K2,K1,Len):-K21 is K2*10+K1,K21<20,!,calc(K21,Len).
calc1(K2,K1,Len21):-!,ten(K2,L1),calc(K1,L2),Len21 is L1+L2.
calc(1000,11):-!.
calc(0,0):-!.
calc(N,3):-member(N,[1,2,6,10]),!.
calc(N,4):-member(N,[4,5,9]),!.
calc(N,5):-member(N,[3,7,8]),!.
calc(N,6):-member(N,[11,12]),!.
calc(N,7):-member(N,[15,16]),!.
calc(N,8):-member(N,[13,14,18,19]),!.
calc(N,9):-member(N,[17]),!.
calc(N,Len):-
K3 is N//100,
K2 is (N//10) mod 10,
K1 is N mod 10,
hund(K3,L3),
calc1(K2,K1,Add21),
and_add(K3,Add21,AndAdd),
Len is L3+Add21+AndAdd.
ten(0,0):-!.
ten(N,6):-member(N,[2,3,8,9]),!.
ten(N,5):-member(N,[4,5,6]),!.
ten(N,7):-member(N,[7]),!.
hund(0,0):-!.
hund(N,Len):-calc(N,L),Len is L+7.
sum([],0):-!.
sum([X|Xs],Result):-
!,
sum(Xs,Re),
Result is Re+X.
lens(Len):-
between(1,1000,N),
calc(N,Len).
main17:-
findall(L,lens(L),Lens),
sum(Lens,Ans),
write(Ans).
0 件のコメント:
コメントを投稿