DEV Community

Discussion on: Advent of Code 2019 Solution Megathread - Day 3: Crossed Wires

Collapse
 
ninfadora profile image
Irene • Edited

My ugly solution in C , after hours unfortunately :(

#include <stdio.h>
#include <stdlib.h>

#define START_C 0
#define START_R 0

typedef struct _dist_point_min{
    int dist_min;
    int row_min;
    int col_min;
}dist_point_min;

void calc_dist(int row, int col, dist_point_min *str);

int main(int argc, char *argv[]){
    FILE* fd;
    int i;
    char buf;
    int pos;

    fd = fopen("input.txt","r");


    if (fd == NULL){
        perror("Errore apertura file");
        exit(1);
    }
    i = 0;
    while((fscanf(fd, "%c,", &buf)) > 0 && buf != '\n' ){
    }
    while(fscanf(fd, "%c,", &buf) > 0 && fscanf(fd, "%d,", &pos) > 0){
        //printf("p: %d\n", pos);
        i++;
    }
    //printf("i: %d\n",i);
    int NUM_ELEM = i+1;



    dist_point_min min_dist = {100000000, START_C, START_R};

    int x[NUM_ELEM];
    x[0] = START_R;
    int y[NUM_ELEM];
    y[0] = START_C;

    int x1[NUM_ELEM];
    x1[0] = START_R;
    int y1[NUM_ELEM];
    y1[0] = START_C;

    int curr_row = START_R;
    int curr_col = START_C;

    fd = fopen("input.txt","r");

    if (fd == NULL){
        perror("Errore apertura file");
        exit(1);
    }
    i = 1;
    while((fscanf(fd, "%c,", &buf)) > 0 && buf != '\n' ){
        switch(buf){
            case 'R':
                fscanf(fd, "%d,", &pos);
                x[i] = curr_row;
                y[i] = curr_col + pos;
                printf("R r: %d, c: %d \n", x[i], y[i]);
                curr_col += pos;
                break;
            case 'L':
                fscanf(fd, "%d,", &pos);
                x[i] = curr_row;
                y[i] = curr_col - pos;
                printf("L r: %d, c: %d \n", x[i], y[i]);
                curr_col -= pos;
                break;
            case 'U':
                fscanf(fd, "%d,", &pos);
                x[i] = curr_row - pos;
                y[i] = curr_col;
                printf("U r: %d, c: %d \n", x[i], y[i]);
                curr_row -= pos;
                break;
            case 'D':
                fscanf(fd, "%d,", &pos);
                x[i] = curr_row + pos;
                y[i] = curr_col;
                printf("D r: %d, c: %d \n", x[i], y[i]);
                curr_row += pos;
                break;  
        }
        i++;

    }
    /*for(int c = 0; c < 5; c++){
        printf("r: %d, c: %d \n",x[c],y[c]);
    }*/

    curr_row = START_R;
    curr_col = START_C;
    i = 1;

    printf("\n");
    while((fscanf(fd, "%c,", &buf)) > 0){   
        switch(buf){
            case 'R':
                fscanf(fd, "%d,", &pos);
                x1[i] = curr_row;
                y1[i] = curr_col + pos;
                for(int r = 1; r <= NUM_ELEM; r++){
                //  printf("\n y[r]: %d, y1[i-1]: %d, y1[i]: %d\n",y[r],y1[i-1],y1[i]);
                    if(x1[i] <= x[r-1] && x1[i] >= x[r] || x1[i] >= x[r-1] && x1[i] <= x[r]){
                //      printf("S4\n");
                        if(y1[i-1] <= y[r] && y1[i] >= y[r] || y1[i-1] >= y[r] && y1[i] <= y[r]){
                    //      printf("S4_2\n");
                //          printf("\nVEDI: x: %d, y1: %d\n\n",x1[i],y[r]);
                            calc_dist(x1[i],y[r],&min_dist);
                        }
                    }
                }
                printf("R r: %d, c: %d \n", x1[i], y1[i]);
                curr_col += pos;
                break;
            case 'L': //*
                fscanf(fd, "%d,", &pos);
                x1[i] = curr_row;
                y1[i] = curr_col - pos;
                for(int r = 1; r <= NUM_ELEM; r++){
            //      printf("\n y[r]: %d, y1[i-1]: %d, y1[i]: %d\n",y[r],y1[i-1],y1[i]);
                    if(x1[i] <= x[r-1] && x1[i] >= x[r] || x1[i] >= x[r-1] && x1[i] <= x[r]){
            //          printf("S4\n");
                        if(y1[i-1] <= y[r] && y1[i] >= y[r] || y1[i-1] >= y[r] && y1[i] <= y[r]){
                //          printf("S4_2\n");
                    //      printf("\nVEDI: x: %d, y1: %d\n\n",x1[i],y[r]);
                            calc_dist(x1[i],y[r],&min_dist);
                        }
                    }
                }
                printf("L r: %d, c: %d \n", x1[i], y1[i]);
                curr_col -= pos;
                break;
            case 'U':
                fscanf(fd, "%d,", &pos);
                x1[i] = curr_row - pos;
                y1[i] = curr_col;
                for(int r = 1; r <= NUM_ELEM; r++){
            //      printf("\n y[r-1]: %d, y[r]: %d, y1[i]: %d\n",y[r-1],y[r],y1[i]);
                    if(y1[i] <= y[r-1] && y1[i] >= y[r] || y1[i] >= y[r-1] && y1[i] <= y[r]){
                //      printf("S4\n");
                        if(x1[i-1] <= x[r] && x1[i] >= x[r] || x1[i-1] >= x[r] && x1[i] <= x[r]){
                //          printf("S4_2\n");
                //          printf("\nVEDI: x1: %d, y: %d\n\n",x[r],y1[i]);
                            calc_dist(x[r],y1[i],&min_dist);
                        }
                    }
                }
                printf("U r: %d, c: %d \n", x1[i], y1[i]);
                curr_row -= pos;
                break;
            case 'D': //*
                fscanf(fd, "%d,", &pos);
                x1[i] = curr_row + pos;
                y1[i] = curr_col;
                for(int r = 1; r <= NUM_ELEM; r++){
            //      printf("\n y[r-1]: %d, y[r]: %d, y1[i]: %d\n",y[r-1],y[r],y1[i]);
                    if(y1[i] <= y[r-1] && y1[i] >= y[r] || y1[i] >= y[r-1] && y1[i] <= y[r]){
                        //printf("S4\n");
                        if(x1[i-1] <= x[r] && x1[i] >= x[r] || x1[i-1] >= x[r] && x1[i] <= x[r]){
                    //      printf("S4_2\n");
                            printf("\nVEDI: x1: %d, y: %d, pos %d\n\n",x[r],x1[i-1],curr_row+pos);
                            calc_dist(x[r],y1[i],&min_dist);
                        }
                    }
                }
                printf("D r: %d, c: %d \n", x1[i], y1[i]);
                curr_row += pos;
                break;  
        }
        i++;

    }

    printf("%d\n", min_dist.dist_min);


}


void calc_dist(int row, int col, dist_point_min *min){
    if(row == START_R && col == START_C)
        return;
    printf("-r: %d,c: %d\n\n", row,col);
    int d_col = 0;
    int d_row = 0;

    if(col > START_C)
        d_col = col - START_C;
    else
        d_col = START_C - col;


    if(row > START_R)
        d_row = row - START_R;
    else
        d_row = START_R - row;

        printf("+c: %d, r: %d\n",d_col,d_row);

    int dist = d_row + d_col;
    printf("dist %d\n",dist);

    if(min -> dist_min > dist){
        min -> dist_min = dist;
        min -> row_min = row;
        min -> col_min = col;
    }
}