#include #include typedef struct { int position[2]; char character_direction; } character_t; character_t * get_new_position(char * string, character_t *character); int main() { // Create a basic character that starts at [0, 0], facing north character_t *character = (character_t*)malloc(sizeof(character_t)); character->position[0] = 0; character->position[1] = 0; character->character_direction = 'N'; // Grab our puzzle input and parse it FILE* f = fopen("input.txt", "r"); while(!feof(f)) { char input[15]; fscanf(f, "%s", input); get_new_position(input, character); } // The number of blocks away should be equal to the absolute difference between [x_1, y_1] and [x_0, y_0] // Since we start at [0, 0] and measure how many blocks we move from there the answer is simply the // absolute value of the sum of blocks moved in the x and y direction from our origin. int difference = abs(character->position[0] + character->position[1]); printf("Position: [%i, %i]\n", character->position[0], character->position[1]); printf("Blocks away: %i\n", difference); return 0; } character_t * get_new_position(char * string, character_t *character) { int * character_position = character->position; char character_direction = character->character_direction; char turn_direction; int steps; sscanf(string, "%c%i", &turn_direction, &steps); if(character_direction == 'N') { if(turn_direction == 'R') { character_direction = 'E'; character_position[0] += steps; } else if(turn_direction == 'L') { character_direction = 'W'; character_position[0] -= steps; } } else if(character_direction == 'S') { if(turn_direction == 'R') { character_direction = 'W'; character_position[0] -= steps; } else if(turn_direction == 'L') { character_direction = 'E'; character_position[0] += steps; } } else if(character_direction == 'E') { if(turn_direction == 'R') { character_direction = 'S'; character_position[1] -= steps; } else if(turn_direction == 'L') { character_direction = 'N'; character_position[1] += steps; } } else if(character_direction == 'W') { if(turn_direction == 'R') { character_direction = 'N'; character_position[1] += steps; } else if(turn_direction == 'L') { character_direction = 'S'; character_position[1] -= steps; } } // Update the character to reflect the changes made character->character_direction = character_direction; character->position[0] = character_position[0]; character->position[1] = character_position[1]; return character; }