From 93f9d02e978d10b4ff02ac029b6a6eff3d3193cf Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Mon, 9 Dec 2024 06:36:25 +0100 Subject: Day 9 2024 --- 2024/09/Makefile | 24 ++++++++++++++++++++++++ 2024/09/day09a.cpp | 32 ++++++++++++++++++++++++++++++++ 2024/09/day09b.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 2024/09/Makefile create mode 100644 2024/09/day09a.cpp create mode 100644 2024/09/day09b.cpp (limited to '2024/09') diff --git a/2024/09/Makefile b/2024/09/Makefile new file mode 100644 index 0000000..89cd1b9 --- /dev/null +++ b/2024/09/Makefile @@ -0,0 +1,24 @@ +CC=g++ -std=c++20 -g -Wall + +a: + ${CC} -o a.out day09a.cpp + +b: + ${CC} -o b.out day09b.cpp + +clean: + rm -f a b + +atest: a + ./a.out + +btest: b + ./b.out + +arun: a + ./a.out < input + +brun: b + ./b.out < input + +.PHONY: a b clean atest btest arun brun diff --git a/2024/09/day09a.cpp b/2024/09/day09a.cpp new file mode 100644 index 0000000..c52c8f0 --- /dev/null +++ b/2024/09/day09a.cpp @@ -0,0 +1,32 @@ +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; + +int main() { + vector a; + char c; + for (int id = 0; cin >> c; id++) + for (int j = 0; j < c-'0'; j++) + a.push_back(id % 2 == 0 ? id/2 : -1); // -1 = space + + int j = 0; + for (int i = a.size()-1; i >= 0; i--) { + while (a[j] >= 0) j++; + if (a[j] == -2) break; + a[j] = a[i]; + a[i] = -2; // -2 = freed up + } + + long long checksum = 0; + for (long long i = 0; i < (long long)a.size() && a[i] != -2; i++) + checksum += i*a[i]; + cout << checksum << endl; + + return 0; +} diff --git a/2024/09/day09b.cpp b/2024/09/day09b.cpp new file mode 100644 index 0000000..3b1ac21 --- /dev/null +++ b/2024/09/day09b.cpp @@ -0,0 +1,46 @@ +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; + +int main() { + vector a; + vector> freesp, file; + char c; + for (int id = 0; cin >> c; id++) { + if (id % 2 == 1) + freesp.push_back(make_pair(a.size(), c-'0')); + else + file.push_back(make_pair(a.size(), c-'0')); + for (int j = 0; j < c-'0'; j++) + a.push_back(id % 2 == 0 ? id/2 : -1); // -1 = space + } + + for (int i = file.size()-1; i >= 0; i--) { + for (auto& f : freesp) { + if (f.first >= file[i].first) break; + if (f.second >= file[i].second) { + for (int k = 0; k < file[i].second; k++) { + a[f.first+k] = a[file[i].first+k]; + a[file[i].first+k] = -2; + } + f.first += file[i].second; + f.second -= file[i].second; + break; + } + } + } + + long long checksum = 0; + for (long long i = 0; i < (long long)a.size(); i++) + if (a[i] >= 0) + checksum += i*a[i]; + cout << checksum << endl; + + return 0; +} -- cgit v1.3