63 lines
1.3 KiB
C++
63 lines
1.3 KiB
C++
|
#include <algorithm>
|
||
|
#include <cstdint>
|
||
|
#include <iostream>
|
||
|
#include <tuple>
|
||
|
#include <fstream>
|
||
|
#include <iterator>
|
||
|
#include <vector>
|
||
|
|
||
|
#include <aocpp/Startup.hpp>
|
||
|
|
||
|
namespace {
|
||
|
|
||
|
auto Parse(std::istream & in) -> std::pair<std::int64_t, std::int64_t> {
|
||
|
std::int64_t lo, hi;
|
||
|
std::string line;
|
||
|
std::getline(in, line, '-');
|
||
|
lo = std::stol(std::move(line));
|
||
|
std::getline(in, line);
|
||
|
hi = std::stol(std::move(line));
|
||
|
return {lo,hi};
|
||
|
}
|
||
|
|
||
|
auto Valid1(std::string const& str) {
|
||
|
for (std::size_t i = 1; i < str.size(); i++) {
|
||
|
if (str[i-1] == str[i]) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
auto Valid2(std::string const& str) {
|
||
|
for (std::size_t i = 1; i < str.size(); i++) {
|
||
|
if ( str[i] == str[i-1] &&
|
||
|
(i == str.size() - 1 || str[i] != str[i+1]) &&
|
||
|
(i == 1 || str[i] != str[i-2]))
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
} // namespace
|
||
|
|
||
|
auto main(int argc, char** argv) -> int {
|
||
|
auto [lo,hi] = Parse(aocpp::Startup(argc, argv));
|
||
|
|
||
|
std::int64_t part1 = 0;
|
||
|
std::int64_t part2 = 0;
|
||
|
|
||
|
for (auto i = lo; i <= hi; i++) {
|
||
|
auto str = std::to_string(i);
|
||
|
if (std::is_sorted(str.begin(), str.end())) {
|
||
|
if (Valid1(str)) part1++;
|
||
|
if (Valid2(str)) part2++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
std::cout << "Part 1: " << part1 << std::endl;
|
||
|
std::cout << "Part 2: " << part2 << std::endl;
|
||
|
}
|