diff --git a/2022/puzzle-20-01.cc b/2022/puzzle-20-01.cc new file mode 100644 index 0000000..7d20638 --- /dev/null +++ b/2022/puzzle-20-01.cc @@ -0,0 +1,101 @@ +// +// Created by Matthew Gretton-Dann on 16/12/2022. +// + +#include +#include +#include +#include +#include +#include +#include + +using Int = std::int64_t; +using UInt = std::uint64_t; +using Ints = std::vector>; + +using namespace std::string_literals; + +auto find_at_offset(Ints const& nums, Int offset) -> Int +{ + auto it{std::find_if(nums.begin(), nums.end(),[](auto const& a) { return a.first == 0;})}; + while (offset > 0) { + --offset; + if (it == nums.end()) { + it = nums.begin(); + } + ++it; + } + while (offset < 0) { + ++offset; + if (it == nums.begin()) { + it = nums.end(); + } + --it; + } + return it->first; +} + +auto print_nums(auto const& v) -> void +{ + bool first{true}; + for (auto const& e : v) { + if (!first) { + std::cout << ", "; + } + else { + first = false; + } + std::cout << e; + } + std::cout << "\n"; +} + +auto main() -> int +{ + std::string line; + Ints distances; + while (std::getline(std::cin, line)) { + distances.emplace_back(std::make_pair(std::stoll(line),static_cast(distances.size()))); + } + + Ints nums{distances}; + std::cout << "Number of numbers: " << nums.size() << "\n"; + for (auto i : distances) { + auto it{std::find(nums.begin(), nums.end(), i)}; + auto old_pos{it - nums.begin()}; + auto dist = i; + auto new_pos{(old_pos + nums.size() + dist.first) % nums.size()}; + it = nums.erase(it); + while (dist.first > 0) { + --dist.first; + if (it == nums.end()) { + it = nums.begin(); + } + ++it; + } + while (dist.first < 0) { + ++dist.first; + if (it == nums.begin()) { + it = nums.end(); + } + --it; + } + nums.insert(it, i); + std::cout << i.first << ": was at " << old_pos << " now at " + << std::find(nums.begin(), nums.end(), dist) - nums.begin() << "\n"; + // std::cout << dist << ": "; + // print_nums(nums); + } + + Int num1000{find_at_offset(nums, 1000)}; + Int num2000{find_at_offset(nums, 2000)}; + Int num3000{find_at_offset(nums, 3000)}; + Int result{num1000 + num2000 + num3000}; + std::cout << "Offset 1000: " << num1000 << "\n"; + std::cout << "Offset 2000: " << num2000 << "\n"; + std::cout << "Offset 3000: " << num3000 << "\n"; + std::cout << "Total: " << result << "\n"; + + return EXIT_SUCCESS; +} diff --git a/2022/puzzle-20-02.cc b/2022/puzzle-20-02.cc new file mode 100644 index 0000000..63e2d4e --- /dev/null +++ b/2022/puzzle-20-02.cc @@ -0,0 +1,66 @@ +// +// Created by Matthew Gretton-Dann on 16/12/2022. +// + +#include +#include +#include +#include +#include +#include +#include + +using Int = std::int64_t; +using UInt = std::uint64_t; +using Ints = std::vector>; + +using namespace std::string_literals; + +auto offset_into(Int dist, Int size) +{ + if (dist < 0) { + dist += size * (1 - dist / size); + } + dist %= size; + return dist; +} + +auto find_at_offset(Ints const& nums, Int offset) -> Int +{ + auto it{std::find_if(nums.begin(), nums.end(), [](auto const& a) { return a.first == 0; })}; + offset = offset_into(offset + (it - nums.begin()), nums.size()); + return nums[offset].first; +} + +auto main() -> int +{ + std::string line; + Ints distances; + Int const multiplier{811589153}; + while (std::getline(std::cin, line)) { + distances.emplace_back( + std::make_pair(std::stoll(line) * multiplier, static_cast(distances.size()))); + } + + Ints nums{distances}; + std::cout << "Number of numbers: " << nums.size() << "\n"; + for (unsigned iter{0}; iter < 10; ++iter) { + for (auto i : distances) { + auto it{nums.erase(std::find(nums.begin(), nums.end(), i))}; + Int const num_size{static_cast(nums.size())}; + Int dist{offset_into(i.first + (it - nums.begin()), num_size)}; + nums.insert(nums.begin() + dist, i); + } + } + + Int const num1000{find_at_offset(nums, 1000)}; + Int const num2000{find_at_offset(nums, 2000)}; + Int const num3000{find_at_offset(nums, 3000)}; + Int const result{num1000 + num2000 + num3000}; + std::cout << "Offset 1000: " << num1000 << "\n"; + std::cout << "Offset 2000: " << num2000 << "\n"; + std::cout << "Offset 3000: " << num3000 << "\n"; + std::cout << "Total: " << result << "\n"; + + return EXIT_SUCCESS; +}