let combine (a, a') (b, b') =
seq {
yield a
+ b
, sprintf "(%s + %s)" a
' b' if Seq.last a' <> ')' && Seq.head b' <> '('
then yield a
* 10 + b
, sprintf "%s%s" a
' b' else () yield a
- b
, sprintf "(%s - %s)" a
' b' yield a
* b
, sprintf "(%s * %s)" a
' b' if b <> 0 && a / b * b = a
then yield a
/ b
, sprintf "(a / b)" else () }
let rec solve xs =
seq {
match xs with
| a :: b :: [] -> yield! combine a b
| a :: b :: t -> yield! combine a b |> Seq.collect (fun e -> solve (e :: t))
yield! solve (b :: t) |> Seq.collect (fun t -> solve (a :: t :: []))
| x :: [] -> yield x
| [] -> ()
}
let f xs n =
xs |> List.map (fun e -> e, string e)
|> solve
|> Seq.filter (fst >> ((=)n))
do
for x, e in f [8; 9; 4; 3; 9; 2] 100 do
printfn "%A = %s" x e
bGV0IGNvbWJpbmUgKGEsIGEnKSAoYiwgYicpID0gCiAgICBzZXEgeyAKICAgICAgICB5aWVsZCBhICsgYiwgc3ByaW50ZiAiKCVzICsgJXMpIiBhJyBiJwogICAgICAgIGlmIFNlcS5sYXN0IGEnIDw+ICcpJyAmJiBTZXEuaGVhZCBiJyA8PiAnKCcgCiAgICAgICAgICAgICAgICB0aGVuIHlpZWxkIGEgKiAxMCArIGIsIHNwcmludGYgIiVzJXMiIGEnIGInIGVsc2UgKCkKICAgICAgICB5aWVsZCBhIC0gYiwgc3ByaW50ZiAiKCVzIC0gJXMpIiBhJyBiJwogICAgICAgIHlpZWxkIGEgKiBiLCBzcHJpbnRmICIoJXMgKiAlcykiIGEnIGInCiAgICAgICAgaWYgYiA8PiAwICYmIGEgLyBiICogYiA9IGEKICAgICAgICAgICAgICAgIHRoZW4geWllbGQgYSAvIGIsIHNwcmludGYgIihhIC8gYikiIGVsc2UgKCkKICAgICAgICB9IAoKbGV0IHJlYyBzb2x2ZSB4cyA9IAogICAgc2VxIHsKICAgICAgICBtYXRjaCB4cyB3aXRoCiAgICAgICAgfCBhIDo6IGIgOjogW10gLT4geWllbGQhIGNvbWJpbmUgYSBiCiAgICAgICAgfCBhIDo6IGIgOjogdCAgLT4geWllbGQhIGNvbWJpbmUgYSBiIHw+IFNlcS5jb2xsZWN0IChmdW4gZSAtPiBzb2x2ZSAoZSA6OiB0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCEgc29sdmUgKGIgOjogdCkgfD4gU2VxLmNvbGxlY3QgKGZ1biB0IC0+IHNvbHZlIChhIDo6IHQgOjogW10pKQogICAgICAgIHwgeCA6OiBbXSAgICAgIC0+IHlpZWxkIHgKICAgICAgICB8IFtdICAgICAgICAgICAtPiAoKQogICAgICAgIH0KCmxldCBmIHhzIG4gPSAKICAgIHhzIHw+IExpc3QubWFwIChmdW4gZSAtPiBlLCBzdHJpbmcgZSkgCiAgICAgICB8PiBzb2x2ZQogICAgICAgfD4gU2VxLmZpbHRlciAoZnN0ID4+ICgoPSluKSkKCmRvCiAgICBmb3IgeCwgZSBpbiBmIFs4OyA5OyA0OyAzOyA5OyAyXSAxMDAgZG8gCiAgICAgICAgcHJpbnRmbiAiJUEgPSAlcyIgeCBl