0votos

1 + 2 + 34 – 5 + 67 – 8 + 9 = 100 en Haskell

por josejuan hace 4 años

Para 3^8 combinaciones bien podemos recorrerlas todas XD

Encontrar todas las combinaciones tal que insertando + - o nada entre los números 1,2,...,9 (en este orden) dé como resultado 100 exactamente

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import Data.Map (empty) 
import Control.Applicative ((<$>)) 
import Text.Parsec.Expr.Math 
 
data E = S | R | C -- sumar, restar, concatenar 
 
sumen :: Int -> [[E]] 
sumen x = filter ((x==).evaluar) (mapM (const [S,R,C]) [1..8]) 
 
 
-- Imprime una determinada combinación 
instance Show E where { show S = "+"; show R = "-"; show C = "" } 
showEs es = concat $ zipWith (:) ['1'..'9'] $ map show $ es ++ [C] 
 
-- evalua una combinación y obtiene el resultado 
evaluar es = floor x where Right (Just x) = (evaluate Data.Map.empty . Just) <$> parse (showEs es) 
 
 
 
 
{- 
 
> mapM_ (print.showEs) (sumen 100) 
"1+2+3-4+5+6+78+9" 
"1+2+34-5+67-8+9" 
"1+23-4+5+6+78-9" 
"1+23-4+56+7+8+9" 
"12+3+4+5-6-7+89" 
"12+3-4+5+67+8+9" 
"12-3-4+5-6+7+89" 
"123+4-5+67-89" 
"123+45-67+8-9" 
"123-4-5-6-7+8-9" 
"123-45-67+89" 
 
-} 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.