diff options
| -rw-r--r-- | 12/input | 793 | ||||
| -rw-r--r-- | 12/part1.c | 78 | ||||
| -rw-r--r-- | 12/part2.c | 66 | ||||
| -rw-r--r-- | 12/testinput | 5 | ||||
| -rw-r--r-- | utils.h | 2 |
5 files changed, 944 insertions, 0 deletions
diff --git a/12/input b/12/input new file mode 100644 index 0000000..0abcff3 --- /dev/null +++ b/12/input @@ -0,0 +1,793 @@ +F20 +L90 +E5 +S1 +R180 +F67 +S3 +F75 +L180 +W4 +N4 +F88 +L90 +S2 +E2 +L180 +S4 +F3 +L90 +N3 +L180 +N5 +E2 +N1 +W5 +L180 +E3 +F50 +E1 +F84 +S4 +W3 +L90 +W1 +N1 +L90 +F7 +L90 +N5 +R90 +F35 +E2 +F100 +E5 +R90 +W1 +F85 +R90 +W4 +S4 +R180 +F20 +R90 +N5 +W1 +S3 +F77 +R90 +N1 +W2 +R90 +N5 +F25 +E2 +R90 +E5 +W5 +S3 +F59 +N3 +L90 +F1 +N5 +F31 +R90 +S5 +R90 +E1 +F81 +S3 +L90 +F79 +S3 +W1 +F25 +E2 +N4 +R90 +F16 +R180 +F29 +S5 +W1 +L90 +F50 +E5 +L90 +W2 +L90 +N2 +W1 +R90 +F65 +E3 +F21 +W3 +S5 +L90 +N4 +R180 +N4 +F37 +W1 +F40 +W1 +F78 +S1 +L90 +E2 +F12 +L90 +W3 +F16 +N1 +L90 +R90 +N2 +R90 +N2 +F5 +R90 +F43 +L90 +E5 +F89 +N3 +E3 +S3 +W1 +F48 +E2 +N2 +L180 +F78 +N5 +L90 +F14 +N3 +R180 +E4 +F27 +N5 +R90 +F68 +L270 +W5 +F59 +W1 +F98 +E3 +F47 +R270 +F43 +L90 +F79 +L90 +F94 +W1 +F40 +R90 +W4 +S3 +F13 +E3 +S5 +L180 +S3 +L270 +W4 +R90 +N3 +F64 +E2 +R90 +F4 +E5 +S3 +R90 +W1 +E3 +R90 +E5 +S1 +R180 +W1 +F36 +E1 +F45 +L90 +F92 +W3 +N3 +W2 +R90 +W2 +F79 +E2 +R90 +S4 +N4 +E1 +N4 +R90 +F71 +E3 +S4 +L90 +E1 +F10 +N3 +F53 +E5 +S5 +R90 +F85 +N2 +W4 +R90 +F64 +W1 +S2 +L90 +N1 +W1 +F40 +F7 +S3 +F20 +S3 +F63 +F97 +N5 +F23 +N3 +F20 +L90 +S3 +E3 +F54 +N5 +F79 +N1 +F50 +L90 +F10 +R90 +W3 +S1 +R180 +F93 +E1 +F73 +L90 +E3 +N3 +L180 +F1 +E1 +N2 +W2 +L90 +W2 +L90 +N4 +F97 +W2 +S1 +F89 +E3 +L90 +S5 +R90 +N3 +E2 +L90 +F59 +R90 +S4 +F53 +W3 +S3 +R90 +F35 +R180 +W1 +F32 +N2 +W3 +L90 +F55 +N3 +E3 +R90 +F50 +N5 +L90 +S3 +E3 +R90 +E4 +S2 +R90 +N4 +W1 +R90 +F44 +R90 +F56 +W3 +S3 +L90 +S2 +E4 +F91 +S2 +R90 +N3 +R90 +W1 +S1 +F4 +L90 +E3 +L180 +N5 +F67 +F50 +S3 +F71 +L90 +F81 +R90 +E1 +F27 +W2 +N5 +E5 +F99 +R90 +F30 +F98 +L90 +F20 +S2 +E2 +N2 +E4 +R180 +W2 +S5 +L90 +N5 +F59 +E1 +N3 +F42 +E2 +N4 +W1 +R90 +E4 +L180 +F92 +R90 +N4 +W3 +L180 +S3 +W2 +N2 +L90 +F26 +S1 +E5 +R90 +E2 +L90 +W4 +F96 +E5 +F4 +F98 +E3 +F77 +R180 +E4 +F28 +E3 +W2 +N3 +F23 +N3 +L90 +W5 +R90 +L90 +N3 +W3 +F97 +R90 +E3 +F22 +L180 +S2 +F22 +W2 +S5 +W5 +F40 +E3 +L90 +E1 +S3 +L90 +W3 +E5 +F69 +L90 +W5 +N4 +L90 +N3 +F49 +S2 +E2 +F41 +W2 +F61 +E3 +R90 +W5 +L180 +E4 +F52 +E2 +F86 +R270 +F27 +W5 +R90 +E1 +S4 +F3 +R90 +E3 +F28 +F31 +S4 +F81 +S5 +F89 +E5 +N2 +F21 +E5 +L180 +S4 +L180 +S3 +E3 +R180 +F58 +E5 +F8 +W2 +R90 +N3 +L270 +S1 +F67 +W4 +N2 +L180 +L90 +E5 +L180 +S3 +W2 +R180 +F70 +R90 +S5 +F40 +S1 +R90 +N1 +R90 +S3 +R90 +E2 +R90 +F86 +R90 +F33 +W2 +N5 +R180 +W5 +S4 +F1 +E2 +L90 +S3 +F68 +E3 +R90 +S4 +R90 +W2 +F51 +L90 +W1 +N2 +L90 +F40 +N1 +R90 +W1 +S5 +F39 +L90 +F61 +L90 +N4 +W5 +F5 +E2 +N3 +F67 +S4 +F44 +R180 +F4 +L180 +N2 +L90 +E5 +L270 +E1 +L90 +F99 +R90 +N2 +E4 +R90 +F96 +E1 +N4 +L90 +W5 +R270 +E2 +L90 +F33 +R90 +F11 +N1 +R90 +E5 +R90 +W1 +F61 +R90 +F98 +R180 +F86 +N5 +L180 +W4 +S3 +R180 +F98 +E5 +S4 +F33 +N2 +E4 +L90 +F36 +S1 +E1 +F92 +F48 +W3 +N4 +F2 +E4 +F98 +W5 +F67 +S3 +F60 +N5 +R90 +S2 +L90 +N5 +L180 +W2 +N4 +L90 +N4 +L90 +F90 +E5 +L90 +S1 +W1 +N2 +F76 +S4 +E5 +F5 +S4 +R90 +F41 +E5 +N5 +R90 +N5 +E2 +F13 +W2 +N5 +L180 +N5 +L90 +S3 +W1 +S1 +E1 +E3 +S5 +R90 +S1 +W3 +R90 +E2 +F37 +L90 +N3 +E4 +F85 +S1 +F27 +S5 +F10 +S2 +L90 +E1 +S3 +F6 +N5 +E5 +R90 +W2 +F2 +N4 +F73 +R90 +S5 +L90 +F87 +L90 +F100 +L90 +N3 +E3 +F90 +R90 +N5 +N3 +F80 +N2 +F88 +R90 +S5 +L90 +F88 +R90 +W2 +S4 +N2 +F9 +S3 +E4 +R180 +F60 +W2 +F93 +E2 +F4 +L90 +F20 +R180 +F87 +W2 +F75 +S3 +L180 +W3 +R180 +W1 +R90 +E1 +R90 +N4 +W2 +R90 +W1 +F74 +S1 +W4 +S3 +F59 +R270 +W1 +N5 +F42 +F34 +W3 +R270 +E1 +L90 +W3 +R270 +F57 +N2 +E3 +L270 +F57 +R90 +F68 +E1 +L90 +E2 +F4 +N2 +F28 +N4 +L90 +N4 +E5 +N2 +R90 +F89 +R270 +N4 +L90 +W4 +L90 +W4 +F92 +S1 +F77 +N2 +E1 +R90 +F72 +N5 +R90 +W1 +W3 +F25 +E1 +S4 +E3 +F95 +W3 +F72 +S3 +E5 +N4 +E1 +R180 +F73 +N1 +W2 +S5 +E3 +R180 +F68 +F4 diff --git a/12/part1.c b/12/part1.c new file mode 100644 index 0000000..7ee0f4a --- /dev/null +++ b/12/part1.c @@ -0,0 +1,78 @@ +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <malloc.h> +#include <string.h> + +#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/12/part2.c b/12/part2.c new file mode 100644 index 0000000..745b56c --- /dev/null +++ b/12/part2.c @@ -0,0 +1,66 @@ +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <malloc.h> +#include <string.h> + +#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])); +} diff --git a/12/testinput b/12/testinput new file mode 100644 index 0000000..d382291 --- /dev/null +++ b/12/testinput @@ -0,0 +1,5 @@ +F10 +N3 +F7 +R90 +F11 @@ -1,6 +1,8 @@ #ifndef AOC_UTILS_H #define AOC_UTILS_H +#define SWAP(a, b) (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))) + #define likely(x) __builtin_expect((x), 1) #define unlikely(x) __builtin_expect((x), 0) |
