aoc

advent of code
git clone git://source.orangerot.dev:/aoc.git
Log | Files | Refs

main.c (2480B)


      1 #include <stdlib.h>
      2 #include <stdio.h>
      3 #include <string.h>
      4 
      5 typedef struct Dir_ Dir;
      6 
      7 typedef struct Dir_ {
      8     char name[32];
      9     int size, dir;
     10     int children;
     11     Dir *parent;
     12     Dir *files[32];
     13 } Dir;
     14 
     15 Dir* changeDir(Dir *dir, Dir *root, char *name)
     16 {
     17     printf("cd %s\n", name);
     18     if ( name[0] == '/' ) return root;
     19     if ( name[0] == '.' ) return dir->parent;
     20 
     21     for ( int i = 0; i < dir->children; i++ )
     22     {
     23         if(strcmp( dir->files[i]->name, name ) == 0)
     24         {
     25             return dir->files[i];
     26         }
     27     }
     28 }
     29 
     30 void list(Dir *dir, int d)
     31 {
     32     for (int i = 0; i < d; i++) printf("'-");
     33     printf("%s", dir->name);
     34     if (dir->dir) printf(" (d)");
     35     else printf(" %d", dir->size);
     36     printf("\n");
     37     for (int i = 0; i < dir->children; i++)
     38     {
     39         list(dir->files[i], d+1);
     40     }
     41 }
     42 
     43 int findlarge(Dir *dir, int *globalsum) {
     44     
     45     if (!dir->dir) {
     46         return dir->size;
     47     }
     48 
     49     int sum = 0;
     50     for (int i = 0; i < dir->children; i++)
     51     {
     52         sum += findlarge(dir->files[i], globalsum);
     53     }
     54     if (sum <= 100000) {
     55         *globalsum += sum;
     56     }
     57 
     58     return sum;
     59 }
     60 
     61 int main()
     62 {
     63 
     64     char *line = 0;
     65     size_t len;
     66     ssize_t nlen;
     67 
     68     Dir *root = malloc(sizeof(Dir));
     69     root->children = 0;
     70     root->dir = 1;
     71     strcpy(root->name, "/");
     72     Dir *head = root;
     73     
     74     int globalsum = 0;
     75 
     76     while( (nlen = getline(&line, &len, stdin)) != -1 )
     77     {
     78         line[nlen-1] = '\0';
     79         if ( line[0] == '$' )
     80         {
     81             if ( line[2] == 'c' ) head = changeDir(head, root, line+5);
     82         }
     83         else if ( line[0] == 'd' ) 
     84         {
     85             Dir *newdir = malloc(sizeof(Dir));
     86             strcpy(newdir->name, line+4);
     87             newdir->dir = 1;
     88             newdir->children = 0;
     89             newdir->parent = head;
     90             head->files[head->children] = newdir;
     91             head->children++;
     92         }
     93         else {
     94             Dir *newdir = malloc(sizeof(Dir));
     95             newdir->size = atoi( strsep(&line, " ") );    
     96             strcpy(newdir->name, strsep(&line, " "));
     97             head->files[head->children] = newdir;
     98             head->children++;
     99             
    100             // printf("file %d %s\n", newdir->size, newdir->name);
    101             // printf("name %s\n", root->files[0]->name);
    102         }
    103         printf("cmd '%s' head: %s\n", line, head->name);
    104         list(root, 0);
    105     }
    106     
    107     list(root, 0);
    108 
    109     findlarge(root, &globalsum);
    110     printf("sum: %d\n", globalsum);
    111 }