#include "common.h" #include namespace aoc2022 { struct packet { enum componet_t { is_int, is_list, }; struct componet { componet_t t; int v = 0; packet *p = nullptr; }; std::vector ps; static void get_number(const char** p, int* d) { const char* p0 = *p; while (*p0 >= '0' && *p0 <= '9') { *d = 10 * (*d) + *p0 - '0'; p0++; } *p = p0; } static void load(const char** p, packet** pp) { const char* p0 = *p; while (*p0 != ']') { p0++; if (*p0 >= '0' && *p0 <= '9') { componet* c = new componet; c->t = is_int; get_number(&p0, &c->v); (*pp)->ps.push_back(c); } else if (*p0 == '[') { componet* c = new componet; c->t = is_list; c->p = new packet; (*pp)->ps.push_back(c); load(&p0, &c->p); } } *p = p0 + 1; } char* indent (int s) { static char space[100] = {0}; memset(space, 0 ,100); for(int i = 0; i < s; i++) { space[i] = ' '; } return space; }; void print(int d) { printf("["); int i{0}; const char* s[] = {"", ","}; for(componet* c : ps) { if (c->t == is_int) { printf("%s%d", s[(int) i > 0], c->v); } else { printf("%s", s[(int) i > 0]); c->p->print(d+1); } i++; } printf("]"); } 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) { 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) { 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); bool b1 = *p < *(c2->p); if (b1) return true; bool b2 = *(c2->p) < *p; if (b2) return false; } if (c1->t == is_list && c2->t == is_int) { packet *p = make_packet(c2->v); bool b1 = *(c1->p) < *(p); if (b1) return true; bool b2 = *p < *(c1->p); if (b2) return false; } if (c1->t == is_list && c2->t == is_list) { bool b1 = *(c1->p) < *(c2->p); if (b1) return true; bool b2 = *(c2->p) < *(c1->p); if (b2) return false;; } } return p1.ps.size() < p2.ps.size(); } }; std::pair day13(line_view); }