{- | Description: An arithmetic puzzle Copyright: Copyright (C) 2021 Yoo Chung License: GPL-3.0-or-later Maintainer: dev@chungyc.org Part of Ninety-Nine Haskell "Problems". Some solutions are in "Solutions.P93". -} module Problems.P93 (arithmeticPuzzle) where import qualified Solutions.P93 as Solution -- $setup -- >>> import Data.List (sort) {- | Given a list of positive integer numbers, find a correct way of inserting the arithmetic signs such that the result is a correct equation. For example, with the list of numbers @[2,3,5,7,11]@, we can form the equations @2-3+5+7=11@ or @2=(3*5+7)/11@. The arithmetic signs to insert are: * @+@ : addition * @-@ : subtraction * @*@ : multiplication * @/@ : division * @=@ : equality * @(@, @)@ : parentheses Arithmetic operations are only binary, e.g., @-4@ should not be included. Division should be interpreted as operating on rationals, e.g., \(3/5 = 6/10\) but \(3/5 \neq 0\), and division by zero should be avoided. Parentheses should be inserted only when the default precedence rules need to be overridden. Equality should be inserted exactly once. === Examples >>> mapM_ putStrLn $ sort $ arithmeticPuzzle [2,3,5,7,11] 2 = (3*5+7)/11 2 = 3-(5+7)+11 2 = 3-(5+7-11) 2 = 3-5-(7-11) 2 = 3-5-7+11 2*(3-5) = 7-11 2-(3-(5+7)) = 11 2-(3-5)+7 = 11 2-(3-5-7) = 11 2-3+5+7 = 11 -} arithmeticPuzzle :: [Integer] -> [String] arithmeticPuzzle :: [Integer] -> [String] arithmeticPuzzle = [Integer] -> [String] Solution.arithmeticPuzzle