Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ca.c:///////////////////////////////////////
- long long powerFc(int a, int b){
- if(b == 1)return a;
- if(b == 0)return 1;
- int i;
- long long k = a;
- for(i = 1; i < b; i++){k = (k)*(a);}
- return k;
- }
- int* toBase(long long input, int length, int base){
- int i;
- int* buffer = malloc(length * sizeof(int));
- for(i = 1; i < length+1; i++){
- buffer[length-i] = (input % powerFc(base, i))/powerFc(base, i-1);
- input -= (input%powerFc(base, i));
- } return buffer;
- }
- ca_cfg_t* ca_init(int colors, long long rule){
- ca_cfg_t* obj = (ca_cfg_t *) malloc(sizeof(ca_cfg_t));
- obj->colors = colors;
- obj->rule = rule;
- return obj;
- }
- void ca_done(ca_cfg_t* cfg){
- free(cfg);
- }
- int* ca_step(ca_cfg_t *cfg, int* input, int len){
- int *arr = malloc(sizeof(int)*(len));
- int i;
- int colors = cfg->colors;
- if(colors == 2){
- arr [0] = ca_eval_2c(cfg, 0, input[0], input[1]);
- arr [len-1] = ca_eval_2c(cfg, input[len-2], input[len-1], 0);
- for(i = 1; i < len-1; i++){ //changed do -1
- arr[i] = ca_eval_2c(cfg, input[i-1], input[i], input[i+1]);
- }
- return arr;
- } else{
- arr [0] = ca_eval_3c(cfg, 0, input[0], input[1]);
- arr [len-1] = ca_eval_3c(cfg, input[len-2], input[len-1], 0);
- for(i = 1; i < len-1; i++){ //changed do -1
- arr[i] = ca_eval_3c(cfg, input[i-1], input[i], input[i+1]);
- }
- return arr;
- }
- }
- int ca_eval_2c(ca_cfg_t *cfg, int left, int middle, int right){
- long long rule = cfg->rule;
- int* arr;
- arr = toBase(rule, 8, 2);
- int dec = (left*4+middle*2+right);
- int ret = arr[7-dec];
- free(arr);
- return ret;
- }
- int ca_eval_3c(ca_cfg_t *cfg, int left, int middle, int right){
- long long rule = cfg->rule;
- int* arr;
- arr = toBase(rule, 27, 3);
- int dec = (left*9+middle*3+right);
- int ret = arr[26-dec];
- free(arr);
- return ret;
- }
- main.c////////////////////////////
- int i, colors, steps, width, numberOfRules, nulls = 0;
- long long rule;
- void printLine(int* arr, int len){ //tested
- int i;
- for(i = 0; i < len; i++){
- switch(arr[i]){
- case 0: printf(".");nulls++;break;
- case 1: printf("1");break;
- case 2: printf("2");break;
- }
- }printf("\n");
- }
- int nullsFc(int* arr, int len){
- int i, nulls = 0;
- for(i = 0; i < len; i++){
- if(arr[i] == 0) nulls++;
- }
- return nulls;
- }
- long long powerFc2(int a, int b){
- if(b == 1)return a;
- if(b == 0)return 1;
- int i;
- long long k = a;
- for(i = 1; i < b; i++){k = (k)*(a);}
- return k;
- }
- int main(int argc, char** argv) {
- int check = 0;
- check = scanf("%d", &colors);
- if((check == 0)||((colors != 2)&&(colors != 3))){
- printf("Chybny vstup.\n");
- return (100);
- } numberOfRules = powerFc2(colors, 3);
- check = scanf("%lld", &rule);
- if((check == 0)||(rule >= powerFc2(colors,powerFc2(colors, 3)))||(rule < 0)){
- printf("Chybny vstup.\n");
- return (101);
- }
- check = scanf("%d", &steps);
- if((check == 0)||(steps< 0)){
- printf("Chybny vstup.\n");
- return (102);
- }
- check = scanf("%d", &width);
- if((check == 0)||(width < 1)){
- printf("Chybny vstup.\n");
- return (103);
- }
- int start[width];
- for(i = 0; i < width; i++){
- check = scanf("%d", &(start[i]));
- if(check == 0){
- printf("Chybny vstup.\n");
- return (104);
- }
- }
- /*ZACATEK PROGRAMU*/
- ca_cfg_t* obj = ca_init(colors, rule);
- printLine(start, width);
- int *arrLineInt[steps+1];
- int *arr1;
- int arr2[width];
- for(i = 0; i < width; i++){
- arr2[i] = start[i];
- }
- arrLineInt[0] = arr2;
- arrLineInt[1] = arr2;
- arr1 = ca_step(obj, start, width);
- int j;
- for(j = 0; j < steps; j++) {
- arrLineInt[j+1] = arr1;
- printLine(arr1, width);
- arr1 = ca_step(obj, arrLineInt[j+1], width);
- }
- arrLineInt[j+2] = arr1;
- printf("Celkovy pocet nul je %d\n", nulls);
- int x, y;
- for(x = width; x >= 0; x--){
- for(y = 0; y < steps+1; y++){
- if(nullsFc(arrLineInt[y], width) == x){
- // printf("%d: ", x);
- printLine(arrLineInt[y], width);
- }
- }
- }
- for(i = 0; i < steps; i++){
- free(arrLineInt[i+1]);
- }
- free(arr1);
- ca_done(obj);
- return (EXIT_SUCCESS);
- }
Advertisement
Add Comment
Please, Sign In to add comment