open System.Collections.Generic
let groupConnected initId idTups =
let mergeGroups projectIds input =
(List.empty<SortedSet<_>>, input)
||> List.fold (fun groups x ->
let ids = projectIds x
match groups |> List.tryFind (fun g -> g.Overlaps ids) with
| Some g -> g.UnionWith ids
groups
| _ -> ids::groups)
idTups
|> mergeGroups (fun (a, b) -> SortedSet([| a; b |]))
|> mergeGroups id
|> List.sortBy (fun g -> g.Min)
|> Seq.mapi (fun i g -> initId + i, List.ofSeq g)
|> Map.ofSeq
do
let test tups =
tups |> groupConnected 100 |> printfn "%A"
stdout.WriteLine ()
test [(1M, 2M); (2M, 3M); (3M, 3M); (4M, 5M); (5M, 6M); (7M, 6M); (8M, 9M); (10M, 9M)]
test [(1M, 2M); (7M, 8M); (2M, 3M); (8M, 9M); (3M, 4M); (10M, 11M); (4M, 5M); (13M, 11M); (5M, 6M)]
test [(1, 1); (2, 18); (3, 3); (4, 5); (5, 24); (24, 6); (7, 6); (8, 9); (10, 9)]
b3BlbiBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYwoKbGV0IGdyb3VwQ29ubmVjdGVkIGluaXRJZCBpZFR1cHMgPQogICAgbGV0IG1lcmdlR3JvdXBzIHByb2plY3RJZHMgaW5wdXQgPQogICAgICAgIChMaXN0LmVtcHR5PFNvcnRlZFNldDxfPj4sIGlucHV0KQogICAgICAgIHx8PiBMaXN0LmZvbGQgKGZ1biBncm91cHMgeCAtPgogICAgICAgICAgICBsZXQgaWRzID0gcHJvamVjdElkcyB4CiAgICAgICAgICAgIG1hdGNoIGdyb3VwcyB8PiBMaXN0LnRyeUZpbmQgKGZ1biBnIC0+IGcuT3ZlcmxhcHMgaWRzKSB3aXRoCiAgICAgICAgICAgICAgICB8IFNvbWUgZyAtPiBnLlVuaW9uV2l0aCBpZHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwcwogICAgICAgICAgICAgICAgfCBfICAgICAgLT4gaWRzOjpncm91cHMpCiAgICBpZFR1cHMKICAgIHw+IG1lcmdlR3JvdXBzIChmdW4gKGEsIGIpIC0+IFNvcnRlZFNldChbfCBhOyBiIHxdKSkKICAgIHw+IG1lcmdlR3JvdXBzIGlkCiAgICB8PiBMaXN0LnNvcnRCeSAoZnVuIGcgLT4gZy5NaW4pCiAgICB8PiBTZXEubWFwaSAoZnVuIGkgZyAtPiBpbml0SWQgKyBpLCBMaXN0Lm9mU2VxIGcpCiAgICB8PiBNYXAub2ZTZXEKCmRvCiAgICBsZXQgdGVzdCB0dXBzID0KICAgICAgICB0dXBzIHw+IGdyb3VwQ29ubmVjdGVkIDEwMCB8PiBwcmludGZuICIlQSIKICAgICAgICBzdGRvdXQuV3JpdGVMaW5lICgpCiAgICB0ZXN0IFsoMU0sIDJNKTsgKDJNLCAzTSk7ICgzTSwgM00pOyAoNE0sIDVNKTsgKDVNLCA2TSk7ICg3TSwgNk0pOyAoOE0sIDlNKTsgKDEwTSwgOU0pXQogICAgdGVzdCBbKDFNLCAyTSk7ICg3TSwgOE0pOyAoMk0sIDNNKTsgKDhNLCA5TSk7ICgzTSwgNE0pOyAoMTBNLCAxMU0pOyAoNE0sIDVNKTsgKDEzTSwgMTFNKTsgKDVNLCA2TSldCiAgICB0ZXN0IFsoMSwgMSk7ICgyLCAxOCk7ICgzLCAzKTsgKDQsIDUpOyAoNSwgMjQpOyAoMjQsIDYpOyAoNywgNik7ICg4LCA5KTsgKDEwLCA5KV0K
map [(100, [1M; 2M; 3M]); (101, [4M; 5M; 6M; 7M]); (102, [8M; 9M; 10M])]
map
[(100, [1M; 2M; 3M; 4M; 5M; 6M]); (101, [7M; 8M; 9M]); (102, [10M; 11M; 13M])]
map
[(100, [1]); (101, [2; 18]); (102, [3]); (103, [4; 5; 6; 7; 24]);
(104, [8; 9; 10])]