#include #include #include #include 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(*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; }