#include #include 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; }