Advertisement
Guest User

aoc day11

a guest
Dec 11th, 2021
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.99 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. size_t file_size(FILE *f) {
  6.     size_t curr_pos = ftell(f);
  7.     fseek(f, 0, SEEK_END);
  8.     size_t size = ftell(f);
  9.     fseek(f, curr_pos, SEEK_SET);
  10.  
  11.     return size;
  12. }
  13.  
  14. size_t read_file(const char *filepath, char **buf) {
  15.     size_t fsize = 0;
  16.  
  17.     FILE *f = fopen(filepath, "r");
  18.     if (f) {
  19.         fsize = file_size(f);
  20.  
  21.         *buf = malloc(fsize + 1);
  22.         if (!buf) return fsize;
  23.  
  24.         fread(*buf, fsize, 1, f);
  25.         fclose(f);
  26.     }
  27.  
  28.     return fsize;
  29. }
  30.  
  31. typedef struct Octos {
  32.     size_t rows;
  33.     size_t cols;
  34.     int *energy;
  35. } Octos;
  36.  
  37. int* octos_energy(const Octos *octos, size_t row, size_t col) {
  38.     return &octos->energy[row * octos->cols + col];
  39. }
  40.  
  41. void octos_print(const Octos *octos) {
  42.     for (int row = 0; row < octos->rows; ++row) {
  43.         for (int col = 0; col < octos->cols; ++col) {
  44.             int *value = octos_energy(octos, row, col);
  45.             printf("%d", *value);
  46.         }
  47.  
  48.         printf("\n");
  49.     }
  50. }
  51.  
  52. void octos_update_energy(Octos *octos, size_t col, size_t row) {
  53.     for (int drow = -1; drow <= 1; ++drow) {
  54.         for (int dcol = -1; dcol <= 1; ++dcol) {
  55.             if (dcol == 0 && drow == 0) continue;
  56.  
  57.             int nrow = row + drow;
  58.             int ncol = col + dcol;
  59.  
  60.             if (0 < nrow < octos->rows && 0 < ncol < octos->cols) {
  61.                 int *value = octos_energy(octos, nrow, ncol);
  62.                 (*value)++;
  63.  
  64.                 if (*value == 10) octos_update_energy(octos, ncol, nrow);
  65.             }
  66.         }
  67.     }
  68. }
  69.  
  70. size_t octos_next_step(Octos *octos) {
  71.     size_t flashes = 0;
  72.  
  73.     for (int row = 0; row < octos->rows; ++row) {
  74.         for (int col = 0; col < octos->cols; ++col) {
  75.             int *value = octos_energy(octos, row, col);
  76.             (*value)++;
  77.             if (*value == 10) octos_update_energy(octos, col, row);
  78.         }
  79.     }
  80.  
  81.  
  82.     for (int i = 0; i < (octos->rows * octos->cols); ++i) {
  83.         if (octos->energy[i] > 9) {
  84.             octos->energy[i] = 0;
  85.             flashes++;
  86.         }
  87.     }
  88.  
  89.     return flashes;
  90. }
  91.  
  92. int main(int argc, char* argv[argc+1]) {
  93.     if (argc < 2) return 1;
  94.  
  95.     char *inputfile = argv[1];
  96.  
  97.     char *data;
  98.     size_t data_len = read_file(inputfile, &data);
  99.     if (data_len == 0) return 1;
  100.  
  101.     size_t cols = strchr(data, '\n') - data;
  102.     size_t rows = data_len / (cols + 1);
  103.  
  104.     int array[rows][cols];
  105.     for (int row = 0; row < rows; ++row)
  106.         for (int col = 0; col < cols; ++col)
  107.             array[row][col] = data[row * (cols + 1) + col] - '0';
  108.  
  109.     free(data);
  110.  
  111.     Octos octos = {
  112.         .rows = rows,
  113.         .cols = cols,
  114.         .energy = (int *)array,
  115.     };
  116.  
  117.     octos_print(&octos);
  118.  
  119.     size_t flashes = 0;
  120.     for (int i = 1; i < 10; ++i) {
  121.         printf("\nStep %d:\n", i);
  122.         flashes += octos_next_step(&octos);
  123.         octos_print(&octos);
  124.     }
  125.  
  126.     printf("\n%lu\n", flashes);
  127.  
  128.  
  129.     return 0;
  130. }
  131.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement