Files
f-task/main.cpp
2024-03-08 13:59:20 +05:00

92 lines
2.4 KiB
C++

#include <cctype>
#include <cstdlib>
#include <iostream>
#include <string>
std::string decode(std::string& strIn, std::string::iterator& itr, bool firstCircle = false)
{
std::string out;
while (itr != strIn.end())
{
std::string strNum;
auto repeat = 1;
if (std::isdigit(static_cast<unsigned>(*itr)))
{
while (*itr != '[')
{
strNum += *itr++;
}
repeat = std::atoi(strNum.c_str());
auto rptOut = decode(strIn, ++itr);
for (int i = 0; i < repeat; ++i)
out += rptOut;
}
if (*itr == ']')
{
if (!firstCircle)
return out;
}
else
out += *itr;
++itr;
}
return out;
}
std::string kek(std::string strIn)
{
std::cout << strIn << std::endl;
auto itr = strIn.begin();
return decode(strIn, itr, true);
}
void compare(std::string expected, std::string out)
{
if (expected == out)
std::cout << "ok";
else
std::cout << "not ok. expected: " << expected << std::endl
<< " out: " << out;
std::cout << std::endl;
}
int main(int argc, char* argv[])
{
std::string strIn, strOut;
strIn = "3[a2[c]]";
strOut = "accaccacc";
// std::cout << kek(strIn) << std::endl;
compare(strOut, kek(strIn));
strIn = "c2[a]3[b]c";
strOut = "caabbbc";
// std::cout << kek(strIn) << std::endl;
compare(strOut, kek(strIn));
strIn = "c2[a3[b]]c";
strOut = "cabbbabbbc";
// std::cout << kek(strIn) << std::endl;
compare(strOut, kek(strIn));
strIn = "231[ab]";
strOut = "ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab";
// std::cout << kek(strIn) << std::endl;
compare(strOut, kek(strIn));
strIn = "3[b15[a]]";
strOut = "baaaaaaaaaaaaaaabaaaaaaaaaaaaaaabaaaaaaaaaaaaaaa";
// std::cout << kek(strIn) << std::endl;
compare(strOut, kek(strIn));
return 0;
}