summaryrefslogtreecommitdiff
path: root/2020/06
diff options
context:
space:
mode:
Diffstat (limited to '2020/06')
-rw-r--r--2020/06/part1.c37
-rw-r--r--2020/06/part2.c44
2 files changed, 81 insertions, 0 deletions
diff --git a/2020/06/part1.c b/2020/06/part1.c
new file mode 100644
index 0000000..1b38192
--- /dev/null
+++ b/2020/06/part1.c
@@ -0,0 +1,37 @@
+#include <stdio.h>
+
+int plane_count(const char *filename)
+{
+ FILE *file = fopen(filename, "r");
+
+ // Include space for newline and string terminator
+ char buffer[32] = { 0 };
+
+ int tot = 0;
+ unsigned int current = 0;
+
+ while (fgets(buffer, 32, file)) {
+ if (buffer[0] == '\n') {
+ tot += __builtin_popcount(current);
+ current = 0;
+
+ continue;
+ }
+
+ char *p = buffer;
+ do {
+ current |= 1 << (*p - 97);
+ } while (*++p != '\n');
+ }
+
+ tot += __builtin_popcount(current);
+
+ fclose(file);
+
+ return tot;
+}
+
+int main(int argc, char *argv[])
+{
+ printf("%i\n", plane_count(argv[argc - 1]));
+}
diff --git a/2020/06/part2.c b/2020/06/part2.c
new file mode 100644
index 0000000..11c8469
--- /dev/null
+++ b/2020/06/part2.c
@@ -0,0 +1,44 @@
+#include <stdio.h>
+
+int plane_count(const char *filename)
+{
+ FILE *file = fopen(filename, "r");
+
+ // Include space for newline and string terminator
+ char buffer[32] = { 0 };
+
+ int tot = 0;
+ unsigned int current = 0xffffffff;
+
+ while (fgets(buffer, 32, file)) {
+ if (buffer[0] == '\n') {
+ if (current != 0xffffffff) {
+ tot += __builtin_popcount(current);
+ current = 0xffffffff;
+ }
+
+ continue;
+ }
+
+ unsigned int tmp = 0;
+ char *p = buffer;
+ do {
+ tmp |= 1 << (*p - 97);
+ } while (*++p != '\n');
+
+ current &= tmp;
+ }
+
+ fclose(file);
+
+ if (current != 0xffffffff) {
+ tot += __builtin_popcount(current);
+ }
+
+ return tot;
+}
+
+int main(int argc, char *argv[])
+{
+ printf("%i\n", plane_count(argv[argc - 1]));
+}