-
Notifications
You must be signed in to change notification settings - Fork 0
/
part2.c
68 lines (57 loc) · 1.64 KB
/
part2.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <stdio.h>
#include <string.h>
#include <jansson.h>
// ! This needs the janosson library
// ! Debian/Ubuntu: sudo apt-get install libjansson-dev
// ! Fedora: sudo dnf install jansson-devel
// ! Arch Linux: sudo pacman -S jansson
// ! macOS: brew install jansson
// solution time: 03:01.50
long json_sum(json_t *root) {
long sum = 0;
if (json_is_array(root)) {
size_t index;
json_t *value;
json_array_foreach(root, index, value) {
sum += json_sum(value);
}
} else if (json_is_object(root)) {
const char *key;
json_t *value;
json_object_foreach(root, key, value) {
if (json_is_string(value) && strcmp(json_string_value(value), "red") == 0) {
return 0;
}
}
json_object_foreach(root, key, value) {
sum += json_sum(value);
}
} else if (json_is_integer(root)) {
sum += json_integer_value(root);
}
return sum;
}
int main() {
// read input.in to a string
FILE *fp = fopen("input.in", "r");
if (fp == NULL) {
printf("Could not open file input.in\n");
return 1;
}
char text[5000000];
if (fgets(text, sizeof(text), fp) == NULL) {
printf("Could not read line from file input.in\n");
return 1;
}
fclose(fp);
json_error_t error;
json_t *root = json_loads(text, 0, &error);
if(!root) {
fprintf(stderr, "error: on line %d: %s\n", error.line, error.text);
return 1;
}
long sum = json_sum(root);
printf("Sum of all numbers: %ld\n", sum);
json_decref(root);
return 0;
}