/* Filter program which reads in a list of dimension-32 integer vectors (where the 32 indices are considered to be subsets of a five-element set {A,B,C,D,E} in the order {},{A},{B},{A,B},{C},{A,C},{B,C},{A,B,C},{D},...) and writes out a longer list containing, for each input vector, all vectors obtained from it via permutations of the five-element set (but if the same vector is produced by more than one permutation, it is only printed once). */ #include #include int main() { int perms[120][32]; int invec[32]; int i,j,n; int m1,m2,m3,m4,m5; for ( ; ; ) { for (i = 0; i < 32; i++) { j = scanf(" %d",invec+i); if (j != 1) break; } if (i != 32) break; n = 0; for (m1 = 1; m1 < 32; m1 <<= 1) { for (m2 = 1; m2 < 32; m2 <<= 1) { if (m2 == m1) continue; for (m3 = 1; m3 < 32; m3 <<= 1) { if (m3 == m1 || m3 == m2) continue; for (m4 = 1; m4 < 32; m4 <<= 1) { if (m4 == m1 || m4 == m2 || m4 == m3) continue; m5 = 31 - m1 - m2 - m3 - m4; for (i = 0; i < 32; i++) { j = 0; if (i & 1) j |= m1; if (i & 2) j |= m2; if (i & 4) j |= m3; if (i & 8) j |= m4; if (i & 16) j |= m5; perms[n][i] = invec[j]; } for (j = 0; j < n; j++) { for (i = 0; i < 32; i++) { if (perms[n][i] != perms[j][i]) break; } if (i == 32) break; } if (j < n) continue; if (n > 0) printf(" "); for (i = 0; i < 32; i++) printf(" %d",perms[n][i]); printf("\n"); n++; } } } } } exit(0); }