D3 done
This commit is contained in:
58
src/day-3-solution.cpp
Normal file
58
src/day-3-solution.cpp
Normal file
@@ -0,0 +1,58 @@
|
||||
#include "spdlog/spdlog.h"
|
||||
#include <algorithm>
|
||||
#include <concepts>
|
||||
#include <fstream>
|
||||
#include <ranges>
|
||||
#include <string>
|
||||
#include <sys/types.h>
|
||||
#include <vector>
|
||||
|
||||
uint_fast64_t get_joltage_part_one(std::string& line){
|
||||
std::ranges::subrange<std::string::const_iterator, std::string::const_iterator> greedy_view
|
||||
= std::ranges::subrange<std::string::const_iterator, std::string::const_iterator>{line.cbegin(),line.cend()-1};
|
||||
|
||||
std::string::const_iterator first_greedy_max = std::ranges::max_element(greedy_view);
|
||||
|
||||
std::ranges::subrange<std::string::const_iterator, std::string::const_iterator> greedy_view_second = std::ranges::subrange<std::string::const_iterator, std::string::const_iterator> {first_greedy_max+1, line.cend()};
|
||||
|
||||
std::string::const_iterator second_greedy_max = std::ranges::max_element(greedy_view_second);
|
||||
|
||||
return static_cast<uint_fast64_t>((*first_greedy_max - '0')*10 + (*second_greedy_max -'0'));
|
||||
}
|
||||
|
||||
uint_fast64_t get_joltage_generalized(std::string& line, uint_fast64_t digits){
|
||||
std::vector<std::string::const_iterator> digits_pointer_store = std::vector<std::string::const_iterator>{};
|
||||
std::string::const_iterator offset = line.cbegin();
|
||||
for (uint_fast64_t countdown = {digits}; countdown>0; countdown--) {
|
||||
std::ranges::subrange<std::string::const_iterator, std::string::const_iterator> greedy_view
|
||||
= std::ranges::subrange<std::string::const_iterator, std::string::const_iterator>{offset,line.cend()-countdown+1};
|
||||
std::string::const_iterator digit_chosen = std::ranges::max_element(greedy_view);
|
||||
digits_pointer_store.push_back(digit_chosen);
|
||||
offset = digit_chosen+1;
|
||||
}
|
||||
uint_fast64_t running_sum = uint_fast64_t {0};
|
||||
|
||||
for (std::vector<std::string::const_iterator>::const_iterator i = digits_pointer_store.cbegin(); i!= digits_pointer_store.cend(); i++) {
|
||||
running_sum*=10;
|
||||
running_sum+= static_cast<uint_fast64_t>(**i - '0');
|
||||
}
|
||||
return running_sum;
|
||||
}
|
||||
|
||||
void solving_engine(std::ifstream& file) noexcept{
|
||||
std::string current_line = std::string {};
|
||||
uint_fast64_t running_joltage_sum_part_one = uint_fast64_t {0};
|
||||
uint_fast64_t running_joltage_sum_part_two = uint_fast64_t {0};
|
||||
while(std::getline(file, current_line)){
|
||||
running_joltage_sum_part_one += get_joltage_part_one(current_line);
|
||||
running_joltage_sum_part_two += get_joltage_generalized(current_line, 12);
|
||||
}
|
||||
spdlog::info("Part one Solution: {}", running_joltage_sum_part_one);
|
||||
spdlog::info("Part two solution: {}", running_joltage_sum_part_two);
|
||||
}
|
||||
|
||||
int main () {
|
||||
std::ifstream input_file = std::ifstream {"testcases/day-3.in", std::ios_base::binary};
|
||||
solving_engine(input_file);
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user