15
This commit is contained in:
parent
940fe28e5f
commit
c21ff6800f
22
15/CMakeLists.txt
Normal file
22
15/CMakeLists.txt
Normal file
@ -0,0 +1,22 @@
|
||||
cmake_minimum_required(VERSION 3.10)
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED True)
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
enable_language(CXX)
|
||||
|
||||
project(AoC15)
|
||||
|
||||
if(APPLE)
|
||||
include_directories(/usr/local/include)
|
||||
link_directories(/usr/local/lib)
|
||||
endif()
|
||||
|
||||
if(WIN32)
|
||||
add_executable(${CMAKE_PROJECT_NAME} WIN32)
|
||||
else()
|
||||
add_executable(${CMAKE_PROJECT_NAME})
|
||||
endif()
|
||||
|
||||
target_sources(${CMAKE_PROJECT_NAME}
|
||||
PRIVATE main.cpp
|
||||
)
|
100
15/input
Normal file
100
15/input
Normal file
@ -0,0 +1,100 @@
|
||||
8278572114793756191833561127452853426929615899116958969481427593944191389121411192127899512211639555
|
||||
2495171585122426519281919685613271991924121543192937558138395964783255375528718245475125436917188379
|
||||
7961821999883965642974131223415952226122149135757469151378271261942142914126999286296912626324385126
|
||||
6441179418166119485338911954311735412134219517651998824469721124695113922376591228278111534398748579
|
||||
8424516666869191815919915114592841194492325941357613456911196292486835511835219129622871119578589971
|
||||
4934282611638317524366865197791637785138383929285174289723984228151951111983211626913556611911829937
|
||||
1151621499331229211126371681389432146113111191182949449598792179919361176214191999459113112713976728
|
||||
3543168652917496122811711414994886233243178481181718739884152128165181497816913243592225189281913243
|
||||
8119874956918529299886117198419866996469979678721168111546811425162192142928429419213182343144695232
|
||||
3715358458184981829314869115929193353913729251938123314814899961596542283596814884718213256699682795
|
||||
1457749119784391733139584826119658874912622938352136991922153247283117211453981321869218151772119241
|
||||
7179176958892653731299198523131231844957919593248775178121191579258731497841241367137171199591213113
|
||||
4471161421339111933369587973937292894188371915184619223639743975336137681191429298916799146143115252
|
||||
1931215141473344532681163495387852753769911119111496117891655513181516411521451328225794431126335749
|
||||
9151689756849234387443425922933377332991858479147517224818914914425732127251965496121942295591183172
|
||||
2566113547914162641599298843229739383828642848144944852282893912779288715932788642899891297329297335
|
||||
9922876696896994217561793182369411198699179871259954463871913115184734221799911711326923219223276139
|
||||
2411339863315612919718312194943949341228281651784525919132828782375965326712781781442989945125592185
|
||||
1418841118819719419136342692253322911243214985154999627192389816921612619549481134921215629682111939
|
||||
2991112471164498237119512836126148891288395561377883392312743919942937825816841441118322241659389277
|
||||
2369155536658248242446196714214179784918844181199991939119268159197418739116392138931189992188846971
|
||||
3139737615566929828592321519611921732953991396521141165811881293391199737587536111331331196419156798
|
||||
2473192981948227987111687486532119994897341114574629339124219164536824734799478832613111816588191148
|
||||
4311152779495176926527172116979937356891171332243361912427574933999759591533258454228319797436295139
|
||||
4296794597642297911762612592247759519869443198118291875988399937961162212147523611425284112262745711
|
||||
2919426121311135263324939726832931137973611199921321523791621141513222863567654962618137111392894422
|
||||
4634915181699181572153395211661987562131211481129117478131424114241178921227517288679722328986823922
|
||||
6297719121113669981592326191394834414485988819761166812197429119921315747318111218181992586126993919
|
||||
3318614241139113159116719411236593772715946293531825213649325427717633162144974482959899826716597521
|
||||
2383419157242919637211129811118515633215692397315115195991989124876193315459918971973489494911283217
|
||||
9521529194981517981232979669792487442129597979226311938488195924436928541121214639119337935199991117
|
||||
2192189971299175771117868563478533237938994962133199366951122734186711527399931794763686991514814662
|
||||
7881913138114955461135924149222738381179396843291244767312291267247642317671911986256995961422161959
|
||||
3843362141443222644212379314232847247972118224544224919819451911833619826719779527571929718196858145
|
||||
8385162537318633361137193897832962297676464912264123117394391829196261318841959998837814919924922953
|
||||
8221212119334729141984389191114483517898927112545166192711293823912553322553197819157776647516939141
|
||||
3255619572231874771181619628278542957284278985715127319521445711213483781683791875823115112171161593
|
||||
5128122983945275882694953934111585511282939925866973662677121821923965945796285431719542616138158188
|
||||
1114714187852179791925944829277928365391625896371297229279856697273911118484711381511757931867215649
|
||||
2136995112393969411115117811392578597296824186351393148827913317214177929268227343313353893923511632
|
||||
4425479887766493391898627186142951193972698451215519114983911227179622146954172418992341826112167866
|
||||
5111387196811253395631314459132217416234828743931596134128141969141158686811353152121616931964797891
|
||||
1281981853884141491129192211466222912384397781318376518318151569516738296599922374687193924811575151
|
||||
4214168945722211551589814173167426111979895615335479353741989719899321828311892898131998119379778971
|
||||
1698126514489399112929175994131914431611342772121934925432344544423913839915832992371361426254688971
|
||||
2611741223511697957256712677157994471229119912479116238329218159118319417112711251115741432298991675
|
||||
1986199322419269948123997119141417276181122386587573999448625998979137444139118661231916299216237816
|
||||
1192692299325547983953157273594191687111773574111831139919179117182211537317191492612996482125719135
|
||||
2618137369191556773571949529451551811187939855121392262981116194316131959155491562182411351259963197
|
||||
8291227832771244631183289512115145431921179351599239991889721749519277227819196284578312711114771933
|
||||
8981962179738463579242192181563523744938932338629418123118165383629833214199619655973411258287294111
|
||||
8619915743617939513929219214969281929991561391431128913883571199794329274227297771481964191959319854
|
||||
9661921896148816274329413191213247721642973365721833219284864558144513363393813619978321483549692113
|
||||
1221822379347999136211136218671719191161287539743533389111571921729981996951171917511894919222458338
|
||||
9179814439128882333169175926635746971123349598164185736129161426323644543783696391977888446282158193
|
||||
8919941115162197814112689589249939913122148387958484396667721419199788161191494147954329319451368227
|
||||
1283383939189511883998654629172448151128762184636314937172618589313123848776939135383681811654471522
|
||||
4715619189119739192634991921998844714396939583519299492337911136398474149811151145461933134874142828
|
||||
1117481573895941939424518349392997473449671461935946881181312652591682539197685834621162263218683198
|
||||
9394562899911652727388398568123241827141738357143277722124594366392682466191119988911992663238764771
|
||||
2585966996818144122959341112693718175511912678919195958899282312779823311945811917412189169191914619
|
||||
1848495443417266121112634424271555676396443373324838214497832614396187418192188918146284171173421749
|
||||
6219895897831829379714113972317818929697612535358251896324917772691898279896669612539591147152489338
|
||||
6115612912112113324242167994435148645911867787136267211781213917111546157212149287331129992317887151
|
||||
6118169128927892484311512131621967642919324341529263891337911411129492162612776899121931248882139644
|
||||
6884838296782692281158822326814131725184916187194546991912899824434812718735631819653791998193841264
|
||||
3485227759142991956221813281664289335731621123188291134995562639531863888211751951122552236997334852
|
||||
4845141111241192161537876516198782167269132581522211179712915387257181133491267199451122265499922659
|
||||
2477848488634968257491171291519224412581996417371411931394372219338545611181523931293424196381115936
|
||||
8911319712238921239948883419991938254319821221163746121194349641739831829966821897752722981537562291
|
||||
8292478573168677999812391286993666192914511399319138945554999392894819423181966166488181891969131749
|
||||
3264173311179517375193219491832914392218389931492941426132248467586919997529138838826141892437977563
|
||||
8319936993882457327125991956278814829118421321922375769776436683211313756211534968729618521882226127
|
||||
8638599994131461557113578449423472638334111745934214239234929925229712127897989732923483271191411596
|
||||
1523419968194149815212174333853151919128599116116518413315158689181119643842371922352598214112729111
|
||||
1224189161195993439421611631912867163999222335519879636723284419496865292871251261634369981276431216
|
||||
7917832715864343179944317954494748181747449119129421199134193985168143693142131121189224214116129789
|
||||
1995274614784214559849841188151381892312137231555881234712143592531781694159197143298119349576313288
|
||||
6872676869621987263257677493158696216232141889137144892149212252643429691459127525396618722228211355
|
||||
9529131312198127195146611139957169375945817199886385734424125668955254391749172287495221433939346271
|
||||
1317597221324639268821956316831718923818731193924341148895319223528139911981118618392281299815415484
|
||||
6311491136929625422264122934959537441311729119921619133219127391911591173775188988221145475286479247
|
||||
2214669476122959718451929746211392861541917917111355149672919182998486751591424875262899741911991966
|
||||
5487717296119894141568198141794929233554118134815419581752348188169498421912911863811199812577419228
|
||||
3287347189899116764139996172211718221461156348196278882293319458126326275182618429176619478622567138
|
||||
1217339827453222194178294713351137215119153323897976211844191311588753942221192915127591664618634566
|
||||
8391229721621914838897761141891492975212126113876523932971411182631292177219192741129962223763588181
|
||||
9281395981783715414967594956432849942278193925471491289523616222495169785232911414516328962999974978
|
||||
7536568137284691778271641238229711141621826181987912357983119929869911582296219171189725615212124465
|
||||
9595583261896818139583613922162716243317157921593921818213913993135811139511646138183273731177299744
|
||||
1478335243376975293521995994234166518112945289282915476547398231571885929451238161265918286396527143
|
||||
3589659231838871758533921821826411128778214875195493613897887818994186862452911921219752434728159178
|
||||
1519822318615118939492581148919717226195114292383874899669291852333991742198362725995259791943333211
|
||||
9795914596639922726274191923229243293291863125939211616969521549341942544782482711218467872852318217
|
||||
5613289519141121739839293878959282231316192133211496939347144791959915179746671957919621313595284142
|
||||
9181131731288744182367198138971923921179618862219412318217797142481389325923525313271629938185882472
|
||||
5551511368118741121367417369949814314261396112791258129753271621312272649275289184568199481948313935
|
||||
2241379916113999611116384261153791251196441711978721719853121261161249511335295434239192122475341439
|
||||
2953391923245469371889427113838314197862363197769418641714149439123119271299765999981554921212242232
|
||||
2429196117668731239983129261421913394811262338222177425225587612716828952193511255156792968133924511
|
156
15/main.cpp
Normal file
156
15/main.cpp
Normal file
@ -0,0 +1,156 @@
|
||||
#include <algorithm>
|
||||
#include <deque>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <unordered_map>
|
||||
#include <unordered_set>
|
||||
#include <vector>
|
||||
|
||||
using Point = std::pair<uint64_t, uint64_t>;
|
||||
|
||||
class Position {
|
||||
public:
|
||||
Position(uint64_t value) : _value(value) {}
|
||||
bool updateDist(uint64_t from_dist) {
|
||||
auto new_dist = from_dist + _value;
|
||||
if (new_dist < _dist) {
|
||||
_dist = new_dist;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
uint64_t getDist() {
|
||||
return _dist;
|
||||
}
|
||||
|
||||
void setDist(uint64_t dist) {
|
||||
_dist = dist;
|
||||
}
|
||||
|
||||
uint64_t getValue() {
|
||||
return _value;
|
||||
}
|
||||
|
||||
private:
|
||||
uint64_t _dist = -1;
|
||||
uint64_t _value = 0;
|
||||
};
|
||||
|
||||
std::vector<std::vector<Position>> getMap(const std::string &file_name,
|
||||
bool growing = false) {
|
||||
std::vector<std::vector<Position>> map;
|
||||
|
||||
std::ifstream file(file_name);
|
||||
std::string str;
|
||||
while (std::getline(file, str)) {
|
||||
map.emplace_back();
|
||||
for (auto &c : str) {
|
||||
map.back().emplace_back(c - '0');
|
||||
}
|
||||
}
|
||||
map[0][0].setDist(0);
|
||||
auto original_height = map.size();
|
||||
auto original_width = map[0].size();
|
||||
if (growing) {
|
||||
for (auto &line : map) {
|
||||
for (int i = 1; i < 5; i++) {
|
||||
for (size_t j = 0; j < original_width; j++) {
|
||||
auto new_val = line[j].getValue() + i;
|
||||
if (new_val > 9) {
|
||||
new_val -= 9;
|
||||
}
|
||||
line.emplace_back(new_val);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int i = 1; i < 5; i++) {
|
||||
for (size_t j = 0; j < original_height; j++) {
|
||||
map.emplace_back();
|
||||
for (auto &position : map[j]) {
|
||||
auto new_val = position.getValue() + i;
|
||||
if (new_val > 9) {
|
||||
new_val -= 9;
|
||||
}
|
||||
map.back().emplace_back(new_val);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
std::vector<Point> getPointsNoDiag(const Point &point, size_t max_x,
|
||||
size_t max_y) {
|
||||
std::vector<Point> result{};
|
||||
if (point.first > 0) {
|
||||
result.emplace_back(point.first - 1, point.second);
|
||||
}
|
||||
if (point.first < max_x) {
|
||||
result.emplace_back(point.first + 1, point.second);
|
||||
}
|
||||
if (point.second > 0) {
|
||||
result.emplace_back(point.first, point.second - 1);
|
||||
}
|
||||
if (point.second < max_y) {
|
||||
result.emplace_back(point.first, point.second + 1);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
Position &pointToMap(std::vector<std::vector<Position>> &map,
|
||||
const Point &point) {
|
||||
return map[point.second][point.first];
|
||||
}
|
||||
|
||||
uint64_t findSafestPath(std::vector<std::vector<Position>> &map) {
|
||||
std::deque<Point> to_process = { { 0, 0 } };
|
||||
while (!to_process.empty()) {
|
||||
auto point = to_process.front();
|
||||
auto &map_entry = pointToMap(map, point);
|
||||
auto new_points =
|
||||
getPointsNoDiag(point, map[0].size() - 1, map.size() - 1);
|
||||
for (auto &new_point : new_points) {
|
||||
auto &new_map = pointToMap(map, new_point);
|
||||
if (new_map.updateDist(map_entry.getDist())) {
|
||||
to_process.push_back(new_point);
|
||||
}
|
||||
}
|
||||
to_process.pop_front();
|
||||
}
|
||||
return map.back().back().getDist();
|
||||
}
|
||||
|
||||
uint64_t part1(const std::string &map_path) {
|
||||
auto map = getMap(map_path);
|
||||
return findSafestPath(map);
|
||||
}
|
||||
|
||||
uint64_t part2(const std::string &map_path) {
|
||||
auto map = getMap(map_path, true);
|
||||
return findSafestPath(map);
|
||||
}
|
||||
|
||||
void printMap(std::vector<std::vector<Position>> &map) {
|
||||
for (auto &line : map) {
|
||||
for (auto &pos : line) {
|
||||
std::cout << pos.getValue();
|
||||
}
|
||||
std::cout << std::endl;
|
||||
}
|
||||
std::cout << std::endl;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
if (argc < 2) {
|
||||
std::cerr << "You must provide input file!" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
std::cout << "The least risky path has a risk of \033[91;1m"
|
||||
<< part1(argv[1]) << "\033[0m." << std::endl;
|
||||
std::cout
|
||||
<< "The least risky path in the entire cove has a risk of \033[91;1m"
|
||||
<< part2(argv[1]) << "\033[0m." << std::endl;
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user