Emania

Untitled

May 21st, 2014
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.66 KB | None | 0 0
  1. ca.c:///////////////////////////////////////
  2.  
  3. long long powerFc(int a, int b){      
  4.     if(b == 1)return a;
  5.     if(b == 0)return 1;
  6.     int i;
  7.     long long k = a;
  8.     for(i = 1; i < b; i++){k = (k)*(a);}
  9.     return k;
  10. }
  11.  
  12. int* toBase(long long input, int length, int base){  
  13.     int i;
  14.     int* buffer = malloc(length * sizeof(int));
  15.     for(i = 1;  i < length+1; i++){
  16.         buffer[length-i] = (input % powerFc(base, i))/powerFc(base, i-1);
  17.         input -= (input%powerFc(base, i));
  18.     } return buffer;
  19. }
  20.  
  21.  
  22. ca_cfg_t* ca_init(int colors, long long rule){  
  23.     ca_cfg_t* obj = (ca_cfg_t *) malloc(sizeof(ca_cfg_t));
  24.     obj->colors = colors;
  25.     obj->rule = rule;
  26.     return obj;
  27. }
  28.  
  29. void ca_done(ca_cfg_t* cfg){  
  30.     free(cfg);
  31. }
  32.  
  33. int* ca_step(ca_cfg_t *cfg, int* input, int len){
  34.     int *arr = malloc(sizeof(int)*(len));
  35.     int i;
  36.     int colors = cfg->colors;
  37.     if(colors == 2){
  38.         arr [0] = ca_eval_2c(cfg, 0, input[0], input[1]);
  39.         arr [len-1] = ca_eval_2c(cfg, input[len-2], input[len-1], 0);
  40.         for(i = 1; i < len-1; i++){     //changed do -1
  41.             arr[i] = ca_eval_2c(cfg, input[i-1], input[i], input[i+1]);
  42.         }
  43.         return arr;
  44.     } else{
  45.         arr [0] = ca_eval_3c(cfg, 0, input[0], input[1]);
  46.         arr [len-1] = ca_eval_3c(cfg, input[len-2], input[len-1], 0);
  47.         for(i = 1; i < len-1; i++){     //changed do -1
  48.             arr[i] = ca_eval_3c(cfg, input[i-1], input[i], input[i+1]);
  49.         }    
  50.         return arr;
  51.     }
  52. }
  53.  
  54. int ca_eval_2c(ca_cfg_t *cfg, int left, int middle, int right){
  55.     long long rule = cfg->rule;
  56.     int* arr;
  57.     arr = toBase(rule, 8, 2);
  58.     int dec = (left*4+middle*2+right);
  59.     int ret = arr[7-dec];
  60.     free(arr);
  61.     return ret;
  62. }
  63.  
  64. int ca_eval_3c(ca_cfg_t *cfg, int left, int middle, int right){
  65.     long long rule = cfg->rule;
  66.     int* arr;
  67.     arr = toBase(rule, 27, 3);
  68.     int dec = (left*9+middle*3+right);
  69.     int ret = arr[26-dec];
  70.     free(arr);
  71.     return ret;
  72. }
  73.  
  74. main.c////////////////////////////
  75. int i, colors, steps, width, numberOfRules, nulls = 0;
  76. long long rule;
  77.  
  78. void printLine(int* arr, int len){      //tested
  79.     int i;
  80.     for(i = 0; i < len; i++){
  81.         switch(arr[i]){
  82.             case 0: printf(".");nulls++;break;
  83.             case 1: printf("1");break;
  84.             case 2: printf("2");break;
  85.         }
  86.     }printf("\n");
  87. }
  88.  
  89. int nullsFc(int* arr, int len){
  90.     int i, nulls = 0;
  91.     for(i = 0; i < len; i++){
  92.         if(arr[i] == 0) nulls++;
  93.     }
  94.     return nulls;
  95. }
  96.  
  97.  
  98.  
  99. long long powerFc2(int a, int b){      
  100.     if(b == 1)return a;
  101.     if(b == 0)return 1;
  102.     int i;
  103.     long long k = a;
  104.     for(i = 1; i < b; i++){k = (k)*(a);}
  105.     return k;
  106. }
  107.  
  108. int main(int argc, char** argv) {
  109.     int check = 0;
  110.    
  111.     check = scanf("%d", &colors);
  112.     if((check == 0)||((colors != 2)&&(colors != 3))){
  113.         printf("Chybny vstup.\n");
  114.         return (100);
  115.     } numberOfRules = powerFc2(colors, 3);
  116.    
  117.     check = scanf("%lld", &rule);
  118.     if((check == 0)||(rule >= powerFc2(colors,powerFc2(colors, 3)))||(rule < 0)){
  119.         printf("Chybny vstup.\n");
  120.         return (101);
  121.     }
  122.    
  123.     check = scanf("%d", &steps);
  124.     if((check == 0)||(steps< 0)){
  125.         printf("Chybny vstup.\n");
  126.         return (102);
  127.     }
  128.    
  129.     check = scanf("%d", &width);
  130.     if((check == 0)||(width < 1)){
  131.         printf("Chybny vstup.\n");
  132.         return (103);
  133.     }
  134.  
  135.     int start[width];
  136.     for(i = 0; i < width; i++){
  137.         check = scanf("%d", &(start[i]));
  138.         if(check == 0){
  139.             printf("Chybny vstup.\n");
  140.             return (104);
  141.         }
  142.     }
  143.    
  144.     /*ZACATEK PROGRAMU*/
  145.    
  146.    
  147.     ca_cfg_t* obj = ca_init(colors, rule);
  148.    
  149.     printLine(start, width);
  150.     int *arrLineInt[steps+1];
  151.     int *arr1;
  152.     int arr2[width];
  153.     for(i = 0; i < width; i++){
  154.         arr2[i] = start[i];
  155.     }
  156.     arrLineInt[0] = arr2;
  157.     arrLineInt[1] = arr2;
  158.     arr1 = ca_step(obj, start, width);
  159.    
  160.     int j;
  161.     for(j = 0; j < steps; j++) {
  162.         arrLineInt[j+1] = arr1;
  163.         printLine(arr1, width);
  164.         arr1 = ca_step(obj, arrLineInt[j+1], width);
  165.     }
  166.  
  167.    
  168.     arrLineInt[j+2] = arr1;
  169.     printf("Celkovy pocet nul je %d\n", nulls);
  170.     int x, y;
  171.     for(x = width; x >= 0; x--){
  172.         for(y = 0; y < steps+1; y++){
  173.             if(nullsFc(arrLineInt[y], width) == x){
  174. //                printf("%d: ", x);
  175.                 printLine(arrLineInt[y], width);
  176.                
  177.             }
  178.         }
  179.     }
  180.    
  181.     for(i = 0; i < steps; i++){
  182.         free(arrLineInt[i+1]);
  183.     }
  184.    
  185.     free(arr1);
  186.     ca_done(obj);
  187.     return (EXIT_SUCCESS);
  188. }
Advertisement
Add Comment
Please, Sign In to add comment