From f46ace5333e19e56e0024fef94c732b8129ef9f3 Mon Sep 17 00:00:00 2001 From: kaiwu Date: Wed, 14 Dec 2022 10:53:29 +0800 Subject: 2022 day13 part1 --- src/2022/day13/aoc.cpp | 22 ++++++++++++++++++++-- src/2022/day13/aoc.h | 43 ++++++++++++++++++++++++++++++++++++------- 2 files changed, 56 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/2022/day13/aoc.cpp b/src/2022/day13/aoc.cpp index 793d5eb..fb71da4 100644 --- a/src/2022/day13/aoc.cpp +++ b/src/2022/day13/aoc.cpp @@ -1,8 +1,26 @@ #include "aoc.h" +#include namespace aoc2022 { -std::pair day13(line_view) { - return {0, 0}; +std::pair day13(line_view file) { + int count{0}; + int pair{0}; + packet* ps[2] = {nullptr, nullptr}; + per_line(file, [&pair, &count, &ps](line_view lv){ + if (lv.length > 1) { + int i = pair % 2; + ps[i] = new packet; + const char* p = lv.line; + packet::load(&p, &ps[i]); + if (i == 1 && *(ps[0]) < *(ps[1])) { + printf("group[%d] is in right order\n", pair/2 + 1); + count += pair / 2 + 1; + } + pair += 1; + } + return true; + }); + return {count, 0}; } } 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 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(); } }; -- cgit v1.2.3