fork download
  1. let combine (a, a') (b, b') =
  2. seq {
  3. yield a + b, sprintf "(%s + %s)" a' b'
  4. if Seq.last a' <> ')' && Seq.head b' <> '('
  5. then yield a * 10 + b, sprintf "%s%s" a' b' else ()
  6. yield a - b, sprintf "(%s - %s)" a' b'
  7. yield a * b, sprintf "(%s * %s)" a' b'
  8. if b <> 0 && a / b * b = a
  9. then yield a / b, sprintf "(a / b)" else ()
  10. }
  11.  
  12. let rec solve xs =
  13. seq {
  14. match xs with
  15. | a :: b :: [] -> yield! combine a b
  16. | a :: b :: t -> yield! combine a b |> Seq.collect (fun e -> solve (e :: t))
  17. yield! solve (b :: t) |> Seq.collect (fun t -> solve (a :: t :: []))
  18. | x :: [] -> yield x
  19. | [] -> ()
  20. }
  21.  
  22. let f xs n =
  23. xs |> List.map (fun e -> e, string e)
  24. |> solve
  25. |> Seq.filter (fst >> ((=)n))
  26.  
  27. do
  28. for x, e in f [8; 9; 4; 3; 9; 2] 100 do
  29. printfn "%A = %s" x e
Success #stdin #stdout 0.29s 26616KB
stdin
Standard input is empty
stdout
100 = (((89 - 4) - 3) + (9 * 2))
100 = ((89 - 4) - (3 - (9 * 2)))
100 = (89 - ((4 + 3) - (9 * 2)))
100 = (89 + (((4 - 3) * 9) + 2))
100 = (89 + ((4 - 3) * (9 + 2)))
100 = (89 - (4 + (3 - (9 * 2))))
100 = (((8 * 9) + 4) + ((3 + 9) * 2))
100 = ((8 * 9) + (4 + ((3 + 9) * 2)))
100 = (8 + ((((9 + 4) - 3) * 9) + 2))