Set consolidation: Difference between revisions

No edit summary
Line 183:
 
=={{header|Aime}}==
<lang aime></lang>void
display(list l)
{
integer i;
text s;
 
i = -l_length(l);
while (i) {
record r;
text u, v;
 
o_text(s);
s = ", ";
o_text("{");
r = l_q_record(l, i);
if (r_first(r, u)) {
do {
o_text(v);
v = ", ";
o_text(u);
} while (r_greater(r, u, u));
}
o_text("}");
i += 1;
}
 
o_text("\n");
}
 
integer
intersect(record r, record u)
{
integer a;
text s;
 
a = 0;
if (r_first(r, s)) {
do {
if (r_key(u, s)) {
a = 1;
break;
}
} while (r_greater(r, s, s));
}
 
return a;
}
 
void
merge(record u, record r)
{
text s;
 
if (r_first(r, s)) {
do {
r_add(u, s, r_query(r, s));
} while (r_greater(r, s, s));
}
}
 
list
consolidate(list l)
{
integer i;
 
i = -l_length(l);
while (i) {
integer j;
record r;
 
r = l_q_record(l, i);
i += 1;
j = i;
while (j) {
record u;
 
u = l_q_record(l, j);
j += 1;
if (intersect(r, u)) {
merge(u, r);
l_delete(l, i - 1);
break;
}
}
}
 
return l;
}
 
list
L(...)
{
integer i;
list l;
 
i = -count();
while (i) {
l_link(l, -1, $i);
i += 1;
}
 
return l;
}
 
record
R(...)
{
integer i;
record r;
 
i = -count();
while (i) {
r_p_integer(r, $i, 0);
i += 1;
}
 
return r;
}
 
integer
main(void)
{
display(consolidate(L(R("A", "B"), R("C", "D"))));
display(consolidate(L(R("A", "B"), R("B", "D"))));
display(consolidate(L(R("A", "B"), R("C", "D"), R("D", "B"))));
display(consolidate(L(R("H", "I", "K"), R("A", "B"), R("C", "D"),
R("D", "B"), R("F", "G", "K"))));
 
return 0;
}</lang>
{{out}}
<pre></pre>{A, B}, {C, D}
{A, B, D}
{A, B, C, D}
{A, B, C, D}, {F, G, H, I, K}</pre>
 
=={{header|Bracmat}}==
Anonymous user