diff --git a/Day 3/main.cpp b/Day 3/main.cpp index a06da18..a4f573a 100644 --- a/Day 3/main.cpp +++ b/Day 3/main.cpp @@ -24,19 +24,27 @@ void wait(int pauseMs=0){ #pragma endregion const int DAY = 3; -Run runInput=FILE1; +Run runInput=FILE2; struct numb{ vi2d pos; + vi2d endPos; int number; + bool operator<(numb&rhs){ + return numberparts; std::vector>board; +std::vectorgears; void doStuff2(){ while(true){ //lines is accessible as a global. - int sum=0; + long sum=0; vi2d pos={}; for(std::string&line:lines){ std::string numb=""; @@ -44,6 +52,7 @@ void doStuff2(){ std::vectorrow; vi2d initialNumberPos={}; for(int i=0;i='0'&&line[i]<='9'){ if(numb.length()==0){ initialNumberPos=pos; @@ -52,7 +61,7 @@ void doStuff2(){ }else if(numb.length()>0){ //A number has been parsed. - parts.push_back({initialNumberPos,atoi(numb.c_str())}); + parts.push_back({initialNumberPos,pos+vi2d{-1,0},atoi(numb.c_str())}); numb=""; } row.push_back(line[i]); @@ -60,41 +69,49 @@ void doStuff2(){ } if(numb.length()>0){ //A number has been parsed. - parts.push_back({initialNumberPos,atoi(numb.c_str())}); + parts.push_back({initialNumberPos,pos+vi2d{-1,0},atoi(numb.c_str())}); } board.push_back(row); pos.y++; pos.x=0; std::cout<0){ - auto validatePos=[&](vi2d checkPos){ - return startingPos.y+checkPos.y>0&&startingPos.y+checkPos.y0&&startingPos.x+checkPos.x='0'&&test<='9')){ - sum+=number.number; - std::cout<validatePos=[&](vi2d checkPos){ + if(pos.y+checkPos.y>=0&&pos.y+checkPos.y<=board.size()-1&& + pos.x+checkPos.x>=0&&pos.x+checkPos.x<=board[pos.y+checkPos.y].size()-1){ + char c=board[pos.y+checkPos.y][pos.x+checkPos.x]; + if(c>='0'&&c<='9'){ + for(numb&number:parts){ + if(number.pos.y==pos.y+checkPos.y&&number.pos.x<=pos.x+checkPos.x&&number.endPos.x>=pos.x+checkPos.x){ + return &number; + } + } + throw; //Something went terribly wrong. } - return false; - }; - vi2d checkPos={1,0}; - if(validatePos({1,0})){if(testChar(board[startingPos.y][startingPos.x+1]))break;} - if(validatePos({0,1})){if(testChar(board[startingPos.y+1][startingPos.x]))break;} - if(validatePos({-1,0})){if(testChar(board[startingPos.y][startingPos.x-1]))break;} - if(validatePos({0,-1})){if(testChar(board[startingPos.y-1][startingPos.x]))break;} - if(validatePos({1,1})){if(testChar(board[startingPos.y+1][startingPos.x+1]))break;} - if(validatePos({1,-1})){if(testChar(board[startingPos.y-1][startingPos.x+1]))break;} - if(validatePos({-1,1})){if(testChar(board[startingPos.y+1][startingPos.x-1]))break;} - if(validatePos({-1,-1})){if(testChar(board[startingPos.y-1][startingPos.x-1]))break;} - myNumb/=10; - startingPos.x++; + } + numb*test=nullptr; + return test; + }; + numb*val; + std::vectornumbers; + if((val=validatePos({1,0}))!=nullptr){numbers.push_back(*val);val=nullptr;} + if((val=validatePos({0,1}))!=nullptr){numbers.push_back(*val);val=nullptr;} + if((val=validatePos({-1,0}))!=nullptr){numbers.push_back(*val);val=nullptr;} + if((val=validatePos({0,-1}))!=nullptr){numbers.push_back(*val);val=nullptr;} + if((val=validatePos({1,1}))!=nullptr){numbers.push_back(*val);val=nullptr;} + if((val=validatePos({1,-1}))!=nullptr){numbers.push_back(*val);val=nullptr;} + if((val=validatePos({-1,1}))!=nullptr){numbers.push_back(*val);val=nullptr;} + if((val=validatePos({-1,-1}))!=nullptr){numbers.push_back(*val);val=nullptr;} + if(numbers.size()>=2){ + std::sort(numbers.begin(),numbers.end()); + auto last=std::unique(numbers.begin(),numbers.end()); + numbers.erase(last,numbers.end()); + if(numbers.size()==2){ + sum+=numbers[0].number*numbers[1].number; + std::cout<0){ numbStr=std::to_string(numb%10)+numbStr; + if(numb<10){ + DrawString(number.endPos*8,std::string(1,numbStr[numbStr.size()-1]),GREEN); + } numb/=10; } DrawString(number.pos*8,numbStr,RED); } + for(vi2d&pos:gears){ + DrawString(pos*8,std::string(1,'*'),BLUE); + } } #pragma region Hidden Engine Stuff