aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2022-04-19 16:13:55 +0800
committerkaiwu <kaiwu2004@gmail.com>2022-04-19 16:13:55 +0800
commit48c40701db5a52fe7b80bc6eecca08c1447412b5 (patch)
treea7e388d6f57ee3167ca6f37f0698a772e85d994a /src
parent70f20b9317a11f443d01b4863969857173c63f14 (diff)
downloadadvent-of-code-48c40701db5a52fe7b80bc6eecca08c1447412b5.tar.gz
advent-of-code-48c40701db5a52fe7b80bc6eecca08c1447412b5.zip
2018 day7 part1
Diffstat (limited to 'src')
-rw-r--r--src/2018/day7/aoc.cpp21
-rw-r--r--src/2018/day7/aoc.h55
-rw-r--r--src/2018/day7/input07
3 files changed, 82 insertions, 1 deletions
diff --git a/src/2018/day7/aoc.cpp b/src/2018/day7/aoc.cpp
index e879fb5..6210814 100644
--- a/src/2018/day7/aoc.cpp
+++ b/src/2018/day7/aoc.cpp
@@ -1,4 +1,25 @@
#include "aoc.h"
namespace aoc2018 {
+std::map<char, instruction*> instruction::instructions = {};
+
+void day7(line_view file, char sequence[]) {
+ per_line(file, [](line_view lv) {
+ char p1 = *(lv.line + 5);
+ char p2 = *(lv.line + 36);
+ instruction* i1 = instruction::make(p1);
+ instruction* i2 = instruction::make(p2);
+ i2->add_dependency(i1);
+ return true;
+ });
+
+ instruction* n = instruction::next();
+ int i{0};
+ while (n != nullptr) {
+ sequence[i++] = n->label;
+ n->make_done();
+ n = instruction::next();
+ }
}
+
+} // namespace aoc2018
diff --git a/src/2018/day7/aoc.h b/src/2018/day7/aoc.h
index bd2634a..25d127d 100644
--- a/src/2018/day7/aoc.h
+++ b/src/2018/day7/aoc.h
@@ -1,5 +1,58 @@
#pragma once
#include "common.h"
+#include <map>
+#include <set>
namespace aoc2018 {
-}
+
+struct instruction {
+ static std::map<char, instruction*> instructions;
+
+ static instruction* make(char x) {
+ auto it = instructions.find(x);
+ if (it == instructions.end()) {
+ auto p = instructions.insert({x, new instruction{x, false, {}}});
+ return p.first->second;
+ }
+ return it->second;
+ }
+
+ static instruction* next() {
+ instruction* n = nullptr;
+ for (auto& kv : instructions) {
+ if (kv.second->ready()) {
+ if (n == nullptr) {
+ n = kv.second;
+ } else {
+ if (*kv.second < *n) {
+ n = kv.second;
+ }
+ }
+ }
+ }
+ return n; // if nullptr all done
+ }
+
+ char label;
+ bool done;
+ std::set<instruction*> deps;
+
+ void add_dependency(instruction* x) noexcept { deps.insert(x); }
+ void make_done() noexcept { done = true; }
+ bool operator<(const instruction& other) const noexcept { return label < other.label; }
+
+ bool ready(const std::set<instruction*> ds) const noexcept {
+ for (auto& i : ds) {
+ if (!i->done) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ bool ready() const noexcept { return !done && (deps.empty() || ready(deps)); }
+};
+
+void day7(line_view, char[]);
+
+} // namespace aoc2018
diff --git a/src/2018/day7/input0 b/src/2018/day7/input0
new file mode 100644
index 0000000..9ab25bf
--- /dev/null
+++ b/src/2018/day7/input0
@@ -0,0 +1,7 @@
+Step C must be finished before step A can begin.
+Step C must be finished before step F can begin.
+Step A must be finished before step B can begin.
+Step A must be finished before step D can begin.
+Step B must be finished before step E can begin.
+Step D must be finished before step E can begin.
+Step F must be finished before step E can begin.