127 lines
2.6 KiB
C++
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;
|
|
} |