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.

All them words won't bring your pa back.

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.

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