aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/2022/day13/aoc.cpp22
-rw-r--r--src/2022/day13/aoc.h43
2 files changed, 56 insertions, 9 deletions
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 <iostream>
namespace aoc2022 {
-std::pair<int, int> day13(line_view) {
- return {0, 0};
+std::pair<int, int> 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<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();
}
};