Solutions for 2018 day 8
This commit is contained in:
61
2018/puzzle-08-01.cc
Normal file
61
2018/puzzle-08-01.cc
Normal file
@@ -0,0 +1,61 @@
|
||||
//
|
||||
// Created by Matthew Gretton-Dann on 01/12/2022.
|
||||
//
|
||||
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <cstdlib>
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <regex>
|
||||
#include <utility>
|
||||
|
||||
using Int = std::int64_t;
|
||||
|
||||
template<typename iterator>
|
||||
auto read_int(iterator& begin, iterator end) -> Int
|
||||
{
|
||||
while (begin != end && *begin == ' ') {
|
||||
++begin;
|
||||
}
|
||||
Int result{0};
|
||||
while (begin != end && std::isdigit(*begin) != 0) {
|
||||
result *= 10;
|
||||
result += *begin - '0';
|
||||
++begin;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename iterator>
|
||||
auto process_string(iterator& begin, iterator end) -> Int
|
||||
{
|
||||
Int score{0};
|
||||
Int child_count{read_int(begin, end)};
|
||||
Int metadata_count{read_int(begin, end)};
|
||||
for (Int i{0}; i < child_count; ++i) {
|
||||
score += process_string(begin, end);
|
||||
}
|
||||
for (Int i{0}; i < metadata_count; ++i) {
|
||||
score += read_int(begin, end);
|
||||
}
|
||||
return score;
|
||||
}
|
||||
|
||||
auto main() -> int
|
||||
{
|
||||
std::string line;
|
||||
|
||||
// Read data
|
||||
if (!std::getline(std::cin, line)) {
|
||||
std::cerr << "Unable to read line.\n";
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
auto begin{line.begin()};
|
||||
Int sum{process_string(begin, line.end())};
|
||||
std::cout << "Sum: " << sum << "\n";
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
72
2018/puzzle-08-02.cc
Normal file
72
2018/puzzle-08-02.cc
Normal file
@@ -0,0 +1,72 @@
|
||||
//
|
||||
// Created by Matthew Gretton-Dann on 01/12/2022.
|
||||
//
|
||||
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <cstdlib>
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <regex>
|
||||
#include <utility>
|
||||
|
||||
using Int = std::int64_t;
|
||||
|
||||
template<typename iterator>
|
||||
auto read_int(iterator& begin, iterator end) -> Int
|
||||
{
|
||||
while (begin != end && *begin == ' ') {
|
||||
++begin;
|
||||
}
|
||||
Int result{0};
|
||||
while (begin != end && std::isdigit(*begin) != 0) {
|
||||
result *= 10;
|
||||
result += *begin - '0';
|
||||
++begin;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename iterator>
|
||||
auto process_string(iterator& begin, iterator end) -> Int
|
||||
{
|
||||
Int child_count{read_int(begin, end)};
|
||||
Int metadata_count{read_int(begin, end)};
|
||||
std::vector<Int> child_scores;
|
||||
child_scores.push_back(0);
|
||||
for (Int i{0}; i < child_count; ++i) {
|
||||
child_scores.push_back(process_string(begin, end));
|
||||
}
|
||||
|
||||
Int score{0};
|
||||
for (Int i{0}; i < metadata_count; ++i) {
|
||||
if (child_count > 0) {
|
||||
Int idx{read_int(begin, end)};
|
||||
if (idx < child_scores.size()) {
|
||||
score += child_scores[idx];
|
||||
}
|
||||
}
|
||||
else {
|
||||
score += read_int(begin, end);
|
||||
}
|
||||
}
|
||||
return score;
|
||||
}
|
||||
|
||||
auto main() -> int
|
||||
{
|
||||
std::string line;
|
||||
|
||||
// Read data
|
||||
if (!std::getline(std::cin, line)) {
|
||||
std::cerr << "Unable to read line.\n";
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
auto begin{line.begin()};
|
||||
Int sum{process_string(begin, line.end())};
|
||||
std::cout << "Sum: " << sum << "\n";
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
Reference in New Issue
Block a user