aboutsummaryrefslogtreecommitdiff
path: root/2025/03/puzzles.c
blob: 9bd68eecf97be260806aae02707a2613ecc657de (plain) (blame)
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
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef PART1
	#define DIGITS ((size_t)(2))
#else
	#define DIGITS ((size_t)(12))
#endif

int
main(void)
{
	FILE *fp = fopen("input", "r");
	if (fp == nullptr)
		err(EXIT_FAILURE, "failed to open input");

	char *buf = nullptr;
	size_t acc, bufsz;
	ssize_t n;

	acc = bufsz = 0;

	while ((n = getline(&buf, &bufsz, fp)) != -1) {
		if (buf[n - 1] == '\n')
			buf[--n] = 0;

		char digits[DIGITS + 1];
		memcpy(digits, buf, DIGITS);
		digits[DIGITS] = 0;

		for (size_t i = 1; i < n - DIGITS + 1; i++) {
			for (size_t j = 0; j < DIGITS; j++) {
				if (buf[i + j] > digits[j])
					memcpy(digits + j, buf + i + j, DIGITS - j);
			}
		}

		acc += (size_t)strtol(digits, nullptr, 10);
	}
	if (ferror(fp))
		err(EXIT_FAILURE, "failed to read record");

	fclose(fp);
	printf("%zu\n", acc);
	return EXIT_SUCCESS;
}