This commit is contained in:
dobiadi
2023-12-02 14:37:43 +01:00
parent 03eba3c219
commit 7850c50a55
5 changed files with 1129 additions and 0 deletions

BIN
day1/c/day1 Executable file
View File

Binary file not shown.

118
day1/c/day1.c Normal file
View File

@@ -0,0 +1,118 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LINE_MAX_LENGTH 256
#define NUM_0_CHARCODE 48
#define NUM_9_CHARCODE NUM_0_CHARCODE + 9
#define PART_2 1
#define FORWARD 1
#define BACKWARD -1
char* english_digit_strings[] = {
"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
};
#define NUM_OF_DIGITS ((sizeof(english_digit_strings)) / (sizeof(english_digit_strings[0])))
char *english_digit_strings_reversed[NUM_OF_DIGITS];
int get_num(char *p, int dir) {
// Check whether it is a number
if (*p >= NUM_0_CHARCODE && *p <= NUM_9_CHARCODE) {
return *p - NUM_0_CHARCODE;
}
// Check spelled out numbers
if (PART_2) {
// Check each digit
for (int i = 0; i < NUM_OF_DIGITS; i++) {
char *reference = dir == FORWARD ? english_digit_strings[i] : english_digit_strings_reversed[i];
char *tmp = p;
int match = 1;
while (*reference != '\0') {
if (*tmp != *reference) {
match = 0;
break;
}
reference++;
tmp += dir;
}
if (match) {
return i;
}
}
}
return -1;
}
char* reverse_string(char* str) {
char *p = str;
while (*p != '\0') p++;
int len = p - str;
char *newstr = (char *)malloc(len + 1);
memset(newstr, 0, len + 1);
p--;
char* newp = newstr;
while (p != str) {
*newp = *p;
newp++;
p--;
}
*newp = *p;
return newstr;
}
void create_reversed_digit_strings() {
for (int i = 0; i < NUM_OF_DIGITS; i++) {
english_digit_strings_reversed[i] = reverse_string(english_digit_strings[i]);
}
}
int main() {
char *p, *buf, c;
int sum = 0, n = -1;
create_reversed_digit_strings();
buf = (char *)malloc(LINE_MAX_LENGTH);
memset(buf, 0, LINE_MAX_LENGTH);
p = buf;
while ((c = getchar()) != EOF) {
*p++ = c;
if (c == '\n') {
// Find last number (p points to the end of line)
while ((n = get_num(p, BACKWARD)) == -1) p--;
sum += n;
// Find first number
p = buf;
while ((n = get_num(p, FORWARD)) == -1) p++;
sum += n * 10;
memset(buf, 0, LINE_MAX_LENGTH);
p = buf;
}
}
free(buf);
for (int i = 0; i < NUM_OF_DIGITS; i++) {
free(english_digit_strings_reversed[i]);
}
printf("%i\n", sum);
}

1000
day1/input.txt Normal file
View File

File diff suppressed because it is too large Load Diff

4
day1/sample.txt Normal file
View File

@@ -0,0 +1,4 @@
1abc2
pqr3stu8vwx
a1b2c3d4e5f
treb7uchet

7
day1/sample2.txt Normal file
View File

@@ -0,0 +1,7 @@
two1nine
eightwothree
abcone2threexyz
xtwone3four
4nineeightseven2
zoneight234
7pqrstsixteen