In today’s Programming Praxis exercise, our goal is to solve a numeric riddle. Let’s get started, shall we?

Some imports:

import Data.List import qualified Data.List.Key as K

The relevant squares are the ones that consists only of the digits 1 through 5. The explanation as to why can be found in the provided solution.

squares :: [Integer] squares = filter (all (`elem` "12345") . show) . takeWhile (< 100000) $ map (^2) [100..]

The rest of the riddle can be solved with picking the correct element out of a list comprehension. Note the conditions that a < b and b < c. This prevents the same triple occurring in different permutations. I originally hadn’t included these, which is why I couldn’t get it working initially.

sameFive :: Maybe (Integer, Integer, Integer) sameFive = fmap (fst . head) . find (null . tail) . K.group snd $ K.sort snd [ ((a,b,c), findIndex (== 1) dc) | a <- squares, b <- squares, a < b, c <- squares, b < c , let dc = map length . group . sort $ show =<< [a,b,c] , sort dc == [1..5], and $ zipWith (/=) dc [1..5] ]

All that’s left to do is to see if we get the correct answer.

main :: IO () main = print sameFive