From 054ba64509c913001105a90aac62bb63ac880175 Mon Sep 17 00:00:00 2001 From: zv0n Date: Tue, 7 Dec 2021 13:59:48 +0100 Subject: [PATCH] 07 --- 07/CMakeLists.txt | 22 +++++++++++++ 07/input | 1 + 07/main.cpp | 80 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 07/CMakeLists.txt create mode 100644 07/input create mode 100644 07/main.cpp diff --git a/07/CMakeLists.txt b/07/CMakeLists.txt new file mode 100644 index 0000000..722f0fc --- /dev/null +++ b/07/CMakeLists.txt @@ -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(AoC07) + +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 + ) diff --git a/07/input b/07/input new file mode 100644 index 0000000..89c2385 --- /dev/null +++ b/07/input @@ -0,0 +1 @@ +1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,160,1267,277,1068,422,1235,790,1391,45,252,513,1029,414,216,409,1373,1419,1176,757,64,748,835,20,436,147,347,1264,1532,240,272,430,7,85,51,12,107,1277,779,867,260,802,361,89,754,206,80,25,559,220,657,178,186,2,31,825,290,144,379,0,1682,1166,1241,180,102,464,444,122,718,25,100,1050,1358,604,546,1157,130,59,127,1351,238,97,75,821,265,23,786,116,115,93,730,1340,777,1114,263,352,115,5,69,1041,101,1222,203,1273,217,28,976,425,480,7,124,45,192,860,312,1107,1040,137,306,523,692,590,562,789,383,145,86,297,791,240,697,22,230,834,963,837,1164,1758,487,414,86,1026,1034,478,613,1,769,85,980,935,1455,16,204,170,380,324,14,699,220,50,451,738,52,437,963,718,178,508,711,1739,936,1515,246,908,126,602,295,591,22,484,752,1,1442,167,132,52,613,1172,353,36,56,468,123,393,765,1456,218,269,6,20,649,727,454,86,640,1113,836,124,405,571,882,107,75,730,346,94,35,626,1174,299,392,1449,502,854,500,128,852,248,645,159,774,155,884,1336,285,426,0,269,466,1483,93,13,17,255,295,530,694,1178,968,612,224,160,32,1154,194,494,24,845,43,274,344,301,486,43,351,581,929,168,1629,163,206,98,1242,1242,1706,1777,721,293,1621,132,199,12,66,247,1244,333,445,154,795,70,424,11,826,835,250,288,408,516,822,411,69,636,521,152,67,401,531,186,933,515,780,490,201,369,111,266,952,400,677,372,548,1325,1111,17,543,1293,20,507,74,116,656,644,872,35,80,1273,279,475,1585,1446,651,1338,285,284,23,1130,237,843,121,53,81,573,5,956,276,553,1084,544,731,35,16,53,34,405,1337,665,303,10,108,1132,233,3,834,415,161,409,1055,202,707,296,341,57,521,548,15,137,359,57,388,282,267,293,1450,28,424,819,941,1388,474,687,87,271,1462,522,33,26,841,345,104,150,573,481,297,1075,489,420,424,340,504,685,105,898,870,206,129,516,492,42,216,1829,1317,10,60,54,255,103,457,257,101,93,981,412,67,519,574,169,799,381,1509,60,409,51,151,464,1676,916,18,30,772,1566,1283,359,1260,10,405,750,160,181,541,358,213,300,1073,328,399,214,119,478,889,65,56,1077,1427,52,359,90,42,1248,336,51,1396,509,237,785,440,806,339,99,354,640,272,665,772,135,91,11,175,128,482,1244,1243,629,137,140,1003,626,433,391,731,1180,671,169,710,1561,385,1281,272,236,318,207,1323,16,233,9,720,295,34,183,362,987,1016,366,760,1244,878,600,275,1209,41,792,951,85,636,125,217,342,184,581,1300,66,165,804,285,756,96,278,598,163,655,138,869,537,141,1364,897,406,617,65,444,244,494,172,119,358,1183,310,226,98,550,634,948,985,247,1499,729,165,371,939,299,761,477,1480,840,3,319,675,492,564,3,3,80,182,69,460,341,789,742,46,1309,360,48,296,363,946,214,252,54,147,435,85,276,1072,23,71,755,572,268,1362,619,639,365,623,1560,322,535,997,1021,317,663,82,314,857,16,194,363,24,240,1596,1123,242,816,116,645,64,38,589,428,147,632,457,555,908,921,202,182,403,551,358,483,1195,1213,28,1156,725,320,16,74,931,103,145,146,1206,433,1052,158,531,699,675,379,393,475,384,1041,141,1248,521,136,326,199,725,200,465,796,724,672,569,70,663,15,150,131,1261,17,1211,66,175,608,17,81,551,627,1469,1032,342,2,972,184,798,960,22,55,462,1,151,91,119,76,1062,96,1424,567,366,831,633,205,691,50,1314,732,558,167,1624,5,147,47,110,250,935,177,445,79,306,653,47,75,626,173,104,354,573,523,46,46,757,541,431,1129,787,502,1328,1093,82,872,1876,1386,136,504,273,194,297,0,163,1025,996,354,1457,1127,52,45,1364,1128,457,1576,282,573,1648,16,28,582,768,92,92,817,1515,297,349,97,1523,634,923,76,1174,552,347,750,326,221,149,0,188,791,251,113,1,71,92,393,103,618,335,97,236,418,256,764,435,411,941,74,423,443,27,427,178,262,181,362,156,572,324,684,796,249,288,413,132,29,444,766,1135,1235,208,231,620,1481,228,174,133,918,1825,618,663,22,124,119,52,159,1318,1724,338,243,206,127,436,163,297,617,141,59,65,20,164,11,126,363,150,726,217,1282,1708,118,1055,60,603,852,170,1097,58,213,495,566,673,1607,994,539,1655 diff --git a/07/main.cpp b/07/main.cpp new file mode 100644 index 0000000..c3709ae --- /dev/null +++ b/07/main.cpp @@ -0,0 +1,80 @@ +#include +#include +#include +#include + +std::vector getCrabs(const std::string &file_name) { + std::vector crabs; + + std::ifstream file(file_name); + std::string str; + std::getline(file, str); + int tmp{}; + char tmp_char{}; + std::stringstream ss(str); + while (ss >> tmp) { + if (tmp >= crabs.size()) { + crabs.resize(tmp + 1); + } + crabs[tmp] += 1; + ss >> tmp_char; + } + return crabs; +} + +uint64_t diff(uint64_t a, uint64_t b) { + if (a < b) { + return b - a; + } + return a - b; +} + +static std::vector fuel_cost{ 0 }; + +uint64_t increasingFuel(uint64_t a, uint64_t b) { + auto difference = diff(a, b); + while (fuel_cost.size() <= difference) { + fuel_cost.push_back(fuel_cost.back() + fuel_cost.size()); + } + return fuel_cost[difference]; +} + +uint64_t leastFuelCrabs(const std::vector &crabs, bool increasing_fuel) { + uint64_t least = -1; + for (uint64_t i = 0; i < crabs.size(); i++) { + uint64_t fuel = 0; + for (uint64_t j = 0; j < crabs.size(); j++) { + if (!increasing_fuel) { + fuel += diff(j, i) * crabs[j]; + } else { + fuel += increasingFuel(j, i) * crabs[j]; + } + } + if (fuel < least) { + least = fuel; + } + } + return least; +} + +uint64_t part1(const std::vector &crabs) { + return leastFuelCrabs(crabs, false); +} + +uint64_t part2(const std::vector &crabs) { + return leastFuelCrabs(crabs, true); +} + +int main(int argc, char **argv) { + if (argc < 2) { + std::cerr << "You must provide input file!" << std::endl; + return 1; + } + auto crabs = getCrabs(argv[1]); + std::cout << "The least fuel crabs have to use is \033[91;1m" + << part1(crabs) << "\033[0m." << std::endl; + std::cout << "The least fuel crabs have to use with correctly computed " + "consumption is \033[91;1m" + << part2(crabs) << "\033[0m." << std::endl; + return 0; +}