Power set: Difference between revisions
Content added Content deleted
(Added Oz solution.) |
(Add C) |
||
Line 151: | Line 151: | ||
} |
} |
||
MsgBox % RegExReplace(SubStr(t,1,StrLen(t)-1),",}","}")</lang> |
MsgBox % RegExReplace(SubStr(t,1,StrLen(t)-1),",}","}")</lang> |
||
=={{header|C}}== |
|||
<lang c>#include <stdio.h> |
|||
#include <stdlib.h> |
|||
typedef char *SetType; |
|||
typedef int bool; |
|||
typedef struct setStruct { |
|||
int count; |
|||
SetType *elements; |
|||
void (*printer)(SetType ); |
|||
bool nlAfterElements; |
|||
} *Set; |
|||
/* Could probly use same struct as above for this */ |
|||
typedef struct powerSetStruct { |
|||
int count; |
|||
Set *elements; |
|||
void (*printer)(Set); |
|||
bool nlAfterElements; |
|||
} *PowerSet; |
|||
void PrintSet( Set s); |
|||
PowerSet GetPowerSet( Set set) |
|||
{ |
|||
int ix, n, j; |
|||
int max = 1<<set->count; // Assuming count < 32 |
|||
PowerSet ps = (PowerSet)malloc( sizeof(struct powerSetStruct)); |
|||
if (ps) { |
|||
ps->elements = (Set*)malloc( max*sizeof(Set)); |
|||
ps->count = max; |
|||
ps->printer = PrintSet; |
|||
ps->nlAfterElements = 1; |
|||
for (ix=0; ix<max; ix++) { |
|||
int setsize = 0; |
|||
Set se = (Set)malloc(sizeof(struct setStruct)); |
|||
for (j=0; j<set->count; j++) |
|||
if (ix & (1<<j)) setsize++; |
|||
if (setsize > 0) { |
|||
se->elements = (SetType *)malloc(setsize *sizeof(SetType)); |
|||
n = 0; |
|||
for (j=0; j<set->count; j++) { |
|||
if (ix & (1<<j)) { |
|||
se->elements[n] = set->elements[j]; |
|||
n++; |
|||
} |
|||
} |
|||
} |
|||
else { |
|||
printf("No elements in set %d\n", ix); |
|||
se->elements = NULL; |
|||
} |
|||
se->count = setsize; |
|||
se->printer = set->printer; |
|||
se->nlAfterElements = set->nlAfterElements; |
|||
ps->elements[ix] = se; |
|||
} |
|||
} |
|||
return ps; |
|||
} |
|||
void PrintSet( Set s) |
|||
{ |
|||
char *sep = ""; |
|||
int ix; |
|||
printf("{"); |
|||
for (ix=0; ix<s->count; ix++) { |
|||
printf("%s ", sep); |
|||
s->printer(s->elements[ix]); |
|||
sep = (s->nlAfterElements)? ",\n " :","; |
|||
} |
|||
printf(" }"); |
|||
} |
|||
void PrintString( char *str) |
|||
{ |
|||
printf("%s", str); |
|||
} |
|||
int main(int argc, char *argv[]) |
|||
{ |
|||
char *eles[] = {"Red","Grn","Blu","Ylo"}; |
|||
struct setStruct aSet = { 4, eles, PrintString, 0 }; |
|||
PowerSet p = GetPowerSet( &aSet); |
|||
PrintSet(&aSet); printf("\n"); |
|||
PrintSet( (Set)p ); printf("\n"); |
|||
return 0; |
|||
}</lang> |
|||
Output: |
|||
<pre>{ Red, Grn, Blu, Ylo } |
|||
{ { }, |
|||
{ Red }, |
|||
{ Grn }, |
|||
{ Red, Grn }, |
|||
{ Blu }, |
|||
{ Red, Blu }, |
|||
{ Grn, Blu }, |
|||
{ Red, Grn, Blu }, |
|||
{ Ylo }, |
|||
{ Red, Ylo }, |
|||
{ Grn, Ylo }, |
|||
{ Red, Grn, Ylo }, |
|||
{ Blu, Ylo }, |
|||
{ Red, Blu, Ylo }, |
|||
{ Grn, Blu, Ylo }, |
|||
{ Red, Grn, Blu, Ylo }}</pre> |
|||
=={{header|C++}}== |
=={{header|C++}}== |