commit 7267dec4c549b1cde79ebc8789268e17ae8f20a6
parent 2c440e0548d15ffb62cf4472240588b9eb220e46
Author: Sebastiano Tronto <sebastiano@tronto.net>
Date:   Thu, 19 Dec 2024 07:21:47 +0100
Improved part 2 day 19 2024 with string_view
Diffstat:
4 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -1,3 +1,3 @@
 */*/*.out
 */*/*.txt
-*/*/.swp
+*/*/*.swp
diff --git a/2024/19/day19b.cpp b/2024/19/day19b-string.cpp
diff --git a/2024/19/day19b.cpp b/2024/19/day19b.cpp
@@ -11,28 +11,27 @@
 #include <vector>
 using namespace std;
 
-vector<string> gettowels(const string& line) {
-	vector<string> ret;
-	int j = 0;
-	for (int i = 0; j != -1; i = j+2) {
+vector<string_view> gettowels(const string_view& line) {
+	vector<string_view> ret;
+	unsigned sz = line.size();
+	for (int i = 0, j = 0; j != -1; i = j+2) {
 		j = line.find(",", i);
-		ret.push_back(line.substr(i, (j == -1 ? line.size() : j)-i));
+		ret.push_back(line.substr(i, (j == -1 ? sz : j) - i));
 	}
 	return ret;
 }
 
-int64_t countpossible(const string& p, const vector<string>& towels, vector<int64_t>& mem) {
-	if (p.size() == 0)
-		return 1;
-	if (mem[p.size()] != -1)
-		return mem[p.size()];
+int64_t f(const string_view& p, const vector<string_view>& towels, vector<int64_t>& mem) {
+	unsigned lp = p.size();
+	if (lp == 0) return 1;
+	if (mem[lp] != -1) return mem[lp];
 	int64_t ret = 0;
 	for (auto t : towels) {
-		if (t == p.substr(0, t.size()))
-			ret += countpossible(p.substr(
-			    t.size(), p.size() - t.size()), towels, mem);
+		unsigned lt = t.size();
+		if (t == p.substr(0, lt))
+			ret += f(p.substr(lt, lp - lt), towels, mem);
 	}
-	return (mem[p.size()] = ret);
+	return (mem[lp] = ret);
 }
 
 int main() {
@@ -47,7 +46,7 @@ int main() {
 	int64_t count = 0;
 	for (auto p : patterns) {
 		for (auto& m : mem) m = -1;
-		count += countpossible(p, towels, mem);
+		count += f(p, towels, mem);
 	}
 	cout << count << endl;
 	return 0;
diff --git a/2024/learned.txt b/2024/learned.txt
@@ -9,3 +9,4 @@ List of things I learned (or refreshed) with this year's AoC.
 * Day 8: set::insert_range(), but it is from C++23 only
 * Day 9: std::views
 * Day 11: if(init; cond)
+* Day 19: more practice with std::string_view for constant string