Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <filesystem>
- #include <map>
- #include <chrono>
- #include <algorithm>
- typedef std::vector<std::vector<bool>> t_vvb;
- typedef std::vector<std::vector<int>> t_vvi;
- bool F_Day22_Step(std::pair<int, int>& pos, std::pair<int, int>& dir, t_vvb& grid)
- {
- if (grid[pos.first][pos.second])
- {
- dir = F_Rotate_Dir_90d_R(dir);
- }
- else
- {
- dir = F_Rotate_Dir_90d_L(dir);
- }
- grid[pos.first][pos.second] = !grid[pos.first][pos.second];
- bool ret = grid[pos.first][pos.second];
- pos.first += dir.first;
- pos.second += dir.second;
- return ret;
- }
- bool F_Day22_Step(std::pair<int, int>& pos, std::pair<int, int>& dir, t_vvi& grid) // 0 == clean, 1 == weakened, 2 == infected, 3 == flagged
- {
- if (grid[pos.first][pos.second] == 0)
- {
- dir = F_Rotate_Dir_90d_L(dir);
- }
- else if (grid[pos.first][pos.second] == 2)
- {
- dir = F_Rotate_Dir_90d_R(dir);
- }
- else if (grid[pos.first][pos.second] == 3)
- {
- dir = F_Rotate_Dir_90d_R(F_Rotate_Dir_90d_R(dir));
- }
- grid[pos.first][pos.second] = (grid[pos.first][pos.second] + 1) % 4;
- bool ret = (grid[pos.first][pos.second] == 2);
- pos.first += dir.first;
- pos.second += dir.second;
- return ret;
- }
- template<class T>
- int F_Day22_Map_Init(std::vector<std::string> init, std::vector<std::vector<T>>& grid)
- {
- for (int i = 0; i < init.size(); i++)
- {
- int insz = init[0].size();
- for (int j = 0; j < insz; j++)
- {
- grid[(grid.size() - 1) / 2 - (init.size() - 1) / 2 + i][(grid[0].size() - 1) / 2 - (insz - 1) / 2 + j] = (init[i][j] == '#' ? 2 : 0);
- }
- }
- return 1;
- }
- int Day22(void)
- {
- std::chrono::high_resolution_clock::time_point t1 = std::chrono::high_resolution_clock::now();
- fs::path path("../../_Input/input_Day22.txt");
- fs::path testpath("../../_Input/input_Day22_test.txt");
- int res_p1 = 5330;
- int res_p2 = 2512103;
- int gridsize_test = 51;
- int gridsize = 101;
- int gridsize2 = 5001;
- t_vvb gridtest(gridsize_test, std::vector<bool>(gridsize));
- std::pair<int, int> pos = { (gridsize_test - 1) / 2, (gridsize_test - 1) / 2 };
- std::pair<int, int> dir = { -1,0 };
- int bursts_test1 = 70;
- int bursts_test2 = 100;
- int bursts_1 = 10000;
- unsigned long long bursts_2 = 10000000;
- // set up map
- std::vector<std::string> init = F_Read_File_To_Array(testpath);
- F_Day22_Map_Init(init, gridtest);
- //F_Print_Grid(grid);
- int sum = 0;
- /*for (int i = 0; i < bursts_test1; i++)
- {
- sum += F_Day22_Step(pos, dir, gridtest);
- }*/
- //cout << "Test sum: " << sum << endl;
- //F_Print_Time("Test duration: ", t1);
- init = F_Read_File_To_Array(path);
- sum = 0;
- t_vvb grid(gridsize, std::vector<bool>(gridsize));
- pos = { (gridsize - 1) / 2, (gridsize - 1) / 2 };
- dir = { -1,0 };
- F_Day22_Map_Init(init, grid);
- for (int i = 0; i < bursts_1; i++)
- {
- sum += F_Day22_Step(pos, dir, grid);
- }
- cout << "Day22-Part1: " << sum << (sum == res_p1 ? ". Correct." : ". Wrong.") << endl;
- F_Print_Time("Day22-Part1 duration: ", t1);
- // PART 2
- sum = 0;
- t_vvi grid2(gridsize2, std::vector<int>(gridsize2));
- pos = { (gridsize2 - 1) / 2, (gridsize2 - 1) / 2 };
- dir = { -1,0 };
- init = F_Read_File_To_Array(path);
- F_Day22_Map_Init(init, grid2);
- for (unsigned long long i = 0; i < bursts_2; i++)
- {
- sum += F_Day22_Step(pos, dir, grid2);
- }
- cout << "Day22-Part2: " << sum << (sum == res_p2 ? ". Correct." : ". Wrong.") << endl;
- F_Print_Time("Day22 duration: ", t1);
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement