Project Euler 38

192を1, 2, 3で掛けてみよう.

   192 × 1 = 192
   192 × 2 = 384
   192 × 3 = 576

積を連結することで1から9のPandigital数 192384576 が得られる. 192384576を 192と(1,2,3)の連結積と呼ぶ.

同じようにして, 9を1,2,3,4,5と掛け連結することでPandigital数918273645が得られる. これは9と(1,2,3,4,5)との連結積である.

整数と(1,2,...,n) (n > 1) との連結積として得られる9桁のPandigital数の中で最大のものを答えよ.
(* xと (1,2,...,n)の連結積 *)
cProduct[x_, n_] :=
 Module[{nList, productedList, ret},
  
  nList = Range[n];
  productedList = Map[x * # &, nList];
  
  ret = FromDigits[Flatten[Map[IntegerDigits[#] &,
      productedList]]];
  
  Return[ret];
  ]


(* pandigital数かどうか *) 
isPandigital[x_] :=
  If[Sort[IntegerDigits[x]] == Range[9],
   True, False];


num = 0;
For[i = 1, i < 10000, i++,
 For[n = 2, n <= 9, n++,
  tmp = cProduct[i, n];
  If[! isPandigital[tmp], Break[]];
  
  If[tmp > num, num = tmp];
  
  ]
 ]
num


問題のconditionがかなりめんどくさいので、連結数を返す関数とPandigital数かどうかを判定する関数をそれぞれ作成。
計算速度も結構いい感じです。