Add 2021 day 6 puzzles
This commit is contained in:
59
2016/puzzle-09-01.cc
Normal file
59
2016/puzzle-09-01.cc
Normal file
@@ -0,0 +1,59 @@
|
||||
//
|
||||
// Created by Matthew Gretton-Dann on 05/12/2021.
|
||||
//
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
std::string decompress(std::string const& s)
|
||||
{
|
||||
std::string result;
|
||||
std::size_t idx{0};
|
||||
while (idx < s.size()) {
|
||||
if (s[idx] != '(') {
|
||||
auto idx2{s.find('(', idx)};
|
||||
if (idx2 == std::string::npos) {
|
||||
idx2 = s.size();
|
||||
};
|
||||
result += s.substr(idx, idx2 - idx);
|
||||
idx = idx2;
|
||||
}
|
||||
else {
|
||||
assert(s[idx] == '(');
|
||||
++idx;
|
||||
std::size_t end{0};
|
||||
auto length{std::stoul(s.substr(idx), &end)};
|
||||
idx += end;
|
||||
assert(idx < s.size());
|
||||
assert(s[idx] == 'x');
|
||||
++idx;
|
||||
auto count{std::stoul(s.substr(idx), &end)};
|
||||
idx += end;
|
||||
assert(idx < s.size());
|
||||
assert(s[idx] == ')');
|
||||
++idx;
|
||||
assert(length <= s.size());
|
||||
assert(idx <= s.size() - length);
|
||||
while (count-- != 0) {
|
||||
result += s.substr(idx, length);
|
||||
}
|
||||
idx += length;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
auto main() -> int
|
||||
{
|
||||
std::string line;
|
||||
std::string input;
|
||||
|
||||
while (std::getline(std::cin, line)) {
|
||||
input += line;
|
||||
}
|
||||
std::cout << input;
|
||||
auto output{decompress(input)};
|
||||
std::cout << "Output length: " << output.size() << '\n';
|
||||
return 0;
|
||||
}
|
56
2016/puzzle-09-02.cc
Normal file
56
2016/puzzle-09-02.cc
Normal file
@@ -0,0 +1,56 @@
|
||||
//
|
||||
// Created by Matthew Gretton-Dann on 05/12/2021.
|
||||
//
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
std::size_t decompress_length(std::string const& s)
|
||||
{
|
||||
std::size_t result_len{0};
|
||||
std::size_t idx{0};
|
||||
while (idx < s.size()) {
|
||||
if (s[idx] != '(') {
|
||||
auto idx2{s.find('(', idx)};
|
||||
if (idx2 == std::string::npos) {
|
||||
idx2 = s.size();
|
||||
};
|
||||
result_len += idx2 - idx;
|
||||
idx = idx2;
|
||||
}
|
||||
else {
|
||||
assert(s[idx] == '(');
|
||||
++idx;
|
||||
std::size_t end{0};
|
||||
auto length{std::stoul(s.substr(idx), &end)};
|
||||
idx += end;
|
||||
assert(idx < s.size());
|
||||
assert(s[idx] == 'x');
|
||||
++idx;
|
||||
auto count{std::stoul(s.substr(idx), &end)};
|
||||
idx += end;
|
||||
assert(idx < s.size());
|
||||
assert(s[idx] == ')');
|
||||
++idx;
|
||||
assert(length <= s.size());
|
||||
assert(idx <= s.size() - length);
|
||||
result_len += count * decompress_length(s.substr(idx, length));
|
||||
idx += length;
|
||||
}
|
||||
}
|
||||
|
||||
return result_len;
|
||||
}
|
||||
|
||||
auto main() -> int
|
||||
{
|
||||
std::string line;
|
||||
std::string input;
|
||||
|
||||
while (std::getline(std::cin, line)) {
|
||||
input += line;
|
||||
}
|
||||
auto output{decompress_length(input)};
|
||||
std::cout << "Output length: " << output << '\n';
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user