adventofcode2021/day3/part2/main.cpp
2021-12-10 16:36:57 +00:00

127 lines
2.6 KiB
C++

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
cout << "Advent of Code 2021 - Day 3 Part 2" << endl;
vector<vector<char>> inputBits;
ifstream filein("input");
for(string line; getline(filein, line);) {
vector<char> bits;
for(int i = 0; i < 12; i++) {
if (line[i] == '1') {
bits.push_back(1);
}
else {
bits.push_back(0);
}
}
inputBits.push_back(bits);
}
vector<vector<char>> oxygen = inputBits;
int x, greater = 0;
while (oxygen.size() != 1) {
for(int i = 0; i < oxygen.size(); i++) {
if(oxygen[i][x] == 1) {
greater++;
}
}
char matcher;
if(greater > (oxygen.size() / 2)) {
matcher = 1;
} else {
matcher = 0;
}
oxygen.erase(
remove_if(
oxygen.begin(),
oxygen.end(),
[x, matcher](vector<char> z) {
if (z[x] != matcher) {
return true;
}
return false;
}
), oxygen.end()
);
x++;
greater = 0;
}
vector<vector<char>> co2 = inputBits;
x = 0;
greater = 0;
while (co2.size() != 1) {
for(int i = 0; i < co2.size(); i++) {
if(co2[i][x] == 0) {
greater++;
}
}
char matcher;
if(greater > (co2.size() / 2)) {
matcher = 0;
} else {
matcher = 1;
}
co2.erase(
remove_if(
co2.begin(),
co2.end(),
[x, matcher](vector<char> z) {
if (z[x] != matcher) {
return true;
}
return false;
}
), co2.end()
);
x++;
greater = 0;
}
for (auto c : oxygen) {
for (auto z : c) {
cout << +z;
}
}
cout << endl;
for (auto c : co2) {
for (auto z : c) {
cout << +z;
}
}
cout << endl;
unsigned int oxygen_final = 0;
unsigned int co2_final = 0;
for(int x = 0; x < 12; x++) {
if(oxygen[0][x] == 1) {
oxygen_final |= 1UL << 11 - x;
}
if(co2[0][x] == 1) {
co2_final |= 1UL << 11 - x;
}
}
cout << oxygen_final << endl << co2_final << endl;
cout << oxygen_final * co2_final << endl;
return 0;
}