192に1,2,3をかけると192 x 1 = 192, 192 x 2 = 384, 192 x 3 = 576となる。
これらを連結した数は192384576は1から9の数字を一つずつ含む数である。ここ で192384576を192と(1,2,3)の連結積と呼ぶことにする。
同様のことは9に1,2,3,4,5をかけることでも実現できる。918273645は9と (1,2,3,4,5)の連結積である。
整数と(1,2,…,n)の連結積で1から9の数字を一つずつ含むものの最大値を求め よ。ただし、n>1とする。
数は各桁の数のリストで扱う。1から9の数字を一つずつ使ったものかどうかの 判定は関数isPandigitalで行う。ここでは数をリストで表しているので、sort したものが1から9のリストになっているかで判定できる。数nに0からiまでかけ た積を連結したリストを求める関数をconcatProductsとする。再帰的にリスト を連結することで実現している。isPandigitalを満たすのはconcatProductsの 結果が9桁の場合のみであるが、そうなる場合を手でソース上に列挙して解を求 める。
euler038 = maximum $ map listToInt $ filter isPandigital
([concatProducts 2 n | n <- [5000..9999]]
++ [concatProducts 3 n | n <- [100..333]]
++ [concatProducts 4 n | n <- [25..33]]
++ [concatProducts 5 n | n <- [5..9]]
++ [concatProducts 6 n | n <- [3]])
where isPandigital n = sort n == [1..9]
concatProducts i n
| i == 0 = []
| otherwise = concatProducts (i - 1) n ++ intToList (n * i)
