aboutsummaryrefslogtreecommitdiff
path: root/2021/day03/day03.cpp
diff options
context:
space:
mode:
authorjacopograndi <jacopo.grandi@outlook.it>2022-01-06 18:42:22 +0100
committerjacopograndi <jacopo.grandi@outlook.it>2022-01-06 18:42:22 +0100
commit9f7b0cd76272068588d0a7220408f91390c5b583 (patch)
tree49a517f0303c951023554ba6b3fb8cc3d5eb1234 /2021/day03/day03.cpp
parent72a3388c042f4812e2db33f6d6a1b757392a18a6 (diff)
moved
Diffstat (limited to '2021/day03/day03.cpp')
-rw-r--r--2021/day03/day03.cpp96
1 files changed, 96 insertions, 0 deletions
diff --git a/2021/day03/day03.cpp b/2021/day03/day03.cpp
new file mode 100644
index 0000000..036cd07
--- /dev/null
+++ b/2021/day03/day03.cpp
@@ -0,0 +1,96 @@
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <vector>
+
+int bin_to_dec (std::string bin) {
+ int dec = 0, pow = 1;
+ for (std::size_t i=bin.size(); i > 0; i--) {
+ dec += pow * (bin[i-1] == '0' ? 0 : 1);
+ pow *= 2;
+ }
+ return dec;
+}
+
+std::vector<int> get_freq (std::vector<std::string> bits) {
+ std::vector<int> freq;
+ for (std::size_t i=0; i<bits[0].size(); i++) {
+ freq.push_back(0);
+ }
+
+ for (auto b : bits) {
+ for (std::size_t i=0; i< b.size(); i++) {
+ freq[i] += (b[i] == '0' ? 0 : 1)*2-1;
+ }
+ }
+ return freq;
+}
+
+std::vector<std::string> filter (std::vector<std::string> bits, int inv, int sel) {
+ std::vector<std::string> res;
+ auto freq = get_freq(bits);
+
+ for (auto b : bits) {
+ int f = freq[sel] * inv;
+ if (f == 0) f += inv;
+ if ((f > 0 ? '0' : '1') == b[sel]) {
+ res.push_back(b);
+ }
+ }
+
+ return res;
+}
+
+int main (int argc, char *argv[]) {
+ if (argc != 2) return 1;
+
+ std::string raw;
+ std::getline(std::ifstream(argv[1]), raw, '\0');
+
+ std::vector<std::string> bits;
+
+ while (1) {
+ auto token = raw.find("\n");
+ if (token != std::string::npos) {
+ bits.push_back(raw.substr(0, token));
+ raw = raw.substr(token+1);
+ } else {
+ if (raw.size() > 0) bits.push_back(raw);
+ break;
+ }
+ }
+
+ auto freq = get_freq(bits);
+
+ std::string gamma = "", epsilon = "";
+ for (std::size_t i=0; i<freq.size(); i++) {
+ gamma += freq[i] > 0 ? "1" : "0";
+ epsilon += freq[i] > 0 ? "0" : "1";
+ }
+
+ int g = bin_to_dec(gamma);
+ int e = bin_to_dec(epsilon);
+ std::cout << "power level " << e*g << ", "
+ << "epsilon " << e << " (" << epsilon << "), "
+ << "gamma " << g << " (" << gamma << ")" << std::endl;
+
+ std::vector<std::string> o2 = bits;
+ for (std::size_t i=0; i<freq.size(); i++) {
+ o2 = filter(o2, 1, i);
+ if (o2.size() == 1) break;
+ }
+
+ std::vector<std::string> co2 = bits;
+ for (std::size_t i=0; i<freq.size(); i++) {
+ co2 = filter(co2, -1, i);
+ if (co2.size() == 1) break;
+ }
+
+ int generator = bin_to_dec(o2[0]);
+ int scrubber = bin_to_dec(co2[0]);
+ std::cout << "oxigen generator rating " << scrubber*generator << ", "
+ << "epsilon " << generator << " (" << o2[0] << "), "
+ << "gamma " << scrubber << " (" << co2[0] << ")" << std::endl;
+
+ return 0;
+}