diff options
author | jacopograndi <jacopo.grandi@outlook.it> | 2022-01-06 13:05:05 +0100 |
---|---|---|
committer | jacopograndi <jacopo.grandi@outlook.it> | 2022-01-06 13:08:35 +0100 |
commit | fb54beb2bef7fe6b0d4e524b03c61d3f94ffee09 (patch) | |
tree | 0410d0039473ea4c03e77e0be80e1328b9efba08 /day03/day03.cpp | |
parent | 515317921d63720d2d591b6c2c2700ef3a711ad5 (diff) |
init
Diffstat (limited to 'day03/day03.cpp')
-rw-r--r-- | day03/day03.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/day03/day03.cpp b/day03/day03.cpp new file mode 100644 index 0000000..036cd07 --- /dev/null +++ b/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; +} |