euler/Problem032.hs

36 lines
1.2 KiB
Haskell
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 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