Advertisement
Guest User

Untitled

a guest
Dec 14th, 2023
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.97 KB | Source Code | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define lines 100
  5. #define columns 100
  6. #define true 1
  7. #define false 0
  8. #define LAUNCH_AS_INDEPENDENT
  9.  
  10. typedef _Bool bool;
  11.  
  12. typedef struct result {
  13.     char data[lines+1][columns+1];
  14.     struct result* next;
  15. } result;
  16.  
  17. void tilt(int dir_y, int dir_x, char data[lines+1][columns+1], int length, int width) {
  18.     int line;
  19.     int column;
  20.    
  21.     int _line;
  22.     int _column;
  23.    
  24.     if ((dir_y == -1) || (dir_x == -1)) {
  25.        
  26.         for (line = 0; data[line][0]; line++) {
  27.            
  28.             for (column = 0; data[line][column]; column++) {
  29.                
  30.                 if (data[line][column] != 'O') continue;
  31.                
  32.                 _line = line;
  33.                 _column = column;
  34.                
  35.                 while ((_line + dir_y >= 0) && (_column + dir_x >= 0) && (data[_line + dir_y][_column + dir_x] == '.')) {
  36.                     data[_line][_column] = '.';
  37.                     data[_line + dir_y][_column + dir_x] = 'O';
  38.                     _line += dir_y;
  39.                     _column += dir_x;
  40.                 }
  41.             }
  42.         }
  43.     }
  44.     else {
  45.        
  46.         for (line = length-1; line >= 0; line--) {
  47.            
  48.             for (column = width-1; column >= 0; column--) {
  49.                
  50.                 if (data[line][column] != 'O') continue;
  51.                
  52.                 _line = line;
  53.                 _column = column;
  54.                
  55.                 while ((_line + dir_y < lines) && (_column + dir_x < columns) && (data[_line + dir_y][_column + dir_x] == '.')) {
  56.                     data[_line][_column] = '.';
  57.                     data[_line + dir_y][_column + dir_x] = 'O';
  58.                     _line += dir_y;
  59.                     _column += dir_x;
  60.                 }
  61.                
  62.             }
  63.         }
  64.     }
  65. }
  66.  
  67. void cycle(char data[lines+1][columns+1], int length, int width) {
  68.     tilt(-1, 0, data, length, width);
  69.     tilt(0, -1, data, length, width);
  70.     tilt(1, 0, data, length, width);
  71.     tilt(0, 1, data, length, width);
  72. }
  73.  
  74. int calc_load(char data[lines+1][columns+1], int length, int width) {
  75.     int load = 0;
  76.    
  77.     int i;
  78.     int j;
  79.     for (i = 0; i < length+1; i++) {
  80.         j = 0;
  81.         for (j = 0; j < width+1; j++) {
  82.            
  83.             if (data[i][j] == 'O') load += length-i;
  84.         }
  85.     }
  86.    
  87.     return load;
  88. }
  89.  
  90. void print_data(char data[lines+1][columns+1], int length, int width) {
  91.     int i;
  92.     int j;
  93.     for (i = 0; i < length; i++) {
  94.         j = 0;
  95.         printf("\n");
  96.         for (j = 0; j < width; j++) {
  97.             printf("%c", data[i][j]);
  98.         }
  99.     }
  100. }
  101.  
  102. void add_to_known_results(char data[lines+1][columns+1], result* results) {
  103.     result* current = results;
  104.     while (current->next) {
  105.         current = current->next;
  106.     }
  107.     current->next = malloc(sizeof(result));
  108.     current->next->next = NULL;
  109.     int i;
  110.     int j;
  111.     for (i = 0; i < lines+1; i++) {
  112.         for (j = 0; j < columns+1; j++) {
  113.             current->data[i][j] = data[i][j];
  114.         }
  115.     }
  116. }
  117.  
  118. int get_results_length(result* results) {
  119.     int length = 0;
  120.     result* current = results;
  121.     while (current->next) {
  122.         current = current->next;
  123.         length++;
  124.     }
  125.     return length;
  126. }
  127.  
  128. bool is_equal(char data_a[lines+1][columns+1], char data_b[lines+1][columns+1]) {
  129.     int i;
  130.     int j;
  131.     for (i = 0; i < lines+1; i++) {
  132.         for (j = 0; j < columns+1; j++) {
  133.             if (data_a[i][j] != data_b[i][j]) return false;
  134.         }
  135.     }
  136.     return true;
  137. }
  138.  
  139. int get_index_of_result(char data[lines+1][columns+1], result* results) {
  140.    
  141.     result* current = results;
  142.     int index = 0;
  143.    
  144.     bool equal = is_equal(data, current->data);
  145.     while (current->next && !equal) {
  146.         current = current->next;
  147.         equal = is_equal(data, current->data);
  148.         index++;
  149.     }
  150.    
  151.     if (equal) {
  152.         return index;
  153.     }
  154.    
  155.     return -1;
  156. }
  157.  
  158. void assign_result_at_index(char data[lines+1][columns+1], result* results, int index) {
  159.     result* current = results;
  160.     int i;
  161.     int j;
  162.     for (i = 0; i < index; i++) current = current->next;
  163.    
  164.     for (i = 0; i < lines+1; i++) {
  165.        
  166.         for (j = 0; j < columns+1; j++) {
  167.            
  168.             data[i][j] = current->data[i][j];
  169.         }
  170.     }
  171. }
  172.  
  173. int main(void) {
  174.     FILE* fptr;
  175.    
  176.     char* filename = "data";
  177.    
  178.     fptr = fopen(filename, "r");
  179.    
  180.     if (fptr == NULL) {
  181.         printf("File '%s' not found. Program will now exit.\n", filename);
  182.         exit(0);
  183.     }
  184.     else {
  185.         printf("File opened successfully.\n");
  186.     }
  187.    
  188.     char data[lines+1][columns+1];
  189.     int i;
  190.     int j;
  191.    
  192.     //Nullify the 2-dimensional array
  193.     for (i = 0; i < lines+1; i++) {
  194.         j = 0;
  195.         for (j = 0; j < columns+1; j++) {
  196.             data[i][j] = 0;
  197.         }
  198.     }
  199.  
  200.     //Read in the data
  201.     i = 0;
  202.     j = 0;
  203.     char chr;
  204.     int length = 0;
  205.     int width = 0;
  206.     while(chr = fgetc(fptr)) {
  207.         if (chr == EOF) break;
  208.         if (chr == '\n') {
  209.             data[i][j] = '\0';
  210.             if (!i) width = j;
  211.             i++;
  212.             j = 0;
  213.             length++;
  214.         }
  215.         else {
  216.             data[i][j] = chr;
  217.             j++;
  218.         };
  219.     }
  220.    
  221.     //Copy the data into another 2D-Array for Part 2
  222.     char data2[lines+1][columns+1];
  223.     for (i = 0; i < lines+1; i++) {
  224.         for (j = 0; j < columns+1; j++) {
  225.             data2[i][j] = data[i][j];
  226.         }
  227.     }
  228.    
  229.     //printf("\nLength: %i\nWidth: %i\n", length, width);
  230.    
  231.    
  232.     //Calculate Part 1
  233.     clock_t start = clock();
  234.    
  235.     tilt(-1, 0, data, length, width);
  236.     int load = calc_load(data, length, width);
  237.    
  238.     clock_t end = clock();
  239.    
  240.     double time_to_execute = (double)(end - start) / CLOCKS_PER_SEC;
  241.    
  242.     printf("\nPart 1:\n Time needed: %.3lfs\n Load: %i\n", time_to_execute, load);
  243.    
  244.     //Calculate Part 2
  245.     start = clock();
  246.    
  247.     result* results = malloc(sizeof(result));
  248.     results->next = NULL;
  249.     int needed_iteration = 1e9;
  250.    
  251.     int loop_start = -1;
  252.     while (true) {
  253.         cycle(data2, length, width);
  254.         loop_start = get_index_of_result(data2, results);
  255.         if (loop_start != -1) break;
  256.         add_to_known_results(data2, results);
  257.     }
  258.     int loop_end = get_results_length(results);
  259.     int loop_length = loop_end - loop_start;
  260.     int result_index_for_needed_iteration = loop_start + (needed_iteration - 1 - loop_start) % loop_length;
  261.     assign_result_at_index(data2, results, result_index_for_needed_iteration);
  262.    
  263.     //printf("\nLoop: %i-%i, Length: %i\n", loop_start, loop_end, loop_length);
  264.        
  265.     load = calc_load(data2, length, width);
  266.    
  267.     end = clock();
  268.    
  269.     time_to_execute = (double)(end - start) / CLOCKS_PER_SEC;
  270.    
  271.     printf("\nPart 2:\n Time needed: %.3lfs\n Load: %i\n", time_to_execute, load);
  272.    
  273.     fclose(fptr);
  274.    
  275.     //To stop the program to exit after execution if it is supposed to start outside the terminal
  276. #ifdef LAUNCH_AS_INDEPENDENT
  277.     getchar();
  278. #endif /*LAUNCH_AS_INDEPENDENT*/
  279. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement