Index: aoc2015.c ================================================================== --- aoc2015.c +++ aoc2015.c @@ -1,8 +1,9 @@ #include #include #include +#include #include "aocdailies.h" #include "aocutils.h" struct House { int row, col; @@ -13,10 +14,11 @@ #else # error MAX_HOUSES already defined #endif void aoc201503(char *data, size_t len) { (void)len; // unused argument + char *data2 = data; // save it struct House house[MAX_HOUSES] = {0}; unsigned nhouse = 1; // house at [0, 0] visited int x = 0, y = 0; while (*data) { switch (*data) { @@ -43,10 +45,44 @@ house[nhouse].col = y; nhouse += 1; } } printf("Santa delivered at least 1 present to %u houses.\n", nhouse); + + memset(house, 0, sizeof house); + nhouse = 1; + struct House p[2] = {0}; + int who = 1; // 0: santa; 1: santa bot + // go around from the beginning + while (*data2) { + who = 1 - who; // santa; bot; santa; bot; ..., ..., ... + switch (*data2) { + default: break; + case '^': p[who].row++; break; + case 'v': p[who].row--; break; + case '>': p[who].col++; break; + case '<': p[who].col--; break; + } + data2++; + bool visited = false; + for (size_t k = 0; k < nhouse; k++) { + if ((house[k].row == p[who].row) && (house[k].col == p[who].col)) { + visited = true; + break; + } + } + if (!visited) { + if (nhouse == MAX_HOUSES) { + fprintf(stderr, "Need more houses in aoc201503()\n"); + exit(EXIT_FAILURE); + } + house[nhouse].row = p[who].row; + house[nhouse].col = p[who].col; + nhouse += 1; + } + } + printf("Santa and santa bot delivered at least 1 present to %u houses.\n", nhouse); } #undef MAX_HOUSES void aoc201502(char *data, size_t len) { (void)len; // unused argument