2014年3月14日金曜日

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

Problem 32 「パンデジタル積」 

すべての桁に 1 から n が一度だけ使われている数をn桁の数がパンデジタル (pandigital) であるということにしよう: 例えば5桁の数 15234 は1から5のパンデジタルである.
7254 は面白い性質を持っている. 39 × 186 = 7254 と書け, 掛けられる数, 掛ける数, 積が1から9のパンデジタルとなる.
掛けられる数/掛ける数/積が1から9のパンデジタルとなるような積の総和を求めよ.
HINT: いくつかの積は, 1通り以上の掛けられる数/掛ける数/積の組み合わせを持つが1回だけ数え上げよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2032


解法
1桁*4桁=4桁

2桁*3桁=4桁。
しかないことがわかりますので
A*B=C
として
AとBの全パターンを試すだけです。
Cは文字列に直して中身をソートして使ってない数と同じになればそれは条件を満たします。
後は重複分をsortで削除してAcceptとなります。

perm([_],[_,_,_,_]).
perm([_,_],[_,_,_]).

set_num([],Nums,Nums):-!.
set_num([X|Xs],Nums,Result):-
      select(X,Nums,Nums1),
      set_num(Xs,Nums1,Result).

search(C):-
      Nums=[49,50,51,52,53,54,55,56,57],
      perm(List1,List2),
      set_num(List1,Nums,Nums1),
      set_num(List2,Nums1,Nums2),
      number_codes(A,List1),
      number_codes(B,List2),
      C is A*B,
      number_codes(C,List3),
      msort(List3,Nums2).
sum([],0):-!.
sum([X|Xs],Result):-
      !,
      sum(Xs,Re),
      Result is Re+X.


main32:-
      findall(C,search(C),List),
      sort(List,List1),
      sum(List1,Ans),
      write(Ans).

0 件のコメント:

コメントを投稿