You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1007 B
51 lines
1007 B
#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;
|
|
}
|
|
|