diff --git a/Day5-2.cpp b/Day5-2.cpp new file mode 100644 index 0000000..6504619 --- /dev/null +++ b/Day5-2.cpp @@ -0,0 +1,146 @@ +//Fun/AdventCalendar2020/Day5-2.cpp +//Matthew Ellison +// Created: 12-05-20 +//Modified: 12-05-20 +//Find your seat id from the boarding passes + + +#include +#include +#include +#include +#include "Stopwatch.hpp" +#include "Algorithms.hpp" + + +struct boardingPass{ + std::string passString; + int rowNumber; + int columnNumber; + int seatId; + void setPassString(std::string newPass){ + int minRow = 0; + int maxRow = 127; + //Set the whole string + passString = newPass; + //Determine the row the seat is in + for(int cnt = 0;cnt < 7;++cnt){ + char half = newPass[cnt]; + //Keep the smaller half + if(half == 'F'){ + maxRow = (minRow + maxRow) / 2; + } + //Keep the larger half + else if(half == 'B'){ + minRow = ((minRow + maxRow) / 2) + 1; + } + else{ + std::cout << "ERROR! half must == F or B" << std::endl; + exit(1); + } + } + if(newPass[6] == 'F'){ + rowNumber = maxRow; + } + else{ + rowNumber = minRow; + } + int minSeat = 0; + int maxSeat = 7; + //Determine the column the seat is in + for(int cnt = 7;cnt < 10;++cnt){ + char half = newPass[cnt]; + if(half == 'L'){ + maxSeat = (minSeat + maxSeat) / 2; + } + else if(half == 'R'){ + minSeat = ((minSeat + maxSeat) / 2) + 1; + } + else{ + std::cout << "ERROR! half must == R or L" << std::endl; + exit(1); + } + } + if(newPass[9] == 'L'){ + columnNumber = maxSeat; + } + else{ + columnNumber = minSeat; + } + //Determine the seatId + seatId = (rowNumber * 8) + columnNumber; + } + //Compare according to seatId + bool operator>(boardingPass& pass2){ + return seatId > pass2.seatId; + } + bool operator>=(boardingPass& pass2){ + return seatId >= pass2.seatId; + } + bool operator<(boardingPass& pass2){ + return seatId < pass2.seatId; + } + bool operator<=(boardingPass& pass2){ + return seatId <= pass2.seatId; + } + bool operator==(boardingPass& pass2){ + return seatId == pass2.seatId; + } +}; + + +std::vector importData(){ + std::vector boardingPasses; + std::ifstream inputFile("inputs/Day5.txt"); //Open the input file + + //Go through every element in the file and set it in the vector + int cnt = 1; + while(!inputFile.eof()){ + boardingPass pass; + std::string currentPass; + inputFile >> currentPass; + if(!currentPass.empty()){ + pass.setPassString(currentPass); + } + ++cnt; + boardingPasses.push_back(pass); + } + + return boardingPasses; +} + + +int main(){ + mee::Stopwatch timer; + std::vector passes = importData(); + int yourSeatId; + + //Start the timer + timer.start(); + + + //Sort the list of passes by seatId + std::sort(passes.begin(), passes.end()); + + //Go through every pass in the list (except the ends) and your seat id should be one where seats on both sides are +/-1 off of yours + for(int cnt = 1;cnt < (passes.size() - 1);++cnt){ + if(passes[cnt - 1].seatId == (passes[cnt].seatId - 2)){ + yourSeatId = passes[cnt].seatId - 1; + break; + } + } + + //Stop the timer + timer.stop(); + + //Print the results + std::cout << "Your seatId = " << yourSeatId + <<"\nIt took " << timer.getStr() << " to finish this problem" << std::endl; + + return 0; +} + +/* Results: +Your seatId = 612 +It took 0.000 nanoseconds to finish this problem +*/