From baf4910870a6e8999802b9a4a22eabd4142a34e3 Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Thu, 1 Dec 2022 22:30:22 +0100 Subject: Move all Advent of Codes into one repo --- 2020/12/part1.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2020/12/part2.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 2020/12/part1.c create mode 100644 2020/12/part2.c (limited to '2020/12') diff --git a/2020/12/part1.c b/2020/12/part1.c new file mode 100644 index 0000000..7ee0f4a --- /dev/null +++ b/2020/12/part1.c @@ -0,0 +1,78 @@ +#include +#include +#include +#include +#include + +#define MAX_INPUT_WIDTH 128 +#define MAX_INPUT_HEIGTH 128 +#define MAX_INPUT MAX_INPUT_WIDTH * MAX_INPUT_HEIGTH + +enum direction { + North, + East, + South, + West +}; + +int solve(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[8] = { 0 }; + + enum direction dir = East; + int hor = 0; + int ver = 0; + while (fgets(buffer, 8, file)) { + int n = atoi(buffer + 1); + switch (buffer[0]) { + case 'N': + ver += n; + break; + case 'E': + hor += n; + break; + case 'S': + ver -= n; + break; + case 'W': + hor -= n; + break; + case 'F': + switch (dir) { + case North: + ver += n; + break; + case East: + hor += n; + break; + case South: + ver -= n; + break; + case West: + hor -= n; + break; + } + break; + case 'R': + dir = (enum direction)(((int)dir + (n / 90)) % 4); + break; + case 'L': + dir = (enum direction)((abs(4 + ((int)dir - (n / 90))) % 4)); + break; + default: + break; + } + } + + fclose(file); + + return abs(ver) + abs(hor); +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", solve(argv[argc - 1])); +} diff --git a/2020/12/part2.c b/2020/12/part2.c new file mode 100644 index 0000000..745b56c --- /dev/null +++ b/2020/12/part2.c @@ -0,0 +1,66 @@ +#include +#include +#include +#include +#include + +#include "../utils.h" + +int solve(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[8] = { 0 }; + + int w_x = 10; + int w_y = 1; + int y = 0; + int x = 0; + while (fgets(buffer, 8, file)) { + int n = atoi(buffer + 1); + switch (buffer[0]) { + case 'N': + w_y += n; + break; + case 'E': + w_x += n; + break; + case 'S': + w_y -= n; + break; + case 'W': + w_x -= n; + break; + case 'F': + for (int i = 0; i < n; i++) { + x += w_y; + y += w_x; + } + break; + case 'R': + for (int i = 0; i < n / 90; i++) { + SWAP(w_y, w_x); + w_y = -w_y; + } + break; + case 'L': + for (int i = 0; i < n / 90; i++) { + SWAP(w_y, w_x); + w_x = -w_x; + } + break; + default: + break; + } + } + + fclose(file); + + return abs(x) + abs(y); +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", solve(argv[argc - 1])); +} -- cgit v1.2.3