let findGroupings lst =
let rec findGroup input previous acc =
match input with
| [] -> acc
| (a,b)::t ->
match previous with
| [] -> if a >= b then
findGroup t [] acc
else
findGroup t [b;a] acc
| h::_ -> if a > h && a < b then
findGroup t (b::(a::previous)) acc
elif a > h && a >=b then
let full = List.rev (a::previous)
findGroup t [] (full::acc)
elif a >= b then
findGroup t [] ((List.rev previous)::acc)
elif a < h then
findGroup t [b;a] (previous::acc)
else // a = h and a < b
findGroup t (b::previous) acc
findGroup lst [] []
|> List.rev
do
let test tups =
tups |> findGroupings |> printfn "%A"
stdout.WriteLine ()
test [(1M, 2M); (2M, 3M); (3M, 3M); (4M, 5M); (5M, 6M); (7M, 6M); (8M, 9M); (10M, 9M)]
test [(1M, 2M); (3M, 3M); (4M, 5M); (7M, 6M); (8M, 9M); (10M, 9M); (5M, 6M); (2M, 3M)]
test [(1M, 2M); (7M, 8M); (2M, 3M); (8M, 9M); (3M, 4M); (10M, 11M); (4M, 5M); (13M, 11M); (5M, 6M)]
bGV0IGZpbmRHcm91cGluZ3MgbHN0ID0KICAgIGxldCByZWMgZmluZEdyb3VwIGlucHV0IHByZXZpb3VzIGFjYyA9CiAgICAgICAgbWF0Y2ggaW5wdXQgd2l0aAogICAgICAgIHwgW10gLT4gYWNjCiAgICAgICAgfCAoYSxiKTo6dCAtPiAKICAgICAgICAgICAgbWF0Y2ggcHJldmlvdXMgd2l0aAogICAgICAgICAgICB8IFtdIC0+IGlmIGEgPj0gYiB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRHcm91cCB0IFtdIGFjYwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgZmluZEdyb3VwIHQgW2I7YV0gYWNjCiAgICAgICAgICAgIHwgaDo6XyAtPiBpZiBhID4gaCAmJiBhIDwgYiB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRHcm91cCB0IChiOjooYTo6cHJldmlvdXMpKSBhY2MKICAgICAgICAgICAgICAgICAgICAgIGVsaWYgYSA+IGggJiYgYSA+PWIgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZnVsbCA9IExpc3QucmV2IChhOjpwcmV2aW91cykKICAgICAgICAgICAgICAgICAgICAgICAgZmluZEdyb3VwIHQgW10gKGZ1bGw6OmFjYykKICAgICAgICAgICAgICAgICAgICAgIGVsaWYgYSA+PSBiIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgZmluZEdyb3VwIHQgW10gKChMaXN0LnJldiBwcmV2aW91cyk6OmFjYykKICAgICAgICAgICAgICAgICAgICAgIGVsaWYgYSA8IGggdGhlbgogICAgICAgICAgICAgICAgICAgICAgICBmaW5kR3JvdXAgdCBbYjthXSAocHJldmlvdXM6OmFjYykKICAgICAgICAgICAgICAgICAgICAgIGVsc2UgLy8gYSA9IGggYW5kIGEgPCBiCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRHcm91cCB0IChiOjpwcmV2aW91cykgYWNjCiAgICBmaW5kR3JvdXAgbHN0IFtdIFtdCiAgICB8PiBMaXN0LnJldgoKZG8KICAgIGxldCB0ZXN0IHR1cHMgPQogICAgICAgIHR1cHMgfD4gZmluZEdyb3VwaW5ncyB8PiBwcmludGZuICIlQSIKICAgICAgICBzdGRvdXQuV3JpdGVMaW5lICgpCiAgICB0ZXN0IFsoMU0sIDJNKTsgKDJNLCAzTSk7ICgzTSwgM00pOyAoNE0sIDVNKTsgKDVNLCA2TSk7ICg3TSwgNk0pOyAoOE0sIDlNKTsgKDEwTSwgOU0pXQogICAgdGVzdCBbKDFNLCAyTSk7ICgzTSwgM00pOyAoNE0sIDVNKTsgKDdNLCA2TSk7ICg4TSwgOU0pOyAoMTBNLCA5TSk7ICg1TSwgNk0pOyAoMk0sIDNNKV0KICAgIHRlc3QgWygxTSwgMk0pOyAoN00sIDhNKTsgKDJNLCAzTSk7ICg4TSwgOU0pOyAoM00sIDRNKTsgKDEwTSwgMTFNKTsgKDRNLCA1TSk7ICgxM00sIDExTSk7ICg1TSwgNk0pXQ==