C23 för dag 1:
Del 1:
Del 2:
Hade ju absolut gått att undivka brute-force metoden här med lite logik, men jag var lat.
Slängde mina parsing-funktioner I en header så jag kunde återanvända dom för senare dagar.
aoclib.h:
Massa kvarlämnat debug skräp och annan fulkod men man kan väl i alla fall se logiken om man vill jämföra. Har lite svårt att tro att någon skulle vara särskilt intresserad av dag 1 men...
Jag vill gärna se era lösningar ändå!
Del 1:
Kod:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define TEST false
#include "./../aoclib.h"
// #define REAL_INPUT "./../input.txt"
// #define TEST_INPUT "./test_input.txt"
int main() {
char input[1 << 16];
read_file(input);
char row[1024];
int input_cur = 0;
int zeroes = 0;
int dial_value = 50;
while (read_line(row, input, &input_cur)) {
printf("Line read == %s\n", row);
// printf("input_cur == %i\n", input_cur);
bool right = row[0] == 'R' ? true : false;
int value = atoi(&row[1]);
int direction_multiplier = right ? 1 : -1;
int movement = direction_multiplier * value;
dial_value = (dial_value + movement + (100 * 100)) % 100;
printf("dial = %i\n", dial_value);
if (dial_value == 0) {
zeroes++;
}
printf("zeroes = %i\n", zeroes);
}
printf("Final zeroes count = %i\n", zeroes);
printf("\n");
return 0;
}
Del 2:
Kod:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define TEST false
#include "./../aoclib.h"
// #define REAL_INPUT "./../input.txt"
// #define TEST_INPUT "./test_input.txt"
int main() {
char input[1 << 16];
read_file(input);
char row[1024];
int input_cur = 0;
int zeroes = 0;
int dial_value = 50;
while (read_line(row, input, &input_cur)) {
printf("Line read == %s\n", row);
// printf("input_cur == %i\n", input_cur);
bool right = row[0] == 'R' ? true : false;
int value = atoi(&row[1]);
int direction_multiplier = right ? 1 : -1;
for (int idx = 0; idx < value; idx++) {
dial_value += direction_multiplier;
dial_value %= 100;
if (dial_value == 0) {
zeroes++;
}
}
printf("dial = %i\n", dial_value);
printf("zeroes = %i\n", zeroes);
}
printf("Final zeroes count = %i\n", zeroes);
printf("\n");
return 0;
}
Hade ju absolut gått att undivka brute-force metoden här med lite logik, men jag var lat.
Slängde mina parsing-funktioner I en header så jag kunde återanvända dom för senare dagar.
aoclib.h:
Kod:
Kommer inte ihåg om jag fixade problemen med parse_to_delim innan jag hoppade över till python, då jag gjorde den till dag 2.#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define REAL_INPUT "./input.txt"
#define TEST_INPUT "./test_input.txt"
#if TEST
#define FILENAME TEST_INPUT
#else
#define FILENAME REAL_INPUT
#endif
#define DEBUG false
bool read_line(char* buffer, char* source, int* cur) {
// printf("cur before = %i\n", *cur);
if (source[*cur] == EOF || source[(*cur) + 1] == EOF) {
return false;
}
int buffer_cur = 0;
while (source[*cur] != '\n' && source[*cur] != EOF) {
buffer[buffer_cur] = source[*cur];
(*cur)++;
buffer_cur++;
}
while (source[*cur] == '\n') {
(*cur)++;
}
buffer[buffer_cur] = '\0';
// printf("cur after = %i\n", *cur);
return true;
}
int read_to_delim(char* buf, char* string, char* delim, int start) {
int buf_cur = 0;
// if (DEBUG) printf("b+s %i\n", buf_cur + start);
int delim_len = strlen(delim);
if (DEBUG) printf("string: [%s]\ndelim: [%s]\nstart: [%i]\n", &string[start], delim, start);
while (string[buf_cur + start] != '\0') {
if (string[buf_cur + start] == delim[0]) {
if (DEBUG) printf("delim check at %i\n", buf_cur + start);
if (DEBUG) printf("strncmp returned %i\n", strncmp(&(string[buf_cur + start]), delim, delim_len));
if (strncmp(&(string[buf_cur + start]), delim, delim_len) == 0) {
buf_cur += delim_len;
break;
}
}
if (DEBUG) printf("read a %c\n", string[buf_cur + start]);
buf[buf_cur] = string[buf_cur + start];
buf_cur++;
// if (DEBUG) printf("b+s %i\n", buf_cur + start);
}
// if (DEBUG) printf("b+s %i\n", buf_cur + start);
buf[buf_cur] = '\0';
if (string[buf_cur] == '\0') {
return -1;
}
// if (DEBUG) printf("b+s %i\n", buf_cur + start);
char temp;
// scanf("%c", &temp);
// if (DEBUG) printf("b+s %i\n", buf_cur + start);
if (DEBUG) printf("returning %i\n", buf_cur + start);
return buf_cur + start;
}
void read_file(char* buffer) {
char filename[] = FILENAME;
printf("Reading %s\n", filename);
signed char c = 1;
int idx = 0;
FILE* file = fopen(filename, "r");
if (file == NULL) {
printf("Error: File not found! (%s)\n", filename);
buffer = NULL;
return;
}
while (c != EOF && c != '\0') {
c = getc(file);
// printf("Read a %c\n", c);
buffer[idx] = c;
idx++;
}
buffer[idx] = '\0';
printf("%i bytes read from %s\n", idx, filename);
fclose(file);
}
Jag vill gärna se era lösningar ändå!