Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #define MIN_SIDES 3
- #define MAX_SIDES 8
- int roll(int x, int num_bits, int roll_amt)
- {
- int i, ret = 0;
- for (i = 0; i < num_bits; i++)
- {
- if (x & (1 << i))
- {
- ret |= 1 << ((i + roll_amt) % num_bits);
- }
- }
- return ret;
- }
- void print_sides(int bits, int size)
- {
- int i;
- for (i = 0; i < size; i++)
- {
- if (bits & (1 << i))
- {
- printf("B");
- }
- else
- {
- printf("A");
- }
- }
- }
- int main(int argc, char **argv)
- {
- int n, i, j, bits, b_count, duplicate, total;
- int counts[MAX_SIDES + 1];
- int categories[MAX_SIDES + 1][1 << MAX_SIDES];
- for (n = MIN_SIDES; n <= MAX_SIDES; n++)
- {
- printf("%d sides:\n", n);
- for (i = 0; i <= n; i++)
- {
- counts[i] = 0;
- }
- for (bits = 0; bits < 1 << n; bits++)
- {
- // printf(" %d: ", bits);
- // print_sides(bits, n);
- b_count = 0;
- for (i = 0; i < n; i++)
- {
- if (bits & (1 << i))
- {
- b_count++;
- }
- }
- duplicate = 0;
- for (i = 0; i < bits; i++)
- {
- for (j = 0; j < n; j++)
- {
- if (roll(i, n, j) == bits)
- {
- // printf(" duplicate of ");
- // print_sides(i, n);
- duplicate = 1;
- break;
- }
- }
- if (duplicate)
- {
- break;
- }
- }
- if (!duplicate)
- {
- // printf(" %d Bs, categories[%d][%d] = %d", b_count, b_count, counts[b_count], bits);
- categories[b_count][counts[b_count]] = bits;
- counts[b_count]++;
- }
- // printf("\n");
- }
- total = 0;
- for (i = 0; i <= n; i++)
- {
- printf(" %d Bs, %d As [%d]:", i, n - i, counts[i]);
- for (j = 0; j < counts[i]; j++)
- {
- printf(" ");
- print_sides(categories[i][j], n);
- }
- printf("\n");
- total += counts[i];
- }
- printf("total = %d\n\n", total);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement