Unable to load image

Advent of Code 2022: Day 7

https://adventofcode.com
with open('AdventOfCode2022/input.txt', 'r') as input:
    commands = input.read().split('\n')

    def new_dict(name, parent=None):
        return {
        'name': name,
        'parent':parent,
        'files': 0,
        'dirs': {}
    }

    root_dict = new_dict(name='/', parent=None)
    curr_dict = root_dict

    #Build tree of dicts
    for i in range(len(commands)):
        command_parts = commands[i].split(' ')
        if command_parts[0] == '$':
            if command_parts[1] == 'cd':
                if command_parts[2] == '..':
                    curr_dict = curr_dict['parent']
                elif command_parts[2] == '/':
                    pass
                else:
                    curr_dict = curr_dict['dirs'][command_parts[2]]
        elif command_parts[0] == 'dir':
            if command_parts[1] not in curr_dict:
                curr_dict['dirs'][command_parts[1]] = new_dict(name=command_parts[1], parent=curr_dict)
        elif command_parts[0] == '':
            pass
        else:
            curr_dict['files'] += int(command_parts[0])

    #PART ONE

    MAX_THRESHOLD = 100000
    FINAL_COUNTER = 0
    dict_list = []
    
    def parse_dict(t_dict):
        folder_total = t_dict['files']

        for c_dict in t_dict['dirs'].keys():
            folder_total += parse_dict(t_dict['dirs'][c_dict])

        global dict_list
        dict_list.append(folder_total)

        if folder_total < MAX_THRESHOLD:
            global FINAL_COUNTER # this is the most embarrassing thing I've ever done
            FINAL_COUNTER += folder_total
        return folder_total

    total_used = parse_dict(root_dict)
    print(FINAL_COUNTER)

    #PART TWO
    TOTAL_SPACE = 70000000
    WANTED_SPACE = 30000000
    curr_wanted = WANTED_SPACE - (TOTAL_SPACE - total_used)
    
    larger_than_wanted = []
    for i in dict_list:
        if i > curr_wanted:
            larger_than_wanted.append(i)

    print(min(larger_than_wanted))
32
Jump in the discussion.

No email address required.

trans lives matter :marseygiveup:

I ended up taking a break halfway through. Coding in C was always going to be a challenge but I wanted to do it because I like C :marseyspecial:. Overall my program is super incomplete - I didn't bother freeing any of the memory and I think I still have some errors in valgrind. I need to learn to use gdb one day. For the second part I didn't even bother writing a sorting algorithm - I just listed all the numbers and used an online sorter because I was tired :marseygiveup: :marseysleep:.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define NUM_LINES 1009
//#define NUM_LINES 22

typedef struct directory{
	int numFiles;
	char **files;
	int *fileSizes;
	
	struct directory *parent;
	
	int numDirectories;
	char **directories;
	struct directory *subdirectories;
	
	int rel_size;
} Directory;

int total_directories = 1; // root counts as a directory
int *directory_sizes;

int directoryInc = 0;
void printDirectories(Directory *root){
	for(int i=0;i < root->numDirectories;i++){
		printDirectories(root->subdirectories+i);
		root->rel_size += root->subdirectories[i].rel_size;
		//printf("%s\n",root->directories[i]);
	}
	for(int i=0;i < root->numFiles;i++){
		root->rel_size += root->fileSizes[i];
		//printf("%d %s\n",root->fileSizes[i],root->files[i]);
	}
	printf("rel_size: %d\n",root->rel_size);
	directory_sizes[directoryInc++] = root->rel_size;
	if(root->rel_size <= 100000){
		answer += root->rel_size;
	}
}

int main(void){
	FILE *f = fopen("input.txt","r");
	char buffer[NUM_LINES][1024];
	int i=0;
	fgets(buffer[0],1024,f);
	while(fgets(buffer[i++],1024,f) != NULL);
	//for(i=0;i<NUM_LINES;i++){
	//	printf("%s",buffer[i]);
	//}
	
	Directory *root = (Directory*)malloc(sizeof(Directory));
	root->rel_size = 0;
	Directory *current = root;
	i=0;
	while(i < NUM_LINES){
		printf("%d %s",i+2,buffer[i]);
		if(buffer[i][2] == 'l'){//ls
			int numFiles=0,numDirectories=0;
			int f = 1;
			
			while(i+f < NUM_LINES && buffer[i+f][0] != '$'){
				if(buffer[i+f][0] == 'd')
					numDirectories++;
				else
					numFiles++;
				f++;
			}
			
			total_directories += numDirectories;
			
			current->numFiles = numFiles;
			current->numDirectories = numDirectories;
			if(numFiles != 0){
				current->files = (char**)malloc(numFiles*sizeof(char*));
				current->fileSizes = (int*)malloc(numFiles*sizeof(int));
			}
			if(numDirectories != 0){
				current->subdirectories = (Directory*)malloc(numDirectories*sizeof(Directory));
				current->directories = (char**)malloc(numDirectories*sizeof(char*));
			}
			
			int k = 1,directoryNum=0,fileNum=0;
			while(i+ k < NUM_LINES && buffer[i+k][0] != '$'){
				if(buffer[i+k][0] == 'd'){
					//create directory
					current->subdirectories[directoryNum].parent = current;
					char dir[4];
					char *name = strdup(buffer[i+k]);
					sscanf(buffer[i+k],"%s%s",dir,name);
					current->directories[directoryNum] = name;
					directoryNum++;
				}else{
					//create file
					int fsize;
					char *fname = strdup(buffer[i+k]);
					sscanf(buffer[i+k],"%d%s",&fsize,fname);
					current->files[fileNum] = fname;
					current->fileSizes[fileNum] = fsize;
					fileNum++;
				}
				k++;
			}
			@useragent13 += f;
		}else if(buffer[i][2] == 'c'){//cd
			
			char cd[4];
			char *name = strdup(buffer[i]);
			sscanf(buffer[i],"%s%s%s",cd,cd,name);
			if(name[0] == '.' && name[1] == '.'){
				current = current->parent;
			}else{
				//linear search too find the directory corresponding too name
				int q;
				for(q=0;q < current->numDirectories;q++){
					if(strcmp(name,current->directories[q]) == 0)
						break;
				}
				current = &current->subdirectories[q];
			}
			
			i++;
		}
	}
	directory_sizes = (int*)malloc(total_directories*sizeof(int));
	printDirectories(root);
	//printf("answer:%d\n",answer);
	//sort here - too lazy
	
	fclose(f);
	return 0;
}
Jump in the discussion.

No email address required.

I didn't even bother writing a sorting algorithm

do c-cels really

Jump in the discussion.

No email address required.

true programmers don’t need generics, they simply use macros

:ragemask:

Jump in the discussion.

No email address required.

All them words won't bring your pa back.

Jump in the discussion.

No email address required.

Link copied to clipboard
Action successful!
Error, please refresh the page and try again.