From dfcc3b4f76741165134e51fc322871c58ff89c12 Mon Sep 17 00:00:00 2001 From: Marcus Penate Date: Thu, 9 Dec 2021 01:11:44 -0500 Subject: [PATCH] Day 9 submission --- Day 1/Marcus/cpp/part1.cpp | 38 +-- Day 1/Marcus/cpp/part2.cpp | 42 ++-- Day 2/Marcus/cpp/part1.cpp | 72 +++--- Day 2/Marcus/cpp/part2.cpp | 76 +++--- Day 3/Marcus/cpp/part2.cpp | 114 ++++----- Day 5/Marcus/cpp/part1.cpp | 118 +++++----- Day 5/Marcus/cpp/part2.cpp | 172 +++++++------- Day 6/Marcus/cpp/part1.cpp | 66 +++--- Day 6/Marcus/cpp/part2.cpp | 66 +++--- Day 7/Marcus/cpp/part1.cpp | 46 ++-- Day 7/Marcus/cpp/part2.cpp | 62 ++--- Day 8/Marcus/cpp/part1.cpp | 102 ++++---- Day 8/Marcus/cpp/part2.cpp | 472 ++++++++++++++++++------------------- Day 9/Marcus/cpp/part1.cpp | 45 ++++ Day 9/Marcus/cpp/part2.cpp | 82 +++++++ 15 files changed, 850 insertions(+), 723 deletions(-) create mode 100644 Day 9/Marcus/cpp/part1.cpp create mode 100644 Day 9/Marcus/cpp/part2.cpp diff --git a/Day 1/Marcus/cpp/part1.cpp b/Day 1/Marcus/cpp/part1.cpp index adbed50..4cdc4eb 100644 --- a/Day 1/Marcus/cpp/part1.cpp +++ b/Day 1/Marcus/cpp/part1.cpp @@ -1,20 +1,20 @@ -#include - -using namespace std; - -int main() -{ - int i1, i2, count=0; - - cin >> i1; - - while(cin >> i2) - { - if (i2 > i1) count++; - i1 = i2; - } - - cout << count << endl; - - return 0; +#include + +using namespace std; + +int main() +{ + int i1, i2, count=0; + + cin >> i1; + + while(cin >> i2) + { + if (i2 > i1) count++; + i1 = i2; + } + + cout << count << endl; + + return 0; } \ No newline at end of file diff --git a/Day 1/Marcus/cpp/part2.cpp b/Day 1/Marcus/cpp/part2.cpp index 552d8d3..a5dfc98 100644 --- a/Day 1/Marcus/cpp/part2.cpp +++ b/Day 1/Marcus/cpp/part2.cpp @@ -1,22 +1,22 @@ -#include - -using namespace std; - -int main() -{ - int i1, i2, i3, i4, count=0; - - cin >> i1 >> i2 >> i3; - - while(cin >> i4) - { - if (i2+i3+i4 > i1+i2+i3) count++; - i1 = i2; - i2 = i3; - i3 = i4; - } - - cout << count << endl; - - return 0; +#include + +using namespace std; + +int main() +{ + int i1, i2, i3, i4, count=0; + + cin >> i1 >> i2 >> i3; + + while(cin >> i4) + { + if (i2+i3+i4 > i1+i2+i3) count++; + i1 = i2; + i2 = i3; + i3 = i4; + } + + cout << count << endl; + + return 0; } \ No newline at end of file diff --git a/Day 2/Marcus/cpp/part1.cpp b/Day 2/Marcus/cpp/part1.cpp index a61ce02..62262cd 100644 --- a/Day 2/Marcus/cpp/part1.cpp +++ b/Day 2/Marcus/cpp/part1.cpp @@ -1,36 +1,36 @@ -#include -#include - -using namespace std; - -int main() -{ - string input; - const string forward = "forward"; - const string up = "up"; - const string down = "down"; - int horizontal = 0; - int depth = 0; - - while(getline(cin,input)) - { - int amount = atoi(&input.c_str()[input.find(' ')]);; - - if (string::npos != input.find(forward)) - { - horizontal += amount; - } - else if (string::npos != input.find(up)) - { - depth -= amount; - } - else if (string::npos != input.find(down)) - { - depth += amount; - } - } - - cout << horizontal*depth << endl; - - return 0; -} +#include +#include + +using namespace std; + +int main() +{ + string input; + const string forward = "forward"; + const string up = "up"; + const string down = "down"; + int horizontal = 0; + int depth = 0; + + while(getline(cin,input)) + { + int amount = atoi(&input.c_str()[input.find(' ')]);; + + if (string::npos != input.find(forward)) + { + horizontal += amount; + } + else if (string::npos != input.find(up)) + { + depth -= amount; + } + else if (string::npos != input.find(down)) + { + depth += amount; + } + } + + cout << horizontal*depth << endl; + + return 0; +} diff --git a/Day 2/Marcus/cpp/part2.cpp b/Day 2/Marcus/cpp/part2.cpp index c66f973..8713e7a 100644 --- a/Day 2/Marcus/cpp/part2.cpp +++ b/Day 2/Marcus/cpp/part2.cpp @@ -1,38 +1,38 @@ -#include -#include - -using namespace std; - -int main() -{ - string input; - const string forward = "forward"; - const string up = "up"; - const string down = "down"; - int horizontal = 0; - int depth = 0; - int aim = 0; - - while(getline(cin,input)) - { - int amount = atoi(&input.c_str()[input.find(' ')]);; - - if (string::npos != input.find(forward)) - { - horizontal += amount; - depth += amount*aim; - } - else if (string::npos != input.find(up)) - { - aim -= amount; - } - else if (string::npos != input.find(down)) - { - aim += amount; - } - } - - cout << horizontal*depth << endl; - - return 0; -} +#include +#include + +using namespace std; + +int main() +{ + string input; + const string forward = "forward"; + const string up = "up"; + const string down = "down"; + int horizontal = 0; + int depth = 0; + int aim = 0; + + while(getline(cin,input)) + { + int amount = atoi(&input.c_str()[input.find(' ')]);; + + if (string::npos != input.find(forward)) + { + horizontal += amount; + depth += amount*aim; + } + else if (string::npos != input.find(up)) + { + aim -= amount; + } + else if (string::npos != input.find(down)) + { + aim += amount; + } + } + + cout << horizontal*depth << endl; + + return 0; +} diff --git a/Day 3/Marcus/cpp/part2.cpp b/Day 3/Marcus/cpp/part2.cpp index 8321a21..082eca6 100644 --- a/Day 3/Marcus/cpp/part2.cpp +++ b/Day 3/Marcus/cpp/part2.cpp @@ -1,57 +1,57 @@ -#include -#include -#include - -using namespace std; - -int main() -{ - vector m_in, l_in; - string in_str; - - while(cin >> in_str) m_in.push_back(in_str); - - l_in = vector(m_in); - - int m_c, l_c; - - for(int i = 0; i < m_in[0].size() && m_in.size() > 1; i++) - { - m_c = 0; - for(int j = 0; j < m_in.size(); j++) - { - m_c += (m_in[j][i] == '1')?1:-1; - } - - for(int j = 0; j < m_in.size() && m_in.size() > 1; j++) - { - if (((m_c>=0)?'0':'1')==m_in[j][i]) - { - m_in.erase(m_in.begin()+j); - j--; - } - } - } - - for(int i = 0; i < l_in[0].size() && l_in.size() > 1; i++) - { - l_c = 0; - for(int j = 0; j < l_in.size(); j++) - { - l_c += (l_in[j][i] == '1')?1:-1; - } - - for(int j = 0; j < l_in.size() && l_in.size() > 1; j++) - { - if (((l_c>=0)?'1':'0')==l_in[j][i]) - { - l_in.erase(l_in.begin()+j); - j--; - } - } - } - - cout << stoi(m_in[0],nullptr,2)*stoi(l_in[0],nullptr,2) << endl; - - return 0; -} +#include +#include +#include + +using namespace std; + +int main() +{ + vector m_in, l_in; + string in_str; + + while(cin >> in_str) m_in.push_back(in_str); + + l_in = vector(m_in); + + int m_c, l_c; + + for(int i = 0; i < m_in[0].size() && m_in.size() > 1; i++) + { + m_c = 0; + for(int j = 0; j < m_in.size(); j++) + { + m_c += (m_in[j][i] == '1')?1:-1; + } + + for(int j = 0; j < m_in.size() && m_in.size() > 1; j++) + { + if (((m_c>=0)?'0':'1')==m_in[j][i]) + { + m_in.erase(m_in.begin()+j); + j--; + } + } + } + + for(int i = 0; i < l_in[0].size() && l_in.size() > 1; i++) + { + l_c = 0; + for(int j = 0; j < l_in.size(); j++) + { + l_c += (l_in[j][i] == '1')?1:-1; + } + + for(int j = 0; j < l_in.size() && l_in.size() > 1; j++) + { + if (((l_c>=0)?'1':'0')==l_in[j][i]) + { + l_in.erase(l_in.begin()+j); + j--; + } + } + } + + cout << stoi(m_in[0],nullptr,2)*stoi(l_in[0],nullptr,2) << endl; + + return 0; +} diff --git a/Day 5/Marcus/cpp/part1.cpp b/Day 5/Marcus/cpp/part1.cpp index 619ac9b..c1344a3 100644 --- a/Day 5/Marcus/cpp/part1.cpp +++ b/Day 5/Marcus/cpp/part1.cpp @@ -1,59 +1,59 @@ -#include -#include -#include - -using namespace std; - -struct Line -{ - int x1,y1,x2,y2; - - friend istream &operator>>( istream &input, Line &l ) { - input >> l.x1 >> l.y1 >> l.x2 >> l.y2; - return input; - } -}; - -inline constexpr int num_lines{500}; -inline constexpr int grid_size{1000}; - -int main() -{ - int grid[grid_size*grid_size] = {0}; - Line line; - set dangerous_locations; - - for(int i = 0; i < num_lines; i++) - { - cin >> line; - - if (line.x1 == line.x2) - { - for(int y = min(line.y1, line.y2); y <= max(line.y1, line.y2); y++) - { - grid[line.x1 + grid_size*y]++; - - if (grid[line.x1+y*grid_size] >= 2) - { - dangerous_locations.insert(line.x1+y*grid_size); - } - } - } - else if (line.y1 == line.y2) - { - for(int x = min(line.x1, line.x2); x <= max(line.x1, line.x2); x++) - { - grid[x + line.y1*grid_size]++; - - if (grid[x+line.y1*grid_size] >= 2) - { - dangerous_locations.insert(x+line.y1*grid_size); - } - } - } - } - - cout << dangerous_locations.size() << endl; - - return 0; -} +#include +#include +#include + +using namespace std; + +struct Line +{ + int x1,y1,x2,y2; + + friend istream &operator>>( istream &input, Line &l ) { + input >> l.x1 >> l.y1 >> l.x2 >> l.y2; + return input; + } +}; + +inline constexpr int num_lines{500}; +inline constexpr int grid_size{1000}; + +int main() +{ + int grid[grid_size*grid_size] = {0}; + Line line; + set dangerous_locations; + + for(int i = 0; i < num_lines; i++) + { + cin >> line; + + if (line.x1 == line.x2) + { + for(int y = min(line.y1, line.y2); y <= max(line.y1, line.y2); y++) + { + grid[line.x1 + grid_size*y]++; + + if (grid[line.x1+y*grid_size] >= 2) + { + dangerous_locations.insert(line.x1+y*grid_size); + } + } + } + else if (line.y1 == line.y2) + { + for(int x = min(line.x1, line.x2); x <= max(line.x1, line.x2); x++) + { + grid[x + line.y1*grid_size]++; + + if (grid[x+line.y1*grid_size] >= 2) + { + dangerous_locations.insert(x+line.y1*grid_size); + } + } + } + } + + cout << dangerous_locations.size() << endl; + + return 0; +} diff --git a/Day 5/Marcus/cpp/part2.cpp b/Day 5/Marcus/cpp/part2.cpp index 6e4cad3..7cb52ff 100644 --- a/Day 5/Marcus/cpp/part2.cpp +++ b/Day 5/Marcus/cpp/part2.cpp @@ -1,86 +1,86 @@ -#include -#include -#include - -using namespace std; - -struct Line -{ - int x1,y1,x2,y2; - - friend istream &operator>>( istream &input, Line &l ) { - input >> l.x1 >> l.y1 >> l.x2 >> l.y2; - return input; - } -}; - -inline constexpr int num_lines{500}; -inline constexpr int grid_size{1000}; - -int main() -{ - int grid[grid_size*grid_size] = {0}; - Line line; - set dangerous_locations; - - for(int i = 0; i < num_lines; i++) - { - cin >> line; - - if (line.x1 == line.x2) - { - for(int y = min(line.y1, line.y2); y <= max(line.y1, line.y2); y++) - { - grid[line.x1 + grid_size*y]++; - - if (grid[line.x1+y*grid_size] >= 2) - { - dangerous_locations.insert(line.x1+y*grid_size); - } - } - } - else if (line.y1 == line.y2) - { - for(int x = min(line.x1, line.x2); x <= max(line.x1, line.x2); x++) - { - grid[x + line.y1*grid_size]++; - - if (grid[x+line.y1*grid_size] >= 2) - { - dangerous_locations.insert(x+line.y1*grid_size); - } - } - } - else - { - if ((line.y2-line.y1)/(line.x2-line.x1) > 0) - { - for(int x = min(line.x1, line.x2), y = min(line.y1, line.y2); x <= max(line.x1, line.x2); x++, y++) - { - grid[x + y*grid_size]++; - - if (grid[x+y*grid_size] >= 2) - { - dangerous_locations.insert(x+y*grid_size); - } - } - } - else - { - for(int x = min(line.x1, line.x2), y = max(line.y1, line.y2); x <= max(line.x1, line.x2); x++, y--) - { - grid[x + y*grid_size]++; - - if (grid[x+y*grid_size] >= 2) - { - dangerous_locations.insert(x+y*grid_size); - } - } - } - } - } - - cout << dangerous_locations.size() << endl; - - return 0; -} +#include +#include +#include + +using namespace std; + +struct Line +{ + int x1,y1,x2,y2; + + friend istream &operator>>( istream &input, Line &l ) { + input >> l.x1 >> l.y1 >> l.x2 >> l.y2; + return input; + } +}; + +inline constexpr int num_lines{500}; +inline constexpr int grid_size{1000}; + +int main() +{ + int grid[grid_size*grid_size] = {0}; + Line line; + set dangerous_locations; + + for(int i = 0; i < num_lines; i++) + { + cin >> line; + + if (line.x1 == line.x2) + { + for(int y = min(line.y1, line.y2); y <= max(line.y1, line.y2); y++) + { + grid[line.x1 + grid_size*y]++; + + if (grid[line.x1+y*grid_size] >= 2) + { + dangerous_locations.insert(line.x1+y*grid_size); + } + } + } + else if (line.y1 == line.y2) + { + for(int x = min(line.x1, line.x2); x <= max(line.x1, line.x2); x++) + { + grid[x + line.y1*grid_size]++; + + if (grid[x+line.y1*grid_size] >= 2) + { + dangerous_locations.insert(x+line.y1*grid_size); + } + } + } + else + { + if ((line.y2-line.y1)/(line.x2-line.x1) > 0) + { + for(int x = min(line.x1, line.x2), y = min(line.y1, line.y2); x <= max(line.x1, line.x2); x++, y++) + { + grid[x + y*grid_size]++; + + if (grid[x+y*grid_size] >= 2) + { + dangerous_locations.insert(x+y*grid_size); + } + } + } + else + { + for(int x = min(line.x1, line.x2), y = max(line.y1, line.y2); x <= max(line.x1, line.x2); x++, y--) + { + grid[x + y*grid_size]++; + + if (grid[x+y*grid_size] >= 2) + { + dangerous_locations.insert(x+y*grid_size); + } + } + } + } + } + + cout << dangerous_locations.size() << endl; + + return 0; +} diff --git a/Day 6/Marcus/cpp/part1.cpp b/Day 6/Marcus/cpp/part1.cpp index cd1b5c4..2c1b8ad 100644 --- a/Day 6/Marcus/cpp/part1.cpp +++ b/Day 6/Marcus/cpp/part1.cpp @@ -1,33 +1,33 @@ -#include -#include - -using namespace std; - -int main() -{ - vector fish(300); - - for(int i = 0; i < 300; i++) cin >> fish[i]; - - for(int i = 0; i < 80; i++) - { - int new_fish_count = 0; - - for(int j = 0; j < fish.size(); j++) - { - if (--fish[j] < 0) - { - fish[j] = 6; - new_fish_count++; - } - } - - vector new_fish(new_fish_count, 8); - - fish.insert(fish.end(), new_fish.begin(), new_fish.end()); - } - - cout << fish.size() << endl; - - return 0; -} +#include +#include + +using namespace std; + +int main() +{ + vector fish(300); + + for(int i = 0; i < 300; i++) cin >> fish[i]; + + for(int i = 0; i < 80; i++) + { + int new_fish_count = 0; + + for(int j = 0; j < fish.size(); j++) + { + if (--fish[j] < 0) + { + fish[j] = 6; + new_fish_count++; + } + } + + vector new_fish(new_fish_count, 8); + + fish.insert(fish.end(), new_fish.begin(), new_fish.end()); + } + + cout << fish.size() << endl; + + return 0; +} diff --git a/Day 6/Marcus/cpp/part2.cpp b/Day 6/Marcus/cpp/part2.cpp index 974143c..52cfc3c 100644 --- a/Day 6/Marcus/cpp/part2.cpp +++ b/Day 6/Marcus/cpp/part2.cpp @@ -1,33 +1,33 @@ -#include - -using namespace std; - -int main() -{ - int next_fish; - unsigned long long fish[9] = {0}; - for(int i = 0; i < 300; i++) - { - cin >> next_fish; - fish[next_fish]++; - } - - unsigned long long total_fish = 300; - for(int i = 0; i < 256; i++) - { - unsigned long long spawning_fish = fish[0]; - total_fish += spawning_fish; - - for(int j = 1; j < 9; j++) - { - fish[j-1] = fish[j]; - } - - fish[6] += spawning_fish; - fish[8] = spawning_fish; - } - - cout << total_fish << endl; - - return 0; -} +#include + +using namespace std; + +int main() +{ + int next_fish; + unsigned long long fish[9] = {0}; + for(int i = 0; i < 300; i++) + { + cin >> next_fish; + fish[next_fish]++; + } + + unsigned long long total_fish = 300; + for(int i = 0; i < 256; i++) + { + unsigned long long spawning_fish = fish[0]; + total_fish += spawning_fish; + + for(int j = 1; j < 9; j++) + { + fish[j-1] = fish[j]; + } + + fish[6] += spawning_fish; + fish[8] = spawning_fish; + } + + cout << total_fish << endl; + + return 0; +} diff --git a/Day 7/Marcus/cpp/part1.cpp b/Day 7/Marcus/cpp/part1.cpp index aa18010..ec041e9 100644 --- a/Day 7/Marcus/cpp/part1.cpp +++ b/Day 7/Marcus/cpp/part1.cpp @@ -1,23 +1,23 @@ -#include -#include -#include - -using namespace std; - -int main() -{ - vector crabs(1000); - - for(int i = 0; i < 1000; i++) cin >> crabs[i]; - - sort(crabs.begin(), crabs.end()); - - int final_position = round(((float)crabs[499]+(float)crabs[500])/2.0f); - - int fuel = 0; - for(int i = 0; i < 1000; i++) fuel += (int)abs((float)final_position-crabs[i]); - - cout << fuel << endl; - - return 0; -} +#include +#include +#include + +using namespace std; + +int main() +{ + vector crabs(1000); + + for(int i = 0; i < 1000; i++) cin >> crabs[i]; + + sort(crabs.begin(), crabs.end()); + + int final_position = round(((float)crabs[499]+(float)crabs[500])/2.0f); + + int fuel = 0; + for(int i = 0; i < 1000; i++) fuel += (int)abs((float)final_position-crabs[i]); + + cout << fuel << endl; + + return 0; +} diff --git a/Day 7/Marcus/cpp/part2.cpp b/Day 7/Marcus/cpp/part2.cpp index 2fa0f8c..956c4be 100644 --- a/Day 7/Marcus/cpp/part2.cpp +++ b/Day 7/Marcus/cpp/part2.cpp @@ -1,31 +1,31 @@ -#include -#include -#include - -using namespace std; - -int main() -{ - vector crabs(1000); - - for(int i = 0; i < 1000; i++) cin >> crabs[i]; - - sort(crabs.begin(), crabs.end()); - - vector costs(crabs[999],0); - - for(int i = 0; i < costs.size(); i++) - { - for(int j = 0; j < 1000; j++) - { - int diff = (int)abs((float)i-crabs[j]); - costs[i] += (diff*(diff+1))/2; - } - } - - sort(costs.begin(), costs.end()); - - cout << costs[0] << endl; - - return 0; -} +#include +#include +#include + +using namespace std; + +int main() +{ + vector crabs(1000); + + for(int i = 0; i < 1000; i++) cin >> crabs[i]; + + sort(crabs.begin(), crabs.end()); + + vector costs(crabs[999],0); + + for(int i = 0; i < costs.size(); i++) + { + for(int j = 0; j < 1000; j++) + { + int diff = (int)abs((float)i-crabs[j]); + costs[i] += (diff*(diff+1))/2; + } + } + + sort(costs.begin(), costs.end()); + + cout << costs[0] << endl; + + return 0; +} diff --git a/Day 8/Marcus/cpp/part1.cpp b/Day 8/Marcus/cpp/part1.cpp index 917d0ac..f901b01 100644 --- a/Day 8/Marcus/cpp/part1.cpp +++ b/Day 8/Marcus/cpp/part1.cpp @@ -1,51 +1,51 @@ -#include -#include -#include -#include - -using namespace std; - -struct Note -{ - string patterns[10]; - string outputs[4]; - - friend istream &operator>>( istream &input, Note &n ) { - for(int i = 0; i < 10; i++) - { - input >> n.patterns[i]; - } - for(int i = 0; i < 4; i++) - { - input >> n.outputs[i]; - } - return input; - } -}; - -int main() -{ - Note note; - int count = 0; - while (cin >> note) - { - for(int i = 0; i < 4; i++) - { - switch(note.outputs[i].size()) - { - case 2: - case 3: - case 4: - case 7: - count++; - break; - default: - break; - } - } - } - - cout << count << endl; - - return 0; -} +#include +#include +#include +#include + +using namespace std; + +struct Note +{ + string patterns[10]; + string outputs[4]; + + friend istream &operator>>( istream &input, Note &n ) { + for(int i = 0; i < 10; i++) + { + input >> n.patterns[i]; + } + for(int i = 0; i < 4; i++) + { + input >> n.outputs[i]; + } + return input; + } +}; + +int main() +{ + Note note; + int count = 0; + while (cin >> note) + { + for(int i = 0; i < 4; i++) + { + switch(note.outputs[i].size()) + { + case 2: + case 3: + case 4: + case 7: + count++; + break; + default: + break; + } + } + } + + cout << count << endl; + + return 0; +} diff --git a/Day 8/Marcus/cpp/part2.cpp b/Day 8/Marcus/cpp/part2.cpp index b2b467b..c1e90b9 100644 --- a/Day 8/Marcus/cpp/part2.cpp +++ b/Day 8/Marcus/cpp/part2.cpp @@ -1,236 +1,236 @@ -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -struct compare_length { - inline bool operator()(const std::string& first, - const std::string& second) const - { - return first.size() < second.size(); - } -}; - -struct Note -{ - array patterns; - array outputs; - - friend istream &operator>>( istream &input, Note &n ) { - for(int i = 0; i < 10; i++) - { - input >> n.patterns[i]; - sort(n.patterns[i].begin(), n.patterns[i].end()); - } - compare_length c; - sort(n.patterns.begin(), n.patterns.end(), c); - sort(n.patterns.begin()+3,n.patterns.begin()+6); - sort(n.patterns.begin()+6,n.patterns.begin()+9); - for(int i = 0; i < 4; i++) - { - input >> n.outputs[i]; - sort(n.outputs[i].begin(), n.outputs[i].end()); - } - return input; - } -}; - -int main() -{ - Note note; - int result = 0; - for(int total_count = 0; total_count < 200; total_count++) - { - cin >> note; - int pattern_map[10] = {1,7,4,9,9,9,9,9,9,8}; - vector> pattern_sets(note.patterns.size()); - for(int i = 0; i < note.patterns.size(); i++) - { - set cur_set; - for(int j = 0; j < note.patterns[i].size(); j++) - { - cur_set.insert(note.patterns[i][j]); - } - pattern_sets[i] = cur_set; - } - - set top = pattern_sets[1]; - for(set::iterator it = pattern_sets[0].begin(); it != pattern_sets[0].end(); ++it) top.erase(*it); - - set middle = pattern_sets[2]; - for(set::iterator it = pattern_sets[0].begin(); it != pattern_sets[0].end(); ++it) middle.erase(*it); - set left_top = middle; - for(set::iterator it = middle.begin(); it != middle.end(); ++it) - { - while (middle.end() != it && (pattern_sets[3].end() == pattern_sets[3].find(*it) || - pattern_sets[4].end() == pattern_sets[4].find(*it) || - pattern_sets[5].end() == pattern_sets[5].find(*it))) - { - it = middle.erase(it); - } - } - left_top.erase(*middle.begin()); - - set bottom = pattern_sets[9]; - for(set::iterator it = pattern_sets[1].begin(); it != pattern_sets[1].end(); ++it) bottom.erase(*it); - for(set::iterator it = pattern_sets[2].begin(); it != pattern_sets[2].end(); ++it) bottom.erase(*it); - - set left_bottom = bottom; - - for(set::iterator it = bottom.begin(); it != bottom.end(); ++it) - { - while (bottom.end() != it && (pattern_sets[3].end() == pattern_sets[3].find(*it) || - pattern_sets[4].end() == pattern_sets[4].find(*it) || - pattern_sets[5].end() == pattern_sets[5].find(*it))) - { - it = bottom.erase(it); - } - } - - left_bottom.erase(*bottom.begin()); - - set x; - for(int i = 6; i <= 8; i++) - { - if (pattern_sets[i].find(*middle.begin()) != pattern_sets[i].end() && - pattern_sets[i].find(*left_bottom.begin()) != pattern_sets[i].end()) - { - x = pattern_sets[i]; - break; - } - } - - set right_top = pattern_sets[0]; - for(set::iterator it = x.begin(); it != x.end(); ++it) - right_top.erase(*it); - - set right_bottom = pattern_sets[0]; - right_bottom.erase(*right_top.begin()); - - string zero = ""; - zero.append(1,*top.begin()); - zero.append(1,*left_top.begin()); - zero.append(1,*right_top.begin()); - zero.append(1,*left_bottom.begin()); - zero.append(1,*right_bottom.begin()); - zero.append(1,*bottom.begin()); - - sort(zero.begin(),zero.end()); - - for(int i = 6; i <= 8; i++) - { - if (zero.compare(note.patterns[i]) == 0) - { - pattern_map[i] = 0; - } - } - - string two = ""; - two.append(1,*top.begin()); - two.append(1,*right_top.begin()); - two.append(1,*middle.begin()); - two.append(1,*left_bottom.begin()); - two.append(1,*bottom.begin()); - - sort(two.begin(), two.end()); - - for(int i = 3; i <= 5; i++) - { - if (two.compare(note.patterns[i]) == 0) - { - pattern_map[i] = 2; - } - } - - string three = ""; - three.append(1,*top.begin()); - three.append(1,*right_top.begin()); - three.append(1,*middle.begin()); - three.append(1,*right_bottom.begin()); - three.append(1,*bottom.begin()); - - sort(three.begin(), three.end()); - - for(int i = 3; i <= 5; i++) - { - if (three.compare(note.patterns[i]) == 0) - { - pattern_map[i] = 3; - } - } - - string five = ""; - five.append(1,*top.begin()); - five.append(1,*left_top.begin()); - five.append(1,*middle.begin()); - five.append(1,*right_bottom.begin()); - five.append(1,*bottom.begin()); - - sort(five.begin(), five.end()); - - for(int i = 3; i <= 5; i++) - { - if (five.compare(note.patterns[i]) == 0) - { - pattern_map[i] = 5; - } - } - - string six = ""; - six.append(1,*top.begin()); - six.append(1,*left_top.begin()); - six.append(1,*middle.begin()); - six.append(1,*right_bottom.begin()); - six.append(1,*left_bottom.begin()); - six.append(1,*bottom.begin()); - - sort(six.begin(), six.end()); - - for(int i = 6; i <= 8; i++) - { - if (six.compare(note.patterns[i]) == 0) - { - pattern_map[i] = 6; - } - } - - for(int i = 0; i < 10; i++) - { - bool found = false; - for(int j = 0; j < 10; j++) - { - if (pattern_map[j] == i) - { - found = true; - break; - } - } - if (!found) - { - cout << total_count << endl; - } - } - - for(int i = 0, m = 1000; i < 4; i++, m/=10) - { - for(int j = 0; j < 10; j++) - { - if (0 == note.outputs[i].compare(note.patterns[j])) - { - result += m*pattern_map[j]; - break; - } - } - } - } - - cout << result << endl; - - return 0; -} - +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +struct compare_length { + inline bool operator()(const std::string& first, + const std::string& second) const + { + return first.size() < second.size(); + } +}; + +struct Note +{ + array patterns; + array outputs; + + friend istream &operator>>( istream &input, Note &n ) { + for(int i = 0; i < 10; i++) + { + input >> n.patterns[i]; + sort(n.patterns[i].begin(), n.patterns[i].end()); + } + compare_length c; + sort(n.patterns.begin(), n.patterns.end(), c); + sort(n.patterns.begin()+3,n.patterns.begin()+6); + sort(n.patterns.begin()+6,n.patterns.begin()+9); + for(int i = 0; i < 4; i++) + { + input >> n.outputs[i]; + sort(n.outputs[i].begin(), n.outputs[i].end()); + } + return input; + } +}; + +int main() +{ + Note note; + int result = 0; + for(int total_count = 0; total_count < 200; total_count++) + { + cin >> note; + int pattern_map[10] = {1,7,4,9,9,9,9,9,9,8}; + vector> pattern_sets(note.patterns.size()); + for(int i = 0; i < note.patterns.size(); i++) + { + set cur_set; + for(int j = 0; j < note.patterns[i].size(); j++) + { + cur_set.insert(note.patterns[i][j]); + } + pattern_sets[i] = cur_set; + } + + set top = pattern_sets[1]; + for(set::iterator it = pattern_sets[0].begin(); it != pattern_sets[0].end(); ++it) top.erase(*it); + + set middle = pattern_sets[2]; + for(set::iterator it = pattern_sets[0].begin(); it != pattern_sets[0].end(); ++it) middle.erase(*it); + set left_top = middle; + for(set::iterator it = middle.begin(); it != middle.end(); ++it) + { + while (middle.end() != it && (pattern_sets[3].end() == pattern_sets[3].find(*it) || + pattern_sets[4].end() == pattern_sets[4].find(*it) || + pattern_sets[5].end() == pattern_sets[5].find(*it))) + { + it = middle.erase(it); + } + } + left_top.erase(*middle.begin()); + + set bottom = pattern_sets[9]; + for(set::iterator it = pattern_sets[1].begin(); it != pattern_sets[1].end(); ++it) bottom.erase(*it); + for(set::iterator it = pattern_sets[2].begin(); it != pattern_sets[2].end(); ++it) bottom.erase(*it); + + set left_bottom = bottom; + + for(set::iterator it = bottom.begin(); it != bottom.end(); ++it) + { + while (bottom.end() != it && (pattern_sets[3].end() == pattern_sets[3].find(*it) || + pattern_sets[4].end() == pattern_sets[4].find(*it) || + pattern_sets[5].end() == pattern_sets[5].find(*it))) + { + it = bottom.erase(it); + } + } + + left_bottom.erase(*bottom.begin()); + + set x; + for(int i = 6; i <= 8; i++) + { + if (pattern_sets[i].find(*middle.begin()) != pattern_sets[i].end() && + pattern_sets[i].find(*left_bottom.begin()) != pattern_sets[i].end()) + { + x = pattern_sets[i]; + break; + } + } + + set right_top = pattern_sets[0]; + for(set::iterator it = x.begin(); it != x.end(); ++it) + right_top.erase(*it); + + set right_bottom = pattern_sets[0]; + right_bottom.erase(*right_top.begin()); + + string zero = ""; + zero.append(1,*top.begin()); + zero.append(1,*left_top.begin()); + zero.append(1,*right_top.begin()); + zero.append(1,*left_bottom.begin()); + zero.append(1,*right_bottom.begin()); + zero.append(1,*bottom.begin()); + + sort(zero.begin(),zero.end()); + + for(int i = 6; i <= 8; i++) + { + if (zero.compare(note.patterns[i]) == 0) + { + pattern_map[i] = 0; + } + } + + string two = ""; + two.append(1,*top.begin()); + two.append(1,*right_top.begin()); + two.append(1,*middle.begin()); + two.append(1,*left_bottom.begin()); + two.append(1,*bottom.begin()); + + sort(two.begin(), two.end()); + + for(int i = 3; i <= 5; i++) + { + if (two.compare(note.patterns[i]) == 0) + { + pattern_map[i] = 2; + } + } + + string three = ""; + three.append(1,*top.begin()); + three.append(1,*right_top.begin()); + three.append(1,*middle.begin()); + three.append(1,*right_bottom.begin()); + three.append(1,*bottom.begin()); + + sort(three.begin(), three.end()); + + for(int i = 3; i <= 5; i++) + { + if (three.compare(note.patterns[i]) == 0) + { + pattern_map[i] = 3; + } + } + + string five = ""; + five.append(1,*top.begin()); + five.append(1,*left_top.begin()); + five.append(1,*middle.begin()); + five.append(1,*right_bottom.begin()); + five.append(1,*bottom.begin()); + + sort(five.begin(), five.end()); + + for(int i = 3; i <= 5; i++) + { + if (five.compare(note.patterns[i]) == 0) + { + pattern_map[i] = 5; + } + } + + string six = ""; + six.append(1,*top.begin()); + six.append(1,*left_top.begin()); + six.append(1,*middle.begin()); + six.append(1,*right_bottom.begin()); + six.append(1,*left_bottom.begin()); + six.append(1,*bottom.begin()); + + sort(six.begin(), six.end()); + + for(int i = 6; i <= 8; i++) + { + if (six.compare(note.patterns[i]) == 0) + { + pattern_map[i] = 6; + } + } + + for(int i = 0; i < 10; i++) + { + bool found = false; + for(int j = 0; j < 10; j++) + { + if (pattern_map[j] == i) + { + found = true; + break; + } + } + if (!found) + { + cout << total_count << endl; + } + } + + for(int i = 0, m = 1000; i < 4; i++, m/=10) + { + for(int j = 0; j < 10; j++) + { + if (0 == note.outputs[i].compare(note.patterns[j])) + { + result += m*pattern_map[j]; + break; + } + } + } + } + + cout << result << endl; + + return 0; +} + diff --git a/Day 9/Marcus/cpp/part1.cpp b/Day 9/Marcus/cpp/part1.cpp new file mode 100644 index 0000000..9059718 --- /dev/null +++ b/Day 9/Marcus/cpp/part1.cpp @@ -0,0 +1,45 @@ +#include + +using namespace std; + +int main(int argc, char* argv[]) +{ + int height_map[100*100]; + + for(int i = 0; i < 100; i++) + { + string in; + cin >> in; + for(int j = 0; j < 100; j++) + { + height_map[j+i*100] = (int)in[j]-(int)'0'; + } + } + + int result = 0; + for(int i = 0; i < 100*100; i++) + { + if (i-100 >= 0 && height_map[i-100] <= height_map[i]) + { + continue; + } + if (i+100 < 100*100 && height_map[i+100] <= height_map[i]) + { + continue; + } + if (i-1 >= 0 && height_map[i-1] <= height_map[i]) + { + continue; + } + if (i+1 < 100*100 && height_map[i+1] <= height_map[i]) + { + continue; + } + + result += height_map[i]+1; + } + + cout << result << endl; + + return 0; +} \ No newline at end of file diff --git a/Day 9/Marcus/cpp/part2.cpp b/Day 9/Marcus/cpp/part2.cpp new file mode 100644 index 0000000..e99aac0 --- /dev/null +++ b/Day 9/Marcus/cpp/part2.cpp @@ -0,0 +1,82 @@ +#include +#include +#include +#include +#include +#include + +using namespace std; + +int main(int argc, char* argv[]) +{ + int height_map[100*100]; + + for(int i = 0; i < 100; i++) + { + string in; + cin >> in; + for(int j = 0; j < 100; j++) + { + height_map[j+i*100] = (int)in[j]-(int)'0'; + } + } + + vector basins(3, 0); + for(int i = 0; i < 100*100; i++) + { + if (i-100 >= 0 && height_map[i-100] <= height_map[i]) + { + continue; + } + if (i+100 < 100*100 && height_map[i+100] <= height_map[i]) + { + continue; + } + if (i-1 >= 0 && height_map[i-1] <= height_map[i]) + { + continue; + } + if (i+1 < 100*100 && height_map[i+1] <= height_map[i]) + { + continue; + } + + queue> to_explore; + to_explore.push(pair(i-100,i)); + to_explore.push(pair(i+100,i)); + to_explore.push(pair(i-1,i)); + to_explore.push(pair(i+1,i)); + set basin; + basin.insert(i); + while(!to_explore.empty()) + { + pair cur = to_explore.front(); + to_explore.pop(); + + if (cur.first < 0 || cur.first >= 100*100) + { + continue; + } + + if (height_map[cur.first] != 9 && height_map[cur.first] > height_map[cur.second]) + { + pair::iterator,bool> res = basin.insert(cur.first); + if (res.second) + { + to_explore.push(pair(cur.first-100,cur.first)); + to_explore.push(pair(cur.first+100,cur.first)); + to_explore.push(pair(cur.first-1,cur.first)); + to_explore.push(pair(cur.first+1,cur.first)); + } + } + } + + basins.push_back(basin.size()); + sort(basins.begin(), basins.end()); + basins.erase(basins.begin()); + } + + cout << basins[0]*basins[1]*basins[2] << endl; + + return 0; +} \ No newline at end of file