Advent of Code

Diff
Login

Diff

Differences From Artifact [d3378fca96]:

To Artifact [98d4a70597]:


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
69
70
71
72
73
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
69
70
71
72
73
74
75
76
77
78
79











+











-
-
+
+
+
+
+
+


-
+
-
-

-
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+

-
+

-
+















+
+
+
+
+
+
+
+






+







#include <ctype.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "aocdailies.h"
#include "aocutils.h"

/* === aoc202407 =======================================================
   Part one looks easy
   Part two also easy
===================================================================== */

static unsigned long long concat(unsigned long long a, unsigned long long b) {
    unsigned long long r = a, t = b;
    while (b) {
        r *= 10;
        b /= 10;
    }
    return r + t;
}

static bool canbetrue(unsigned long long v, unsigned long long *a, size_t n) {
    if (n == 1) return (v == *a);
static int operatorsrequired(unsigned long long v, unsigned long long *a, size_t n, int minop) {
    // assumes no unsigned long long overflowing
    if (n == 1) {
        if (v == *a) return minop;
        return 0;
    }
    unsigned long long tmp = a[1];
    a[1] = a[0] + tmp;
    if (canbetrue(v, a+1, n-1)) { a[1] = tmp; return true; }
    int p = operatorsrequired(v, a+1, n-1, (minop > 2)?3:2);
    a[1] = a[0] * tmp;
    if (canbetrue(v, a+1, n-1)) { a[1] = tmp; return true; }
    a[1] = tmp;
    return false;
    if (p) return p;
}

static bool canbetrue3(unsigned long long v, unsigned long long *a, size_t n) {
    // still, let's assume no unsigned long long overflowing
    if (n == 1) return (v == *a);
    unsigned long long tmp = a[1];
    a[1] = a[0] + tmp;
    if (canbetrue3(v, a+1, n-1)) { a[1] = tmp; return true; }
    a[1] = a[0] * tmp;
    if (canbetrue3(v, a+1, n-1)) { a[1] = tmp; return true; }
    a[1] = a[0] * tmp;
    p = operatorsrequired(v, a+1, n-1, (minop > 2)?3:2);
    a[1] = tmp;
    if (p) return p;
    a[1] = concat(a[0], tmp);
    if (canbetrue3(v, a+1, n-1)) { a[1] = tmp; return true; }
    p = operatorsrequired(v, a+1, n-1, 3);
    a[1] = tmp;
    return false;
    return p;
}

void aoc202407(char *data, size_t len) {
    (void)len; // unused argument
    unsigned long long calibrationtotal = 0, calibration3total = 0;
    char *line = strtok(data, "\n");
    unsigned long long number[50], nnumber;
    while (line) {
        char *err;
        unsigned long long testvalue = strtoull(line, &err, 10);
        err += 1; // skip ':'
        nnumber = 0;
        while (*err == ' ') {
            number[nnumber++] = strtoul(err, &err, 10);
        }
        switch (operatorsrequired(testvalue, number, nnumber, 0)) {
            default: break;
            case 2: calibrationtotal += testvalue;
                    __attribute__((fallthrough));
            case 3: calibration3total += testvalue;
                    break;
        }
        #if 0
        if (canbetrue(testvalue, number, nnumber)) {
            calibrationtotal += testvalue;
        }
        if (canbetrue3(testvalue, number, nnumber)) {
            calibration3total += testvalue;
        }
        #endif
        line = strtok(NULL, "\n");
    }
    printf("The calibration total is {%llu}.\n", calibrationtotal);
    printf("The calibration total with three operators is {%llu}.\n", calibration3total);
}

/* === aoc202406 =======================================================
105
106
107
108
109
110
111
112

113
114
115
116
117
118
119
111
112
113
114
115
116
117

118
119
120
121
122
123
124
125







-
+







    data[linearize2d(size, (unsigned)row_pos, (unsigned)col_pos)] = 'X'; // initial place visited
    while (validpos(size, row_pos + deltarow, col_pos + deltacol)) {
        switch (data[linearize2d(size, (unsigned)(row_pos+deltarow), (unsigned)(col_pos+deltacol))]) {
            default: exit(EXIT_FAILURE); // does not happen
            case '#': rightturn(&deltarow, &deltacol); break;
            case '.': visited++;
                      data[linearize2d(size, (unsigned)(row_pos+deltarow), (unsigned)(col_pos+deltacol))] = 'X';
                      /*fallthrough*/
                      __attribute__((fallthrough));
            case 'X': row_pos += deltarow;
                      col_pos += deltacol;
                      break;
        }
    }
    printf("The guard visits %u positions before leaving the area.\n", visited);
    // Part Two
132
133
134
135
136
137
138
139

140
141
142
143
144
145
146
138
139
140
141
142
143
144

145
146
147
148
149
150
151
152







-
+







                switch (data[linearize2d(size, (unsigned)(row_pos+deltarow), (unsigned)(col_pos+deltacol))]) {
                    default: puts("stepped on default"); exit(EXIT_FAILURE);
                    case '#': if (data[linearize2d(size, (unsigned)(row_pos), (unsigned)(col_pos))] == '4') looping = true;
                              rightturn(&deltarow, &deltacol);
                              break;
                    case '4': looping = true; break;
                    case '.': data[linearize2d(size, (unsigned)(row_pos+deltarow), (unsigned)(col_pos+deltacol))] = '0';
                              /*fallthrough*/
                              __attribute__((fallthrough));
                    case '1':
                    case '2':
                    case '3': data[linearize2d(size, (unsigned)(row_pos+deltarow), (unsigned)(col_pos+deltacol))]++;
                              row_pos += deltarow;
                              col_pos += deltacol;
                              break;
                }