Advent of Code

Diff
Login

Diff

Differences From Artifact [9ff67230c6]:

To Artifact [3d58482423]:


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
#include <ctype.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "aocdailies.h"
#include "aocutils.h"
































void aoc202404(char *data, size_t len) {
    (void)len; // unused argument
    // assume data is well-formatted and has the same number of rows and columns
    unsigned cols = strchr(data, '\n') - data, rows = cols;

    printf("data has %u cols, first three rows start with %c%c, %c%c, and %c%c.\n",
          rows, data[0], data[1],
          data[1*(cols+1)], data[1*(cols+1)+1],
          data[2*(cols+1)], data[2*(cols+1)+1]);














}

void aoc202403(char *data, size_t len) {
    (void)len; // unused argument
    unsigned sumproducts = 0, sumproducts2 = 0, term[2];
    char *rest = data;
    char *doleft = data;










>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>



|
>

|
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>







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
#include <ctype.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "aocdailies.h"
#include "aocutils.h"

static size_t rcmap(unsigned size, unsigned row, unsigned col) {
    return row * (size + 1) + col;
}

static bool masat(char *data, unsigned size, unsigned row, unsigned col, int drow, int dcol) {
    int maxrow = (int)row + 3*drow;
    int maxcol = (int)col + 3*dcol;
    if ((0 <= maxrow) && (maxrow < (int)size) && (0 <= maxcol) && (maxcol < (int)size)) {
        if (data[rcmap(size, (unsigned)((int)row + drow), (unsigned)((int)col + dcol))] != 'M') return false;
        if (data[rcmap(size, (unsigned)((int)row + 2*drow), (unsigned)((int)col + 2*dcol))] != 'A') return false;
        if (data[rcmap(size, (unsigned)((int)row + 3*drow), (unsigned)((int)col + 3*dcol))] != 'S') return false;
    } else {
        return false;
    }
    return true;
}

static unsigned xmasat(char *data, unsigned size, unsigned row, unsigned col) {
    unsigned finds = 0;
    if (data[rcmap(size, row, col)] != 'X') return 0;
    if (masat(data, size, row, col, -1, -1)) finds++;
    if (masat(data, size, row, col, -1,  0)) finds++;
    if (masat(data, size, row, col, -1, +1)) finds++;
    if (masat(data, size, row, col,  0, -1)) finds++;
    if (masat(data, size, row, col,  0, +1)) finds++;
    if (masat(data, size, row, col, +1, -1)) finds++;
    if (masat(data, size, row, col, +1,  0)) finds++;
    if (masat(data, size, row, col, +1, +1)) finds++;
    return finds;
}

void aoc202404(char *data, size_t len) {
    (void)len; // unused argument
    // assume data is well-formatted and has the same number of rows and columns
    unsigned size = strchr(data, '\n') - data;
    #if 0 // check assumption
    printf("data has %u cols, first three rows start with %c%c, %c%c, and %c%c.\n",
          size, data[0], data[1],
          data[1*(size+1)], data[1*(size+1)+1],
          data[2*(size+1)], data[2*(size+1)+1]);
    printf("ends with %c%c.\n", data[(size-1)*(size+1) + size-2], data[(size-1)*(size+1)+size-1]);
    printf("data has %u cols, first three rows start with %c%c, %c%c, and %c%c.\n",
          size, data[rcmap(size, 0, 0)], data[rcmap(size, 0, 1)],
          data[rcmap(size, 1, 0)], data[rcmap(size, 1, 1)],
          data[rcmap(size, 2, 0)], data[rcmap(size, 2, 1)]);
    printf("ends with %c%c.\n", data[rcmap(size, size-1, size-2)], data[rcmap(size, size-1, size-1)]);
    #endif
    unsigned xmascount = 0;
    for (unsigned row = 0; row < size; row++) {
        for (unsigned col = 0; col < size; col++) {
            xmascount += xmasat(data, size, row, col);
        }
    }
    printf("XMAS appears %u times in the little Elf's word search.\n", xmascount);
}

void aoc202403(char *data, size_t len) {
    (void)len; // unused argument
    unsigned sumproducts = 0, sumproducts2 = 0, term[2];
    char *rest = data;
    char *doleft = data;