11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
|
/* === aocYYYYDD =======================================================
===================================================================== */
void aocYYYYDD(char *data, size_t len) {
(void)len; // unused argument
}
#endif
/* === aoc202506 =======================================================
===================================================================== */
static long long unsigned add2506(long long unsigned v[4][1024], int lin, int col) {
long long unsigned sum = 0;
for (int k = 0; k < lin; k++) sum += v[k][col];
return sum;
}
static long long unsigned mul2506(long long unsigned v[4][1024], int lin, int col) {
long long unsigned sum = 1;
for (int k = 0; k < lin; k++) sum *= v[k][col];
return sum;
}
static long long unsigned input_202506[4][1024];
void aoc202506(char *data, size_t len) {
(void)len; // unused argument
char *X;
for (;;) {
X = strchr(data, '\n');
if (!X) break;
*X = 'X';
}
int lin = 0, col;
char *err = data;
for (;;) { // for each line
col = 0;
for (;;) { // for each number
while (isspace(*err)) err++;
long long unsigned tmp = strtoull(err, &err, 10);
if ((*err == 'X') && (tmp == 0)) { err++; break; }
input_202506[lin][col++] = tmp;
}
lin++;
printf("got line %d with %d columns\n", lin, col);
if ((*err == '+') || (*err == '*')) break;
}
printf("from %llu to %llu\n", input_202506[0][0], input_202506[lin-1][col-1]);
col = 0;
while (isspace(*err)) err++;
long long unsigned sum = 0;
for (;;) {
switch (*err) {
default: /* does not happen! */ break;
case 'X': break;
case '+': sum += add2506(input_202506, lin, col); break;
case '*': sum += mul2506(input_202506, lin, col); break;
}
if (*err == 'X') break;
col++;
err++;
while (isspace(*err)) err++;
}
printf("part 1: %llu\n", sum);
}
/* === aoc202505 =======================================================
===================================================================== */
struct Range {
long long unsigned lo, hi;
};
int ascending(const void *a, const void *b) {
static int ascending(const void *a, const void *b) {
const struct Range *aa = a, *bb = b;
if (aa->lo < bb->lo) return -1;
if (aa->lo > bb->lo) return 1;
return 0;
}
void aoc202505(char *data, size_t len) {
|