Moortiii icon

day_1_1 (Simplified)

Moortiii | PRO | 11/03/17 02:34:37 PM UTC | 0 ⭐ | 374 👁️ | Never ⏰ | []
C |

2.92 KB

|

None

|

0 👍

/

0 👎

#include <stdio.h>
#include <stdlib.h>
 
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;
}

Comments