Skip to content

Instantly share code, notes, and snippets.

@weirddan455
Created December 28, 2022 00:12
Show Gist options
  • Save weirddan455/3456ec1a521a11c6b3cbcbea3d86dfa2 to your computer and use it in GitHub Desktop.
Save weirddan455/3456ec1a521a11c6b3cbcbea3d86dfa2 to your computer and use it in GitHub Desktop.
Advent of Code Day 25
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>
static long read_digit(char c)
{
switch (c) {
case '-':
return -1;
case '=':
return -2;
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
default:
fprintf(stderr, "Invalid input digit: %c\n", c);
exit(-1);
}
}
int main(void)
{
struct timespec start, end;
clock_gettime(CLOCK_MONOTONIC, &start);
FILE *file = fopen("input", "r");
if (file == NULL) {
perror("fopen");
return -1;
}
char buffer[32];
long sum = 0;
while (fgets(buffer, 32, file) != NULL) {
long entry = 0;
long mul = 1;
char *ptr = buffer;
while (*ptr != '\n') {
ptr++;
}
ptr--;
while (ptr != buffer) {
entry = entry + (mul * read_digit(*ptr));
ptr--;
mul *= 5;
}
entry = entry + (mul * read_digit(*ptr));
sum += entry;
}
fclose(file);
char answer[32];
int digits = 1;
long max = 2;
long mul = 1;
while (sum > max) {
mul *= 5;
max = max + (mul * 2);
digits += 1;
}
for (int i = 0; i < digits; i++) {
max = max - (mul * 2);
long cur = 0;
if (sum > max) {
while (sum > max) {
cur += 1;
sum -= mul;
}
} else {
while (labs(sum) > max) {
cur -= 1;
sum += mul;
}
}
mul /= 5;
switch(cur) {
case -2:
answer[i] = '=';
break;
case -1:
answer[i] = '-';
break;
case 0:
answer[i] = '0';
break;
case 1:
answer[i] = '1';
break;
case 2:
answer[i] = '2';
break;
default:
fprintf(stderr, "Invalid output digit: %ld\n", cur);
return -1;
}
}
answer[digits] = '\0';
puts(answer);
clock_gettime(CLOCK_MONOTONIC, &end);
int64_t nanoseconds = ((end.tv_sec - start.tv_sec) * 1000000000) + (end.tv_nsec - start.tv_nsec);
double milliseconds = nanoseconds / 1000000.0;
printf("Time: %fms\n", milliseconds);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment