#pragma region Hidden Setup Stuff #define OLC_PGE_APPLICATION #include "olcPixelGameEngine.h" using namespace olc; enum Run{ FILE1, FILE2 }; // Override base class with your custom functionality class AoC2023 : public olc::PixelGameEngine { std::vectorlines; bool waitForRender=false; void wait(int pauseMs=0){ waitForRender=true; while(waitForRender); std::this_thread::sleep_for(std::chrono::milliseconds(pauseMs)); } #pragma endregion const int DAY = 3; 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. long sum=0; vi2d pos={}; for(std::string&line:lines){ std::string numb=""; bool isAdjacent=false; std::vectorrow; vi2d initialNumberPos={}; for(int i=0;i='0'&&line[i]<='9'){ if(numb.length()==0){ initialNumberPos=pos; } numb+=line[i]; }else if(numb.length()>0){ //A number has been parsed. parts.push_back({initialNumberPos,pos+vi2d{-1,0},atoi(numb.c_str())}); numb=""; } row.push_back(line[i]); pos.x++; } if(numb.length()>0){ //A number has been parsed. parts.push_back({initialNumberPos,pos+vi2d{-1,0},atoi(numb.c_str())}); } board.push_back(row); pos.y++; pos.x=0; std::cout<numb*{ 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 nullptr; }; 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<row; vi2d initialNumberPos={}; for(int i=0;i='0'&&line[i]<='9'){ if(numb.length()==0){ initialNumberPos=pos; } numb+=line[i]; }else if(numb.length()>0){ //A number has been parsed. parts.push_back({initialNumberPos,atoi(numb.c_str())}); numb=""; } row.push_back(line[i]); pos.x++; } if(numb.length()>0){ //A number has been parsed. parts.push_back({initialNumberPos,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<&row:board){ for(char c:row){ DrawString(pos,std::string(1,c)); pos.x+=8; } pos.y+=8; pos.x=0; } for(numb&number:parts){ std::string numbStr=""; int numb=number.number; while(numb>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 public: AoC2023() { // Name your application std::string fileName="day"+std::to_string(DAY)+"_1.txt"; if(runInput==FILE2){fileName="day"+std::to_string(DAY)+"_2.txt";} std::ifstream file(fileName); while(file.good()){ std::string line; std::getline(file,line); lines.push_back(line); } sAppName = "Advent of Code 2023 - Day "+std::to_string(DAY); } public: bool OnUserCreate() override { return true; } bool OnUserUpdate(float fElapsedTime) override { static std::thread aocSolver(&AoC2023::doStuff2,this); if(waitForRender){ draw(); waitForRender=false; } return true; } }; int main() { AoC2023 game; if (game.Construct(1280, 960, 2, 2)) game.Start(); return 0; } #pragma endregion