generated from sigonasr2/CPlusPlusProjectTemplate
parent
485489de10
commit
0b6e4fd76a
Binary file not shown.
@ -0,0 +1,93 @@ |
|||||||
|
#define OLC_PGE_APPLICATION |
||||||
|
#include "pixelGameEngine.h" |
||||||
|
#include "olcutils.h" |
||||||
|
|
||||||
|
using namespace olc; |
||||||
|
|
||||||
|
struct Sensor{ |
||||||
|
vi2d pos; |
||||||
|
int radius; |
||||||
|
}; |
||||||
|
|
||||||
|
int main() |
||||||
|
{ |
||||||
|
std::ifstream file("input"); |
||||||
|
std::vector<Sensor>sensors; |
||||||
|
while (file.good()){ |
||||||
|
std::string line; |
||||||
|
std::getline(file,line); |
||||||
|
std::cout<<line<<std::endl; |
||||||
|
int prevMarker=0; |
||||||
|
int marker=line.find(' ',prevMarker); |
||||||
|
vi2d sensorPos={-999,-999}; |
||||||
|
vi2d beaconPos={-999,-999}; |
||||||
|
if (line.length()>0){ |
||||||
|
while (prevMarker!=std::string::npos){ |
||||||
|
std::string word=line.substr(prevMarker,marker-prevMarker); |
||||||
|
prevMarker=marker; |
||||||
|
marker=line.find(' ',prevMarker+1); |
||||||
|
if (word[1]=='x'){ |
||||||
|
if (sensorPos.x==-999){ |
||||||
|
sensorPos.x=std::atoi(word.substr(word.find('=')+1,word.find(',')-word.find('=')-1).c_str()); |
||||||
|
std::cout<<"Sensor X: "<<sensorPos.x<<std::endl; |
||||||
|
} else { |
||||||
|
beaconPos.x=std::atoi(word.substr(word.find('=')+1,word.find(',')-word.find('=')-1).c_str()); |
||||||
|
std::cout<<"Beacon X: "<<beaconPos.x<<std::endl; |
||||||
|
} |
||||||
|
} else |
||||||
|
if (word[1]=='y'){ |
||||||
|
if (sensorPos.y==-999){ |
||||||
|
sensorPos.y=std::atoi(word.substr(word.find('=')+1,word.find(',')-word.find('=')-1).c_str()); |
||||||
|
std::cout<<"Sensor Y: "<<sensorPos.y<<std::endl; |
||||||
|
} else { |
||||||
|
beaconPos.y=std::atoi(word.substr(word.find('=')+1,word.find(',')-word.find('=')-1).c_str()); |
||||||
|
std::cout<<"Beacon Y: "<<beaconPos.y<<std::endl; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
sensors.push_back({sensorPos,std::abs(beaconPos.x-sensorPos.x)+std::abs(beaconPos.y-sensorPos.y)}); |
||||||
|
std::cout<<"Sensor -> Beacon Radius: "<<sensors[sensors.size()-1].radius<<std::endl; |
||||||
|
std::cout<<std::endl; |
||||||
|
} |
||||||
|
} |
||||||
|
int targetY=2000000; |
||||||
|
int sum=0; |
||||||
|
std::vector<std::pair<int,int>>ranges; |
||||||
|
for (Sensor s:sensors){ |
||||||
|
int distance=std::abs(s.pos.y-targetY); |
||||||
|
if (distance<s.radius){ |
||||||
|
//In range. |
||||||
|
std::cout<<"Sensor "<<s.pos<<" in range of Y "<<targetY<<" Radius: "<<s.radius<<std::endl; |
||||||
|
int rangeSize=s.radius*2-distance*2+1; |
||||||
|
std::cout<<"Leaves a range of "<<rangeSize<<std::endl; |
||||||
|
int minX=(s.pos.x-rangeSize/2); |
||||||
|
int maxX=(s.pos.x+rangeSize/2); |
||||||
|
std::cout<<"Range is from "<<minX<<" ~ "<<maxX<<std::endl; |
||||||
|
for (int i=0;i<ranges.size();i++){ |
||||||
|
if (ranges[i].first<=minX&&ranges[i].second>=maxX){ |
||||||
|
maxX=minX-1; |
||||||
|
break; |
||||||
|
} |
||||||
|
if (ranges[i].first>minX&&ranges[i].second<maxX){ |
||||||
|
sum-=ranges[i].second-ranges[i].first+1; |
||||||
|
std::cout<<" --> Removed Range "<<ranges[i].first<<" ~ "<<ranges[i].second<<std::endl; |
||||||
|
ranges.erase(ranges.begin()+i--); |
||||||
|
} |
||||||
|
if (ranges[i].first<=maxX&&ranges[i].second>=maxX){ |
||||||
|
maxX=ranges[i].first-1; |
||||||
|
} |
||||||
|
if (ranges[i].first<=minX&&ranges[i].second>=minX){ |
||||||
|
minX=ranges[i].second+1; |
||||||
|
} |
||||||
|
} |
||||||
|
if (maxX>=minX){ |
||||||
|
std::cout<<" --> Range is truncated to "<<minX<<" ~ "<<maxX<<std::endl; |
||||||
|
sum+=maxX-minX+1; |
||||||
|
ranges.push_back({minX,maxX}); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
std::cout<<"Sum: "<<sum-1<<std::endl; |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
Loading…
Reference in new issue