Set consolidation: Difference between revisions

→‎{{header|D}}: added recursive version
(→‎{{header|D}}: added recursive version)
Line 371:
{{trans|Go}}
<lang d>import std.stdio, std.algorithm, std.array;
 
dchar[][] consolidate(dchar[][] sets) {
foreach (set; sets) set.sort;
for (size_t i = 0; i < sets.length - 1; i++) {
if (sets[i] = null;.empty)
}continue;
for (size_t j = i + 1; j < sets.length; j++) {
if (sets[j].empty)
continue;
if (!setIntersection(sets[i], sets[j]).empty) {
sets[j] = uniq(setUnion(sets[i], sets[j])).array();
sets[i] = null;
}
}
}
return filter!"!a.empty"(sets).array();
 
void main() {
Line 384 ⟶ 401:
sets = [['H','I','K'], ['A','B'], ['C','D'], ['D','B'], ['F','G','H']];
writeln(consolidate(sets));
}</lang>
<pre>["AB", "CD"]
["ABD"]
["ABCD"]
["ABCD", "FGHIK"]</pre>
 
'''Recursive version''', as described on talk page.
<lang d>import std.stdio, std.algorithm, std.array;
 
dchar[][] consolidate(dchar[][] sets) {
foreach (set; sets) set.sort;
dchar[][] consolidateR(dchar[][] s) {
for (size_t i = 0; i < sets.length - 1; i++) {
if (sets[i]s.emptylength < 2)
continuereturn s;
forauto (size_t jr = i + 1[s[0]]; j < sets.length; j++) {
foreach (x; if consolidateR(setss[j]1 .empty. $])) {
if (!setIntersection(r[0], x).empty) continue;{
if r[0] = uniq(!setIntersectionsetUnion(setsr[i0], sets[j]x)).emptyarray() {;
} else r sets[j] ~= uniq(setUnion(sets[i], sets[j])).array()x;
sets[i] = null;
}
}
return r;
}
return filter!"!a.empty"consolidateR(sets).array();
}
 
void main() {
dchar[][] sets = [['A', 'B'], ['C','D']];
writeln(consolidate(sets));
 
sets = [['A','B'], ['B','D']];
writeln(consolidate(sets));
 
sets = [['A','B'], ['C','D'], ['D','B']];
writeln(consolidate(sets));
 
sets = [['H','I','K'], ['A','B'], ['C','D'], ['D','B'], ['F','G','H']];
writeln(consolidate(sets));
}</lang>
<pre>["AB", "CD"]
["ABD"]
["ABCD"]
["ABCDFGHIK", "FGHIKABCD"]</pre>
 
=={{header|Ela}}==
Anonymous user