import Control.Monad import Text.Printf data E = Sevens Int | E :+: E | E :-: E | E :*: E | E :/: E | Neg E eval :: Int -> E -> Double eval m (Sevens k) = fromIntegral $ (iterate (\x -> m*x + 7) 0) !! k eval m (a :+: b) = (eval m a) + (eval m b) eval m (a :-: b) = (eval m a) - (eval m b) eval m (a :*: b) = (eval m a) * (eval m b) eval m (a :/: b) = (eval m a) / (eval m b) eval m (Neg a) = -(eval m a) showE :: Int -> E -> String showE pe = s pe where s pe (Sevens k) = take k (repeat '7') s pe (a:+:b) = helper pe 1 a b "+" s pe (a:-:b) = helper pe 2 a b "-" s pe (a:*:b) = helper pe 3 a b "*" s pe (a:/:b) = helper pe 4 a b "/" s pe (Neg a) = "-" ++ (s 2 a) helper pe p a b op | p > pe = (s p a) ++ op ++ (s p b) | otherwise = "(" ++ (s p a) ++ op ++ (s p b) ++ ")" instance Show E where show = showE 0 anyE :: Int -> [E] anyE n = let xs = f n in xs ++ map Neg xs where f n = (Sevens n) : do k <- [1..n-1] a <- f k b <- f (n-k) op <- if k <= n-k then [ (:+:), (:-:), (:*:), (:/:) ] else [ (:-:), (:/:) ] return (op a b) main = mapM_ (putStrLn . (\(a,b) -> printf "%3d: %s" a (show b))) xs where xs = do let es = anyE 5 m <- [8..999] e <- es guard ((abs (eval m e - fromIntegral (m*m))) < 1e-7) return (m,e)