summaryrefslogtreecommitdiff
path: root/Advent-of-Code-2022/aoc-3/main.c
diff options
context:
space:
mode:
authorkartofen <mladenovnasko0@gmail.com>2022-12-03 18:16:22 +0200
committerkartofen <mladenovnasko0@gmail.com>2022-12-03 18:16:22 +0200
commitc438b26e7453d890d77c382d8737b74b96f7ac63 (patch)
tree81839034848299a9bd0a2764aa3f9fd053932e05 /Advent-of-Code-2022/aoc-3/main.c
parent41085185b9a69e455a72d6beed8f29c52967d21d (diff)
day 3
Diffstat (limited to 'Advent-of-Code-2022/aoc-3/main.c')
-rw-r--r--Advent-of-Code-2022/aoc-3/main.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/Advent-of-Code-2022/aoc-3/main.c b/Advent-of-Code-2022/aoc-3/main.c
new file mode 100644
index 0000000..d8e5815
--- /dev/null
+++ b/Advent-of-Code-2022/aoc-3/main.c
@@ -0,0 +1,92 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if 0
+ #define PART part1
+#else
+ #define PART part2
+#endif
+
+#if 0
+ #define FILENAME "sample.txt"
+#else
+ #define FILENAME "input.txt"
+#endif
+
+int sum = 0;
+
+int char_to_index(char ch)
+{
+ if(ch >= 'a')
+ return ch - 'a';
+ return ch - 'A' + 26;
+}
+
+void part1(char *line)
+{
+ int times_seen[56] = {0};
+ int leftest[56] = {0}; // rightest position of that character seen
+ int rightest[56] = {0}; // leftest position of that character seen
+
+ int len = strlen(line);
+ len = (len % 2) ? len : len - 1; // fgets reads the new line and the last line has no newline
+ for(int i = 0; i < len; i++)
+ {
+ int ch = char_to_index(line[i]);
+ times_seen[ch]++;
+ if(times_seen[ch] == 1)
+ leftest[ch] = i;
+ else
+ rightest[ch] = i;
+
+ if(times_seen[ch] > 1)
+ if(leftest[ch] < len/2 && rightest[ch] >= len/2) {
+ sum += ch + 1;
+ break;
+ }
+ }
+}
+
+int gn = 0;
+int times_seen[56][3] = {0};
+
+void part2(char *line)
+{
+ for(int i = 0; line[i] != '\n' && line[i] != '\0'; i++)
+ times_seen[char_to_index(line[i])][gn]++;
+ gn++;
+
+ if(gn == 3) {
+ for(int j = 0; j < 56; j++)
+ if(times_seen[j][0] && times_seen[j][1] && times_seen[j][2]) {
+ sum += j + 1;
+ break;
+ }
+ gn = 0;
+ memset(times_seen, 0, sizeof(times_seen));
+ }
+
+}
+
+void parse()
+{
+ FILE *fp = fopen(FILENAME, "r");
+ if(!fp) {
+ fprintf(stderr, "ERROR: Could not open file: %s\n", FILENAME);
+ exit(1);
+ }
+
+ char line[256];
+ while(fgets(line, sizeof(line), fp) != NULL)
+ PART(line);
+
+ fclose(fp);
+}
+
+int main(void)
+{
+ parse();
+ printf("%d\n", sum);
+ return 0;
+}