## Programming Praxis – Same Five Digits

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