36 lines
1.2 KiB
Haskell
36 lines
1.2 KiB
Haskell
-- We shall say that an n-digit number is pandigital if it makes use of all the
|
||
-- digits 1 to n exactly once; for example, the 5-digit number, 15234, is 1
|
||
-- through 5 pandigital.
|
||
--
|
||
-- The product 7254 is unusual, as the identity, 39 × 186 = 7254, containing
|
||
-- multiplicand, multiplier, and product is 1 through 9 pandigital.
|
||
--
|
||
-- Find the sum of all products whose multiplicand/multiplier/product identity
|
||
-- can be written as a 1 through 9 pandigital.
|
||
--
|
||
-- HINT: Some products can be obtained in more than one way so be sure to only
|
||
-- include it once in your sum.
|
||
|
||
import Euler
|
||
|
||
partitions [] = [([],[])]
|
||
partitions (x:xs) = map (first (x:)) ps ++ map (second (x:)) ps
|
||
where ps = partitions xs
|
||
|
||
main = print $ sum $ nub $ do
|
||
(as, as') <- partitions [1..9]
|
||
guard $ not $ null as
|
||
(bs, cs) <- partitions as'
|
||
guard $ not $ null bs
|
||
guard $ not $ null cs
|
||
guard $ length as <= length bs
|
||
guard $ length as <= length cs
|
||
guard $ length bs <= length cs
|
||
guard $ length as + length bs >= length cs
|
||
x <- fromDigits <$> permutations as
|
||
y <- fromDigits <$> permutations bs
|
||
guard $ x < y
|
||
let p = x * y
|
||
guard $ sort (toDigits p) == cs
|
||
return p
|