3 changed files with 56 additions and 0 deletions
			
			
		| @ -0,0 +1,12 @@ | |||||
|  | CFLAGS := -Wall -Wextra -std=c17 -D_GNU_SOURCE | ||||
|  | 
 | ||||
|  | LIBS := glib-2.0 | ||||
|  | CFLAGS += $(shell pkg-config --cflags $(LIBS)) | ||||
|  | LDLIBS := $(shell pkg-config --libs $(LIBS)) | ||||
|  | 
 | ||||
|  | .PHONY: all | ||||
|  | all: main | ||||
|  | 
 | ||||
|  | .PHONY: clean | ||||
|  | clean: | ||||
|  | 	rm -f main | ||||
								
									
										File diff suppressed because one or more lines are too long
									
								
							
						
					| @ -0,0 +1,43 @@ | |||||
|  | #include <stdio.h> | ||||
|  | 
 | ||||
|  | #include <glib.h> | ||||
|  | 
 | ||||
|  | int result = 0; | ||||
|  | 
 | ||||
|  | gchar **parse_node(gchar **node) | ||||
|  | { | ||||
|  |     int children = strtol(*node++, NULL, 0); | ||||
|  |     int metadata = strtol(*node++, NULL, 0); | ||||
|  | 
 | ||||
|  |     for (int i = 0; i < children; i++) { | ||||
|  |         node = parse_node(node); | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     for (int i = 0; i < metadata; i++) { | ||||
|  |         result += strtol(*node++, NULL, 0); | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     return node; | ||||
|  | } | ||||
|  | 
 | ||||
|  | int main() | ||||
|  | { | ||||
|  |     gchar *contents; | ||||
|  |     gchar **strings; | ||||
|  |     GError *err = NULL; | ||||
|  | 
 | ||||
|  |     g_file_get_contents("input", &contents, NULL, &err); | ||||
|  |     if (err) { | ||||
|  |         fprintf(stderr, "%s\n", err->message); | ||||
|  |         g_error_free(err); | ||||
|  |         return 1; | ||||
|  |     } | ||||
|  |     strings = g_strsplit(contents, " ", -1); | ||||
|  |     g_free(contents); | ||||
|  | 
 | ||||
|  |     parse_node(strings); | ||||
|  |     printf("%d\n", result); | ||||
|  | 
 | ||||
|  |     g_free(strings); | ||||
|  |     return 0; | ||||
|  | } | ||||
					Loading…
					
					
				
		Reference in new issue