diff options
Diffstat (limited to 'src/2022/day13/aoc.h')
-rw-r--r-- | src/2022/day13/aoc.h | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/2022/day13/aoc.h b/src/2022/day13/aoc.h index cfd6a9a..d0749fc 100644 --- a/src/2022/day13/aoc.h +++ b/src/2022/day13/aoc.h @@ -2,6 +2,60 @@ #include <vector> namespace aoc2022 { + +struct packet { + enum componet_t { + is_int, + is_list, + }; + + struct componet { + componet_t t; + int v; + packet *p; + }; + + std::vector<componet*> ps; + + 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; + } + + void load(const char** p, packet** pp) { + const char* p0 = *p; + while (*p0 != '\n') { + 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 == '[') { + componet* c = new componet; + c->t = is_list; + c->p = new packet; + load(&p0, &c->p); + (*pp)->ps.push_back(c); + } + else if (*p0 == ']') { + *p = p0; + return; + } + p0++; + } + } + + friend bool operator<(const packet& p1, const packet& p2) { + return true; + } +}; + std::pair<int, int> day13(line_view); } |