Files
dobiadi 0e3c31c0de Day6 C
2023-12-08 22:06:39 +01:00

67 lines
1.7 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define LINE_MAX_LENGTH 256
#define MAX_TIMES 16
#define NUM_0_CHARCODE 48
#define NUM_9_CHARCODE NUM_0_CHARCODE + 9
int score(int max_duration, int hold_duration);
int main() {
char *p, *buf, c;
buf = (char *)malloc(LINE_MAX_LENGTH);
memset(buf, 0, LINE_MAX_LENGTH);
p = buf;
unsigned long first = 1;
unsigned long times[MAX_TIMES], times_num = 0;
unsigned long records[MAX_TIMES], records_num = 0;
while ((c = getchar()) != EOF) {
*p++ = c;
if (c == '\n') {
p = buf;
while (*p != '\n') {
while (*p < NUM_0_CHARCODE || *p > NUM_9_CHARCODE) p++;
if (first) {
sscanf(p, "%lu", &times[times_num]);
times_num++;
} else {
sscanf(p, "%lu", &records[records_num]);
records_num++;
}
while (*p >= NUM_0_CHARCODE && *p <= NUM_9_CHARCODE) p++;
}
if (first) {
first = 0;
}
memset(buf, 0, LINE_MAX_LENGTH);
p = buf;
}
}
// Part 1
unsigned long part1 = 1;
for (unsigned long i = 0; i < times_num; i++) {
// quick mafs
unsigned long min_d = (unsigned long)ceil((times[i] - sqrt(times[i] * times[i] - 4 * (records[i]+1))) / 2);
unsigned long max_d = (unsigned long)floor((times[i] + sqrt(times[i] * times[i] - 4 * (records[i]+1))) / 2);
part1 *= (max_d - min_d + 1);
}
printf("%lu\n", part1);
free(buf);
}
int score(int max_duration, int hold_duration) {
return hold_duration * (max_duration - hold_duration);
}