1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
#include "common.h"
#include <vector>
namespace aoc2022 {
struct packet {
enum componet_t {
is_int,
is_list,
};
struct componet {
componet_t t;
int v = 0;
packet *p = nullptr;
};
std::vector<componet*> 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<int, int> day13(line_view);
}
|