2014年3月11日火曜日

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

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,!.
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 件のコメント:

コメントを投稿