aboutsummaryrefslogtreecommitdiff
path: root/2020/03/solve.c
diff options
context:
space:
mode:
Diffstat (limited to '2020/03/solve.c')
-rw-r--r--2020/03/solve.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/2020/03/solve.c b/2020/03/solve.c
new file mode 100644
index 0000000..2f6312b
--- /dev/null
+++ b/2020/03/solve.c
@@ -0,0 +1,57 @@
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int part_one(FILE *fp)
+{
+ int res = 0;
+
+ char *line = NULL;
+ size_t len = 0, strlen = 0;
+ int curr = 0;
+ while ((strlen = getline(&line, &len, fp)) != -1) {
+ if (line[curr % (strlen - 1)] == '#')
+ res++;
+ curr += 3;
+ }
+
+ return res;
+}
+
+#define DOWN_TWO (1 << 15)
+int part_two(FILE *fp)
+{
+ int final = 1;
+ int opt[] = { 1, 3, 5, 7, 1 | DOWN_TWO };
+
+ char *line = NULL;
+ size_t len = 0, strlen = 0;
+ for (int i = 0; i < sizeof(opt) / sizeof(opt[0]); i++) {
+ int res = 0, row = 0, curr = 0;
+ while ((strlen = getline(&line, &len, fp)) != -1) {
+ if (row++ % 2 == 1 && opt[i] & DOWN_TWO)
+ continue;
+ if (line[curr % (strlen - 1)] == '#')
+ res++;
+ curr += opt[i] & ~DOWN_TWO;
+ }
+ rewind(fp);
+ final *= res;
+ }
+
+ return final;
+}
+
+int main(int argc, char *argv[])
+{
+ FILE *fp = fopen("input", "r");
+ if (!fp)
+ exit(EXIT_FAILURE);
+
+ printf("%d\n", part_one(fp));
+ rewind(fp);
+ printf("%u\n", part_two(fp));
+
+ fclose(fp);
+ return 0;
+}