fork download
  1. data E = Sevens Int | E :+: E | E :-: E | E :*: E | E :/: E | Neg E
  2.  
  3. eval :: E -> Double
  4. eval (Sevens k) = (iterate (\x -> 14*x + 7) 0) !! k
  5. eval (a :+: b) = (eval a) + (eval b)
  6. eval (a :-: b) = (eval a) - (eval b)
  7. eval (a :*: b) = (eval a) * (eval b)
  8. eval (a :/: b) = (eval a) / (eval b)
  9. eval (Neg a) = -(eval a)
  10.  
  11. showE :: Int -> E -> String
  12. showE pe = s pe
  13. where s pe (Sevens k) = take k (repeat '7')
  14. s pe (a:+:b) = helper pe 1 a b "+"
  15. s pe (a:-:b) = helper pe 2 a b "-"
  16. s pe (a:*:b) = helper pe 3 a b "*"
  17. s pe (a:/:b) = helper pe 4 a b "/"
  18. s pe (Neg a) = "-" ++ (s 2 a)
  19. helper pe p a b op
  20. | p > pe = (s p a) ++ op ++ (s p b)
  21. | otherwise = "(" ++ (s p a) ++ op ++ (s p b) ++ ")"
  22.  
  23. instance Show E where
  24. show = showE 0
  25.  
  26. anyE :: Int -> [E]
  27. anyE n = let xs = f n in xs ++ map Neg xs
  28. where f n = (Sevens n) : do
  29. k <- [1..n-1]
  30. a <- f k
  31. b <- f (n-k)
  32. op <- if k <= n-k then [ (:+:), (:-:), (:*:), (:/:) ]
  33. else [ (:-:), (:/:) ]
  34. return (op a b)
  35.  
  36. main = mapM_ print (filter check (anyE 5))
  37. where check e = (abs ((eval e) - 14*14)) < 1e-7
  38.  
Success #stdin #stdout 0s 6268KB
stdin
Standard input is empty
stdout
7*(7+(7+(7+7)))
7*((7+7)+(7+7))