fork download
  1. import Control.Monad
  2. import Text.Printf
  3.  
  4. data E = Sevens Int | E :+: E | E :-: E | E :*: E | E :/: E | Neg E
  5.  
  6. eval :: Int -> E -> Double
  7. eval m (Sevens k) = fromIntegral $ (iterate (\x -> m*x + 7) 0) !! k
  8. eval m (a :+: b) = (eval m a) + (eval m b)
  9. eval m (a :-: b) = (eval m a) - (eval m b)
  10. eval m (a :*: b) = (eval m a) * (eval m b)
  11. eval m (a :/: b) = (eval m a) / (eval m b)
  12. eval m (Neg a) = -(eval m a)
  13.  
  14. showE :: Int -> E -> String
  15. showE pe = s pe
  16. where s pe (Sevens k) = take k (repeat '7')
  17. s pe (a:+:b) = helper pe 1 a b "+"
  18. s pe (a:-:b) = helper pe 2 a b "-"
  19. s pe (a:*:b) = helper pe 3 a b "*"
  20. s pe (a:/:b) = helper pe 4 a b "/"
  21. s pe (Neg a) = "-" ++ (s 2 a)
  22. helper pe p a b op
  23. | p > pe = (s p a) ++ op ++ (s p b)
  24. | otherwise = "(" ++ (s p a) ++ op ++ (s p b) ++ ")"
  25.  
  26. instance Show E where
  27. show = showE 0
  28.  
  29. anyE :: Int -> [E]
  30. anyE n = let xs = f n in xs ++ map Neg xs
  31. where f n = (Sevens n) : do
  32. k <- [1..n-1]
  33. a <- f k
  34. b <- f (n-k)
  35. op <- if k <= n-k then [ (:+:), (:-:), (:*:), (:/:) ]
  36. else [ (:-:), (:/:) ]
  37. return (op a b)
  38.  
  39. main = mapM_ (putStrLn . (\(a,b) -> printf "%3d: %s" a (show b))) xs
  40. where xs = do let es = anyE 5
  41. m <- [8..999]
  42. e <- es
  43. guard ((abs (eval m e - fromIntegral (m*m))) < 1e-7)
  44. return (m,e)
  45.  
Success #stdin #stdout 2.47s 6360KB
stdin
Standard input is empty
stdout
  8: (7+7*77)/7
 14: 7*(7+(7+(7+7)))
 14: 7*((7+7)+(7+7))
 21: 7*(7+(7+7*7))
 21: 7*((7+7)+7*7)
 21: 7*(7*7+(7+7))
 28: (7+7)*(7+7*7)
 42: 7*(77-7*7)
 42: -7*(7*7-77)
 49: 7*77-7*7
 49: -(7*7-7*77)
 50: 7/7+7*77
 56: 7*(77+7*7)
 56: 7*(7*7+77)
 98: (7+7)*(77-7)
 98: -(7+7)*(7-77)
343: 7*(7*(77-7))
343: (7*7)*(77-7)
343: -7*(7*(7-77))
343: -(7*7)*(7-77)