Holy shit I think that is the most complicated code I have ever written without a single bug in one go
This commit is contained in:
@@ -30,7 +30,7 @@ pair<array<string, 10>, array<string, 4>> parse_line(const string &s){
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
map<int, string> identify_digits(const array<string, 10> &digits){
|
map<string, int> identify_digits(const array<string, 10> &digits){
|
||||||
map<int, string> digit_strings;
|
map<int, string> digit_strings;
|
||||||
|
|
||||||
vector<string> size_fives;
|
vector<string> size_fives;
|
||||||
@@ -54,8 +54,88 @@ map<int, string> identify_digits(const array<string, 10> &digits){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vector<set<char>> size_fives_sets(3);
|
||||||
|
for(int i = 0; i < 3; ++i){
|
||||||
|
for(char &c : size_fives[i]){
|
||||||
|
size_fives_sets[i].insert(c);
|
||||||
|
}
|
||||||
|
|
||||||
return digit_strings;
|
// We know that 2 is the only digit that combines with 4 to be 8
|
||||||
|
for(char &c : digit_strings[4]){
|
||||||
|
size_fives_sets[i].insert(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(size_fives_sets[i].size() == 7){
|
||||||
|
digit_strings[2] = size_fives[i];
|
||||||
|
size_fives.erase(size_fives.begin() + i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now do kind of the same thing but for 5 and 3, combined with 7
|
||||||
|
set<char> three_or_five;
|
||||||
|
for(char &c : size_fives[0]){
|
||||||
|
three_or_five.insert(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(char &c : digit_strings[7]){
|
||||||
|
three_or_five.insert(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
// So in the case that it not of size 5, which means it is the number 5
|
||||||
|
if(three_or_five.size() != 5){
|
||||||
|
swap(size_fives[0], size_fives[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
digit_strings[3] = size_fives[0];
|
||||||
|
digit_strings[5] = size_fives[1];
|
||||||
|
|
||||||
|
vector<set<char>> size_six_sets(3);
|
||||||
|
for(int i = 0; i < 3; ++i){
|
||||||
|
for(char &c : size_six[i]){
|
||||||
|
size_six_sets[i].insert(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only 6 and 7 together form 8 from all the six sized digits
|
||||||
|
for(char &c : digit_strings[7]){
|
||||||
|
size_six_sets[i].insert(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(size_six_sets[i].size() == 7){
|
||||||
|
digit_strings[6] = size_six[i];
|
||||||
|
size_six.erase(size_six.begin() + i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now we only need 9 and 0, which can be distinguished by combining with 4
|
||||||
|
set<char> nine_or_zero;
|
||||||
|
for(char &c : size_six[0]){
|
||||||
|
nine_or_zero.insert(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(char &c : digit_strings[4]){
|
||||||
|
nine_or_zero.insert(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
// In the case that the size is 7, which means it combines to an eight
|
||||||
|
if(nine_or_zero.size() != 7){
|
||||||
|
swap(size_six[0], size_six[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
digit_strings[0] = size_six[0];
|
||||||
|
digit_strings[9] = size_six[1];
|
||||||
|
|
||||||
|
for(auto &s : digit_strings){
|
||||||
|
sort(s.second.begin(), s.second.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
map<string, int> result;
|
||||||
|
for(auto &d : digit_strings){
|
||||||
|
result[d.second] = d.first;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
@@ -106,8 +186,23 @@ int main(){
|
|||||||
|
|
||||||
cout << result << endl;
|
cout << result << endl;
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
for(auto &line : input_text){
|
||||||
|
auto digit_map = identify_digits(line.first);
|
||||||
|
|
||||||
|
int acc = 0;
|
||||||
|
for(int i = 0; i < 4; ++i){
|
||||||
|
string s = line.second[i];
|
||||||
|
sort(s.begin(), s.end());
|
||||||
|
|
||||||
|
acc *= 10;
|
||||||
|
acc += digit_map[s];
|
||||||
|
}
|
||||||
|
|
||||||
|
result += acc;
|
||||||
|
}
|
||||||
|
|
||||||
|
cout << result << endl;
|
||||||
|
|
||||||
cout << flush;
|
cout << flush;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user