Set consolidation: Difference between revisions

Updated D entries
m (→‎{{header | Mathematica}}: close <pre> tag)
(Updated D entries)
Line 373:
 
dchar[][] consolidate(dchar[][] sets) {
foreach (set; sets) set.sort;
}set.sort;
for (size_t i = 0; i < sets.length - 1; i++) {
 
if (sets[i].empty)
foreach (i, ref si; sets[0 .. $ - 1]) {
if (sets[i]si.empty)
continue;
forforeach (size_tref j =sj; sets[i + 1; j < sets.length;. j++$]) {
if (sets[j]!sj.empty && !si.setIntersection(sj).empty) {
continuesj = si.setUnion(sj).uniq.array;
if (!setIntersection(sets[i], sets[j]).empty) { si = null;
sets[j] = uniq(setUnion(sets[i], sets[j])).array();
sets[i] = null;
}
}
}
 
return sets.filter!"!a.empty"(sets).array();
}
 
void main() {
dchar[][] sets = [['A', 'B'], ['C','D']].consolidate.writeln;
writeln(consolidate(sets));
 
sets = [['A','B'], ['B','D']].consolidate.writeln;
writeln(consolidate(sets));
 
sets = [['A','B'], ['C','D'], ['D','B']].consolidate.writeln;
writeln(consolidate(sets));
 
sets = [['H','I','K'], ['A','B'], ['C','D'], ['D','B'], ['F','G','H']];
writeln( ['D','B'], ['F','G','H']].consolidate(sets)).writeln;
}</lang>
{{out}}
<pre>["AB", "CD"]
["ABD"]
Line 411 ⟶ 409:
 
dchar[][] consolidate(dchar[][] sets) {
foreach (set; sets) set.sort;
set.sort;
 
dchar[][] consolidateR(dchar[][] s) {
if (s.length < 2)
Line 417:
auto r = [s[0]];
foreach (x; consolidateR(s[1 .. $])) {
if (!setIntersection(r[0], .setIntersection(x).empty) {
r[0] = uniq(setUnion(r[0], .setUnion(x)).uniq.array();
} else r ~= x;
sets[i]r ~= nullx;
}
return r;
}
 
return consolidateR(sets);
}
 
void main() {
dchar[][] sets = [['A', 'B'], ['C','D']].consolidate.writeln;
writeln(consolidate(sets));
 
sets = [['A','B'], ['B','D']].consolidate.writeln;
writeln(consolidate(sets));
 
sets = [['A','B'], ['C','D'], ['D','B']].consolidate.writeln;
writeln(consolidate(sets));
 
sets = [['H','I','K'], ['A','B'], ['C','D'], ['D','B'], ['F','G','H']];
writeln( ['D','B'], ['F','G','H']].consolidate(sets)).writeln;
}</lang>
<pre>["AB", "CD"]