Advertisement
Guest User

Untitled

a guest
Sep 14th, 2014
275
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.49 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3.  
  4. #define MIN_SIDES 3
  5. #define MAX_SIDES 8
  6.  
  7.  
  8. int roll(int x, int num_bits, int roll_amt)
  9. {
  10.     int i, ret = 0;
  11.  
  12.     for (i = 0; i < num_bits; i++)
  13.     {
  14.         if (x & (1 << i))
  15.         {
  16.             ret |= 1 << ((i + roll_amt) % num_bits);
  17.         }
  18.     }
  19.  
  20.     return ret;
  21. }
  22.  
  23. void print_sides(int bits, int size)
  24. {
  25.     int i;
  26.  
  27.     for (i = 0; i < size; i++)
  28.     {
  29.         if (bits & (1 << i))
  30.         {
  31.             printf("B");
  32.         }
  33.         else
  34.         {
  35.             printf("A");
  36.         }
  37.     }
  38. }
  39.  
  40. int main(int argc, char **argv)
  41. {
  42.     int n, i, j, bits, b_count, duplicate, total;
  43.     int counts[MAX_SIDES + 1];
  44.     int categories[MAX_SIDES + 1][1 << MAX_SIDES];
  45.  
  46.     for (n = MIN_SIDES; n <= MAX_SIDES; n++)
  47.     {
  48.         printf("%d sides:\n", n);
  49.  
  50.         for (i = 0; i <= n; i++)
  51.         {
  52.             counts[i] = 0;
  53.         }
  54.        
  55.         for (bits = 0; bits < 1 << n; bits++)
  56.         {
  57. //            printf("  %d: ", bits);
  58. //            print_sides(bits, n);
  59.  
  60.             b_count = 0;
  61.  
  62.             for (i = 0; i < n; i++)
  63.             {
  64.                 if (bits & (1 << i))
  65.                 {
  66.                     b_count++;
  67.                 }
  68.             }
  69.  
  70.             duplicate = 0;
  71.  
  72.             for (i = 0; i < bits; i++)
  73.             {
  74.                 for (j = 0; j < n; j++)
  75.                 {
  76.                     if (roll(i, n, j) == bits)
  77.                     {
  78. //                        printf(" duplicate of ");
  79. //                        print_sides(i, n);
  80.  
  81.                         duplicate = 1;
  82.                         break;
  83.                     }
  84.                 }
  85.  
  86.                 if (duplicate)
  87.                 {
  88.                     break;
  89.                 }
  90.             }
  91.  
  92.             if (!duplicate)
  93.             {
  94. //                printf(" %d Bs, categories[%d][%d] = %d", b_count, b_count, counts[b_count], bits);
  95.  
  96.                 categories[b_count][counts[b_count]] = bits;
  97.  
  98.                 counts[b_count]++;
  99.             }
  100.  
  101. //            printf("\n");
  102.         }
  103.  
  104.         total = 0;
  105.  
  106.         for (i = 0; i <= n; i++)
  107.         {
  108.             printf("  %d Bs, %d As [%d]:", i, n - i, counts[i]);
  109.  
  110.             for (j = 0; j < counts[i]; j++)
  111.             {
  112.                 printf(" ");
  113.                 print_sides(categories[i][j], n);
  114.             }
  115.  
  116.             printf("\n");
  117.  
  118.             total += counts[i];
  119.         }
  120.  
  121.         printf("total = %d\n\n", total);
  122.     }
  123.  
  124.     return 0;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement