mid-kid
6 years ago
4 changed files with 65 additions and 1 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,51 @@ |
|||
#include <stdio.h> |
|||
|
|||
#include <glib.h> |
|||
|
|||
int parse_node(gchar ***node) |
|||
{ |
|||
int children = strtol(*(*node)++, NULL, 0); |
|||
int metadata = strtol(*(*node)++, NULL, 0); |
|||
|
|||
int values[children]; |
|||
int result = 0; |
|||
|
|||
for (int i = 0; i < children; i++) { |
|||
values[i] = parse_node(node); |
|||
} |
|||
|
|||
for (int i = 0; i < metadata; i++) { |
|||
int offs = strtol(*(*node)++, NULL, 0); |
|||
|
|||
if (!children) { |
|||
result += offs; |
|||
continue; |
|||
} |
|||
if (children < offs) continue; |
|||
result += values[offs - 1]; |
|||
} |
|||
|
|||
return result; |
|||
} |
|||
|
|||
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); |
|||
|
|||
gchar **node = strings; |
|||
printf("%d\n", parse_node(&node)); |
|||
|
|||
g_strfreev(strings); |
|||
return 0; |
|||
} |
Loading…
Reference in new issue