aboutsummaryrefslogtreecommitdiff
path: root/src/2015
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2022-03-25 23:26:04 +0800
committerkaiwu <kaiwu2004@gmail.com>2022-03-25 23:26:04 +0800
commitdaf739fbead15378ae7341076570658b92dfef6a (patch)
treeaad54205905c8366522011a1effafa1bdfc94e67 /src/2015
parent44f63ae43ba08394cc0ff374ace5a707aa3c08bf (diff)
downloadadvent-of-code-daf739fbead15378ae7341076570658b92dfef6a.tar.gz
advent-of-code-daf739fbead15378ae7341076570658b92dfef6a.zip
day19 parse pattern
Diffstat (limited to 'src/2015')
-rw-r--r--src/2015/day19/aoc.cpp10
-rw-r--r--src/2015/day19/aoc.h26
2 files changed, 20 insertions, 16 deletions
diff --git a/src/2015/day19/aoc.cpp b/src/2015/day19/aoc.cpp
index 0d69022..af42b23 100644
--- a/src/2015/day19/aoc.cpp
+++ b/src/2015/day19/aoc.cpp
@@ -10,10 +10,14 @@ std::pair<int, int> day19(line_view file) {
});
std::map<int, std::vector<molecule::change>> changes;
m.check(changes);
- int shortest = INT32_MAX;
+ // int shortest = INT32_MAX;
// m.deduct(m.original, 0, &shortest);
- m.transfer("e", 0, &shortest);
- return {m.distinct(changes), shortest};
+ // m.transfer("e", 0, &shortest);
+ std::vector<molecule::pattern> ps;
+ const char* x = nullptr;
+ m.parse_pattern(m.original, 0, ps, &x);
+ std::for_each(ps.begin(), ps.end(), [](molecule::pattern p) { std::cout << p.depth << " -> " << p.lv << std::endl; });
+ return {m.distinct(changes), 0};
}
} // namespace aoc2015
diff --git a/src/2015/day19/aoc.h b/src/2015/day19/aoc.h
index 62b4785..1fd4624 100644
--- a/src/2015/day19/aoc.h
+++ b/src/2015/day19/aoc.h
@@ -24,30 +24,30 @@ struct molecule {
replacement c;
};
- //...Rn.Y.Y.Ar
- const char* parse_pattern(line_view lv, std::vector<line_view>& ps) {
+ struct pattern {
+ int depth;
+ line_view lv;
+ };
+
+ //...Rn..Ar
+ void parse_pattern(line_view lv, int depth, std::vector<pattern>& ps, const char** a) {
const char* p1 = lv.line;
const char* p2 = lv.line + lv.length;
const char* p = p1;
while (p < p2) {
if (*p == 'R') {
- const char* a = parse_pattern({p+2, p2}, ps);
- p = a + 2;
+ parse_pattern({p + 2, p2}, depth + 1, ps, a);
+ p = *a + 2;
continue;
}
if (*p == 'A' && *(p + 1) == 'r') {
- ps.push_back({p1, p});
- return p;
- }
- if (*p == 'Y') {
- ps.push_back({p1, p});
- p++;
- p1 = p;
- continue;
+ ps.push_back({depth, {p1, p}});
+ *a = p;
+ return;
}
p++;
}
- return nullptr;
+ ps.push_back({depth, {p1, p}});
}
void check(size_t i, replacement r, std::map<int, std::vector<change>>& vr) const noexcept {