PB4 part1 done
This commit is contained in:
parent
273384c8e7
commit
927b7ee529
@ -50,7 +50,9 @@ add_subdirectory(pb_1)
|
||||
|
||||
add_subdirectory(pb_2)
|
||||
|
||||
set_target_properties(AdventOfCode2023 pb_1 pb_2 PROPERTIES
|
||||
add_subdirectory(pb_4)
|
||||
|
||||
set_target_properties(AdventOfCode2023 pb_1 pb_2 pb_4 PROPERTIES
|
||||
CXX_STANDARD 20
|
||||
CXX_STANDARD_REQUIRED ON
|
||||
CXX_EXTENSIONS OFF
|
||||
@ -64,4 +66,4 @@ set_target_properties(AdventOfCode2023 pb_1 pb_2 PROPERTIES
|
||||
|
||||
#target_link_options(AdventOfCode2023 PUBLIC ${LINKER_OPTIONS})
|
||||
|
||||
target_link_libraries(AdventOfCode2023 PUBLIC pb_1 pb_2 ${LINKER_FLAGS})
|
||||
target_link_libraries(AdventOfCode2023 PUBLIC pb_1 pb_2 pb_4 ${LINKER_FLAGS})
|
||||
|
8
main.cpp
8
main.cpp
@ -1,6 +1,7 @@
|
||||
#include <iostream>
|
||||
#include "pb_1/problem_1.hpp"
|
||||
#include "pb_2/problem_2.hpp"
|
||||
#include "pb_4/problem_4.hpp"
|
||||
|
||||
int main() {
|
||||
{
|
||||
@ -21,5 +22,12 @@ int main() {
|
||||
std::cout << "Problem 2 part 1: " << result << '\n';
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
std::cout << "Begin Problem 4 part 1\n";
|
||||
if (const auto result = pb4::problem_part1("inputs/pb4.txt"); result != 0) {
|
||||
std::cout << "Problem 4 part 1: " << result << '\n';
|
||||
}
|
||||
}
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
11
pb_4/CMakeLists.txt
Normal file
11
pb_4/CMakeLists.txt
Normal file
@ -0,0 +1,11 @@
|
||||
project(pb_4 CXX)
|
||||
|
||||
add_library(pb_4 STATIC problem_4.cpp problem_4.hpp)
|
||||
|
||||
target_compile_definitions(pb_4 PUBLIC $<$<AND:$<CONFIG:Debug>,$<STREQUAL:$<CXX_COMPILER_ID>,GNU>>:_GLIBCXX_DEBUG>)
|
||||
|
||||
target_compile_options(pb_4 PUBLIC ${COMPILE_FLAGS})
|
||||
|
||||
target_link_options(pb_4 PUBLIC ${LINKER_OPTIONS})
|
||||
|
||||
target_link_libraries(pb_4 ${LINKER_FLAGS} common)
|
74
pb_4/problem_4.cpp
Normal file
74
pb_4/problem_4.cpp
Normal file
@ -0,0 +1,74 @@
|
||||
//
|
||||
// Created by postaron on 31/07/24.
|
||||
//
|
||||
|
||||
#include "problem_4.hpp"
|
||||
#include "../common/common_functions.hpp"
|
||||
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <cmath>
|
||||
#include <algorithm>
|
||||
#include <numeric>
|
||||
|
||||
std::vector<int> extract_unique_cards(const std::string &input) {
|
||||
std::set<int> unique_part;
|
||||
|
||||
bool begin_num = false;
|
||||
std::string tmp_num;
|
||||
for (const auto &item: input) {
|
||||
if (!begin_num && item != ' ') {
|
||||
begin_num = true;
|
||||
tmp_num.push_back(item);
|
||||
} else if (begin_num && item == ' ') {
|
||||
begin_num = false;
|
||||
unique_part.insert(std::stoi(tmp_num));
|
||||
tmp_num.clear();
|
||||
} else if (begin_num) {
|
||||
tmp_num.push_back(item);
|
||||
}
|
||||
}
|
||||
if (!tmp_num.empty()) {
|
||||
unique_part.insert(std::stoi(tmp_num));
|
||||
}
|
||||
|
||||
return { unique_part.cbegin(), unique_part.cend() };
|
||||
}
|
||||
|
||||
std::size_t pb4::problem_part1(const std::filesystem::path &problemFile) noexcept {
|
||||
auto file_opt = common::read_file(problemFile);
|
||||
if (!file_opt) {
|
||||
return 0;
|
||||
}
|
||||
std::ifstream &file = *file_opt;
|
||||
std::string line;
|
||||
std::vector<int> compute_points;
|
||||
while (std::getline(file, line)) {
|
||||
if (!line.empty()) {
|
||||
line = line.substr(line.find_first_of(':') + 1);
|
||||
|
||||
const auto split_char = line.find_first_of('|');
|
||||
const auto left = line.substr(0, split_char);
|
||||
const auto right = line.substr(split_char + 1);
|
||||
|
||||
const auto left_cards = extract_unique_cards(left);
|
||||
const auto right_cards = extract_unique_cards(right);
|
||||
std::vector<int> intersection;
|
||||
intersection.reserve(left.size() + right_cards.size());
|
||||
std::set_intersection(left_cards.cbegin(),
|
||||
left_cards.cend(),
|
||||
right_cards.cbegin(),
|
||||
right_cards.cend(),
|
||||
std::back_inserter(intersection));
|
||||
if (!intersection.empty()) {
|
||||
compute_points.emplace_back(
|
||||
static_cast<int>(std::floor(std::pow(2.0f, static_cast<float>(intersection.size() - 1))))
|
||||
);
|
||||
} else {
|
||||
compute_points.emplace_back(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
return std::accumulate(compute_points.cbegin(), compute_points.cend(), 0);
|
||||
}
|
20
pb_4/problem_4.hpp
Normal file
20
pb_4/problem_4.hpp
Normal file
@ -0,0 +1,20 @@
|
||||
//
|
||||
// Created by postaron on 31/07/24.
|
||||
//
|
||||
|
||||
#ifndef ADVENTOFCODE2023_PROBLEM_4_HPP
|
||||
#define ADVENTOFCODE2023_PROBLEM_4_HPP
|
||||
|
||||
#include <filesystem>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
|
||||
namespace pb4 {
|
||||
namespace fs = std::filesystem;
|
||||
|
||||
std::size_t problem_part1(const fs::path &problemFile) noexcept;
|
||||
|
||||
std::size_t problem_part2(const fs::path &problemFile) noexcept;
|
||||
}
|
||||
|
||||
#endif //ADVENTOFCODE2023_PROBLEM_4_HPP
|
Loading…
Reference in New Issue
Block a user