Set consolidation: Difference between revisions

Added Wren
(Added Wren)
Line 2,494:
AB,CD,DB = ABCD , - , -
HIK,AB,CD,DB,FGH = HIKFG , ABCD , - , - , -
</pre>
 
=={{header|Wren}}==
{{trans|Kotlin}}
{{libheader|Wren-set}}
Note that (as implemented in the above module) it is not possible to have a 'Set of Sets' because Set elements can only be certain primitives which can act as Map keys. However, you can have a List of Sets and so that's what we use here.
 
As Sets are Map-based, iteration (and hence printing) order are undefined.
<lang ecmascript>import "/set" for Set
 
var consolidateSets = Fn.new { |sets|
var size = sets.count
var consolidated = List.filled(size, false)
var i = 0
while (i < size - 1) {
if (!consolidated[i]) {
while (true) {
var intersects = 0
for (j in i+1...size) {
if (!consolidated[j]) {
if (!sets[i].intersect(sets[j]).isEmpty) {
sets[i].addAll(sets[j])
consolidated[j] = true
intersects = intersects + 1
}
}
}
if (intersects == 0) break
}
}
i = i + 1
}
return (0...size).where { |i| !consolidated[i] }.map { |i| sets[i] }.toList
}
 
var unconsolidatedSets = [
[Set.new(["A", "B"]), Set.new(["C", "D"])],
[Set.new(["A", "B"]), Set.new(["B", "D"])],
[Set.new(["A", "B"]), Set.new(["C", "D"]), Set.new(["D", "B"])],
[Set.new(["H", "I", "K"]), Set.new(["A", "B"]), Set.new(["C", "D"]),
Set.new(["D", "B"]), Set.new(["F", "G", "H"])]
]
for (sets in unconsolidatedSets) {
System.print("Unconsolidated: %(sets)")
System.print("Cosolidated : %(consolidateSets.call(sets))\n")
}</lang>
 
{{out}}
<pre>
Unconsolidated: [<B, A>, <C, D>]
Cosolidated : [<B, A>, <C, D>]
 
Unconsolidated: [<B, A>, <D, B>]
Cosolidated : [<D, B, A>]
 
Unconsolidated: [<B, A>, <C, D>, <D, B>]
Cosolidated : [<C, D, B, A>]
 
Unconsolidated: [<I, H, K>, <B, A>, <C, D>, <D, B>, <G, H, F>]
Cosolidated : [<I, G, H, F, K>, <C, D, B, A>]
</pre>
 
9,488

edits