Advertisement
Guest User

Untitled

a guest
Dec 28th, 2017
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.42 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <filesystem>
  4. #include <map>
  5. #include <chrono>
  6. #include <algorithm>
  7.  
  8. typedef std::vector<std::vector<bool>> t_vvb;
  9. typedef std::vector<std::vector<int>> t_vvi;
  10.  
  11. bool F_Day22_Step(std::pair<int, int>& pos, std::pair<int, int>& dir, t_vvb& grid)
  12. {
  13.     if (grid[pos.first][pos.second])
  14.     {
  15.         dir = F_Rotate_Dir_90d_R(dir);
  16.     }
  17.     else
  18.     {
  19.         dir = F_Rotate_Dir_90d_L(dir);
  20.     }
  21.     grid[pos.first][pos.second] = !grid[pos.first][pos.second];
  22.     bool ret = grid[pos.first][pos.second];
  23.     pos.first += dir.first;
  24.     pos.second += dir.second;
  25.     return ret;
  26. }
  27.  
  28. 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
  29. {
  30.     if (grid[pos.first][pos.second] == 0)
  31.     {
  32.         dir = F_Rotate_Dir_90d_L(dir);
  33.     }
  34.     else if (grid[pos.first][pos.second] == 2)
  35.     {
  36.         dir = F_Rotate_Dir_90d_R(dir);
  37.     }
  38.     else if (grid[pos.first][pos.second] == 3)
  39.     {
  40.         dir = F_Rotate_Dir_90d_R(F_Rotate_Dir_90d_R(dir));
  41.     }
  42.     grid[pos.first][pos.second] = (grid[pos.first][pos.second] + 1) % 4;
  43.     bool ret = (grid[pos.first][pos.second] == 2);
  44.     pos.first += dir.first;
  45.     pos.second += dir.second;
  46.     return ret;
  47. }
  48.  
  49. template<class T>
  50. int F_Day22_Map_Init(std::vector<std::string> init, std::vector<std::vector<T>>& grid)
  51. {
  52.     for (int i = 0; i < init.size(); i++)
  53.     {
  54.         int insz = init[0].size();
  55.         for (int j = 0; j < insz; j++)
  56.         {
  57.             grid[(grid.size() - 1) / 2 - (init.size() - 1) / 2 + i][(grid[0].size() - 1) / 2 - (insz - 1) / 2 + j] = (init[i][j] == '#' ? 2 : 0);
  58.         }
  59.     }
  60.     return 1;
  61. }
  62.  
  63. int Day22(void)
  64. {
  65.     std::chrono::high_resolution_clock::time_point t1 = std::chrono::high_resolution_clock::now();
  66.  
  67.     fs::path path("../../_Input/input_Day22.txt");
  68.     fs::path testpath("../../_Input/input_Day22_test.txt");
  69.     int res_p1 = 5330;
  70.     int res_p2 = 2512103;
  71.  
  72.     int gridsize_test = 51;
  73.     int gridsize = 101;
  74.     int gridsize2 = 5001;
  75.  
  76.     t_vvb gridtest(gridsize_test, std::vector<bool>(gridsize));
  77.  
  78.     std::pair<int, int> pos = { (gridsize_test - 1) / 2, (gridsize_test - 1) / 2 };
  79.     std::pair<int, int> dir = { -1,0 };
  80.  
  81.     int bursts_test1 = 70;
  82.     int bursts_test2 = 100;
  83.     int bursts_1 = 10000;
  84.     unsigned long long bursts_2 = 10000000;
  85.  
  86.     // set up map
  87.     std::vector<std::string> init = F_Read_File_To_Array(testpath);
  88.     F_Day22_Map_Init(init, gridtest);
  89.     //F_Print_Grid(grid);
  90.     int sum = 0;
  91.  
  92.     /*for (int i = 0; i < bursts_test1; i++)
  93.     {
  94.         sum += F_Day22_Step(pos, dir, gridtest);
  95.     }*/
  96.  
  97.     //cout << "Test sum: " << sum << endl;
  98.     //F_Print_Time("Test duration: ", t1);
  99.  
  100.     init = F_Read_File_To_Array(path);
  101.     sum = 0;
  102.     t_vvb grid(gridsize, std::vector<bool>(gridsize));
  103.     pos = { (gridsize - 1) / 2, (gridsize - 1) / 2 };
  104.     dir = { -1,0 };
  105.     F_Day22_Map_Init(init, grid);
  106.  
  107.     for (int i = 0; i < bursts_1; i++)
  108.     {
  109.         sum += F_Day22_Step(pos, dir, grid);
  110.     }
  111.  
  112.     cout << "Day22-Part1: " << sum << (sum == res_p1 ? ". Correct." : ". Wrong.") << endl;
  113.     F_Print_Time("Day22-Part1 duration: ", t1);
  114.  
  115.     // PART 2
  116.     sum = 0;
  117.     t_vvi grid2(gridsize2, std::vector<int>(gridsize2));
  118.     pos = { (gridsize2 - 1) / 2, (gridsize2 - 1) / 2 };
  119.     dir = { -1,0 };
  120.     init = F_Read_File_To_Array(path);
  121.     F_Day22_Map_Init(init, grid2);
  122.  
  123.     for (unsigned long long i = 0; i < bursts_2; i++)
  124.     {
  125.         sum += F_Day22_Step(pos, dir, grid2);
  126.     }
  127.  
  128.     cout << "Day22-Part2: " << sum << (sum == res_p2 ? ". Correct." : ". Wrong.") << endl;
  129.     F_Print_Time("Day22 duration: ", t1);
  130.     return 1;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement