advent2015

advent of code 2015 (c++)
git clone git://bsandro.tech/advent2015
Log | Files | Refs

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 }