main.cpp (1843B)
1 #include <iostream> 2 #include <filesystem> 3 #include <fstream> 4 #include <vector> 5 #include <set> 6 #include <cstring> 7 #include <cstdio> 8 #include <tuple> 9 #include <algorithm> 10 11 typedef std::vector<char> Data; 12 13 template<typename T> 14 T read_file(const std::string &path) { 15 std::ifstream ifs(path, std::ios::binary); 16 if (!ifs.is_open()) { 17 throw std::runtime_error(path+":"+std::strerror(errno)); 18 } 19 std::uintmax_t size = std::filesystem::file_size(path); 20 T buf(size); 21 if (!ifs.read((char *)buf.data(), buf.size())) { 22 throw std::runtime_error(path+":"+std::strerror(errno)); 23 } 24 return buf; 25 } 26 27 int part1(Data &input) { 28 std::set<std::pair<int, int>> visited; 29 visited.insert(std::make_pair(0, 0)); 30 std::pair<int,int> cur{0, 0}; 31 for (auto c : input) { 32 if (c=='>') ++cur.first; 33 else if (c=='<') --cur.first; 34 else if (c=='^') ++cur.second; 35 else if (c=='v') --cur.second; 36 visited.insert(cur); 37 } 38 return visited.size(); 39 } 40 int part2(Data &input) { 41 std::set<std::pair<int, int>> visited; 42 visited.insert(std::make_pair(0, 0)); 43 std::pair<int,int> cur1{0, 0}; 44 std::pair<int,int> cur2{0, 0}; 45 for (int i=0; i<(int)input.size(); ++i) { 46 auto &cur = i%2==0?cur1:cur2; 47 char c = input[i]; 48 if (c=='>') ++cur.first; 49 else if (c=='<') --cur.first; 50 else if (c=='^') ++cur.second; 51 else if (c=='v') --cur.second; 52 visited.insert(cur); 53 } 54 return visited.size(); 55 } 56 57 int main(int argc, char **argv) { 58 const std::string fname = argc>1 ? argv[1] : "test1.txt"; 59 std::cout << "AoC 2015 day 03 " << fname << std::endl; 60 Data input = read_file<Data>(fname); 61 std::cout << "part1: " << part1(input) << std::endl; 62 std::cout << "part2: " << part2(input) << std::endl; 63 64 return 0; 65 }