From 86d9f2d22e02b0b49c2155e0d40f10a538eca53e Mon Sep 17 00:00:00 2001 From: Matthew Gretton-Dann Date: Sat, 2 Dec 2023 09:10:43 +0000 Subject: [PATCH] 2023 Day 1 now tidied --- 2023/puzzle-01-01.cc | 9 ++++-- 2023/puzzle-01-02.cc | 68 ++++++++++++++++++++++++++++++++++++++++++++ CMakeLists.txt | 1 + 3 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 2023/puzzle-01-02.cc diff --git a/2023/puzzle-01-01.cc b/2023/puzzle-01-01.cc index 35d4552..9789ffc 100644 --- a/2023/puzzle-01-01.cc +++ b/2023/puzzle-01-01.cc @@ -1,7 +1,10 @@ +#include #include +#include #include #include #include +#include using UInt = std::uint64_t; @@ -44,8 +47,8 @@ auto find_last_digit(std::string const& line) -> int auto main() -> int { - UInt sum1{0}; - UInt sum2{0}; + int sum1{0}; + int sum2{0}; std::string line; while (std::getline(std::cin, line)) { @@ -54,7 +57,7 @@ auto main() -> int assert(first != std::string::npos); assert(last != std::string::npos); sum1 += (line[first] - '0') * 10; - sum1 += (line[last] - '0'); + sum1 += line[last] - '0'; sum2 += find_first_digit(line) * 10; sum2 += find_last_digit(line); } diff --git a/2023/puzzle-01-02.cc b/2023/puzzle-01-02.cc new file mode 100644 index 0000000..9789ffc --- /dev/null +++ b/2023/puzzle-01-02.cc @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include +#include +#include + +using UInt = std::uint64_t; + +constexpr std::array nums = { + std::make_pair("one", 1), std::make_pair("two", 2), std::make_pair("three", 3), + std::make_pair("four", 4), + std::make_pair("five", 5), std::make_pair("six", 6), + std::make_pair("seven", 7), + std::make_pair("eight", 8), std::make_pair("nine", 9)}; + +auto find_first_digit(std::string const& line) -> int +{ + auto pos = line.find_first_of("0123456789"); + auto value = line[pos] - '0'; + for (auto [s, v] : nums) { + if (auto p = line.find(s); p != std::string::npos) { + if (p < pos) { + pos = p; + value = v; + } + } + } + return value; +} + +auto find_last_digit(std::string const& line) -> int +{ + auto pos = line.find_last_of("0123456789"); + auto value = line[pos] - '0'; + for (auto [s, v] : nums) { + if (auto p = line.rfind(s); p != std::string::npos) { + if (p > pos) { + pos = p; + value = v; + } + } + } + return value; +} + +auto main() -> int +{ + int sum1{0}; + int sum2{0}; + + std::string line; + while (std::getline(std::cin, line)) { + auto first = line.find_first_of("0123456789"); + auto last = line.find_last_of("0123456789"); + assert(first != std::string::npos); + assert(last != std::string::npos); + sum1 += (line[first] - '0') * 10; + sum1 += line[last] - '0'; + sum2 += find_first_digit(line) * 10; + sum2 += find_last_digit(line); + } + + std::cout << "Sum 1: " << sum1 << "\n"; + std::cout << "Sum 2: " << sum2 << "\n"; + return EXIT_SUCCESS; +} diff --git a/CMakeLists.txt b/CMakeLists.txt index afd0ef3..8e9d4c6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,7 @@ project(advent-of-code) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) file(GLOB years LIST_DIRECTORIES true RELATIVE "${CMAKE_SOURCE_DIR}" CONFIGURE_DEPENDS "20[1-9][0-9]")