diff options
Diffstat (limited to 'src/2022/day13/aoc.h')
-rw-r--r-- | src/2022/day13/aoc.h | 43 |
1 files changed, 36 insertions, 7 deletions
diff --git a/src/2022/day13/aoc.h b/src/2022/day13/aoc.h index d0749fc..7999e25 100644 --- a/src/2022/day13/aoc.h +++ b/src/2022/day13/aoc.h @@ -11,13 +11,13 @@ struct packet { struct componet { componet_t t; - int v; - packet *p; + int v = 0; + packet *p = nullptr; }; std::vector<componet*> ps; - void get_number(const char** p, int* d) { + static void get_number(const char** p, int* d) { const char* p0 = *p; while (*p0 >= '0' && *p0 <= '9') { *d = 10 * (*d) + *p0 - '0'; @@ -26,14 +26,14 @@ struct packet { *p = p0; } - void load(const char** p, packet** pp) { + static void load(const char** p, packet** pp) { const char* p0 = *p; while (*p0 != '\n') { + p0++; if (*p0 >= '0' && *p0 <= '9') { componet* c = new componet; c->t = is_int; get_number(&p0, &c->v); - c->p = nullptr; (*pp)->ps.push_back(c); } else if (*p0 == '[') { @@ -47,12 +47,41 @@ struct packet { *p = p0; return; } - p0++; } } + static packet* make_packet(int v) { + componet* c = new componet; + c->p = nullptr; + c->t = is_int; + c->v = v; + packet* p = new packet; + p->ps.push_back(c); + return p; + } + friend bool operator<(const packet& p1, const packet& p2) { - return true; + for (size_t i = 0; i < p1.ps.size() && i < p2.ps.size(); i++) { + componet* c1 = p1.ps[i]; + componet* c2 = p2.ps[i]; + if (c1->t == is_int && c2->t == is_int) { + // printf("compare %d %d\n", c1->v, c2->v); + if (c1->v < c2->v) return true; + if (c1->v > c2->v) return false; + } + if (c1->t == is_int && c2->t == is_list) { + packet *p = make_packet(c1->v); + return *p < *(c2->p); + } + if (c1->t == is_list && c2->t == is_int) { + packet *p = make_packet(c2->v); + return *(c1->p) < *(p); + } + if (c1->t == is_list && c2->t == is_list) { + return *(c1->p) < *(c2->p); + } + } + return p1.ps.size() <= p2.ps.size(); } }; |