Sum and product puzzle: Difference between revisions

m
m (→‎{{header|Phix}}: syntax coloured)
Line 1,058:
Finally, as we expect and need only one solution, Haskell's lazy evaluation strategy will avoid wasted tests if we request only the first item from the possible solution stream.
<lang Haskell>import Data.List (intersect)
 
------------------ SUM AND PRODUCT PUZZLE ----------------
 
s1, s2, s3, s4 :: [(Int, Int)]
s1 =
[2 .. 100] >>=
>>= \x ->
[succ x + 1 .. 100] >>=
>>= \y ->
[ (x, y)
| x + y < 100 ]
]
 
s2 = filter (all ((1 /=) . length . mulEq) . sumEq) s1
add, mul :: (Int, Int) -> Int
add = uncurry (+)
 
s3 = filter ((1 ==) . length . (`intersect` s2) . mulEq) s2
mul = uncurry (*)
 
s4 = filter ((1 ==) . length . (`intersect` s3) . sumEq) s3
 
sumEq, mulEq :: (Int, Int) -> [(Int, Int)]
sumEq p = filter ((add p ==) . add) s1
 
mulEq p = filter ((mul p ==) . mul) s1
 
add, mul :: (Int, Int) -> Int
s2 = filter (all ((1 /=) . length . mulEq) . sumEq) s1
add = uncurry (+)
 
mul = uncurry (*)
s3 = filter ((1 ==) . length . (`intersect` s2) . mulEq) s2
 
s4 = filter ((1 ==) . length . (`intersect` s3) . sumEq) s3
 
-- TEST ---------------------------------------------- TEST -------------------------
main :: IO ()
main = print $ take 1 s4</lang>
9,655

edits