#include <iostream>
#include <string>
#include <regex.h>
const int MAX_MATCHES(20);
void elements(const std::string &input)
{
regex_t ElementRegEx;
regcomp(&ElementRegEx, "([0-9]+)", REG_EXTENDED);
std::string Elements(input);
regmatch_t ElementMatches[MAX_MATCHES];
while (!regexec(&ElementRegEx, Elements.c_str(), MAX_MATCHES, ElementMatches, 0))
{
const regmatch_t &Match = ElementMatches[0];
if ((Match.rm_so != -1) && (Match.rm_eo != -1))
{
const std::string CurrentElement(Elements.substr(Match.rm_so, Match.rm_eo - Match.rm_so));
std::cout << '\t' << CurrentElement << '\n';
if (Elements.size() > static_cast<size_t>(Match.rm_eo))
Elements = Elements.substr(Match.rm_eo);
else
Elements = "";
}
}
}
void cycles(const std::string &input)
{
regex_t CycleRegEx;
regcomp(&CycleRegEx, "([0-9]+[ ]*,[ ]*)*[0-9]+", REG_EXTENDED);
std::string Cycles(input);
regmatch_t CycleMatches[MAX_MATCHES];
while (!regexec(&CycleRegEx, Cycles.c_str(), MAX_MATCHES, CycleMatches, 0))
{
const regmatch_t &Match = CycleMatches[0];
if ((Match.rm_so != -1) && (Match.rm_eo != -1))
{
const std::string CurrentCycle(Cycles.substr(Match.rm_so, Match.rm_eo - Match.rm_so));
std::cout << CurrentCycle << '\n';
elements(CurrentCycle);
if (Cycles.size() > static_cast<size_t>(Match.rm_eo))
Cycles = Cycles.substr(Match.rm_eo + 1);
else
Cycles = "";
}
}
regfree(&CycleRegEx);
}
int main(int argc, char **argv)
{
std::string input("(1,2,5)(3,4)");
std::cout << "input: " << input << "\n\n";
cycles(input);
return 0;
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgICNpbmNsdWRlIDxzdHJpbmc+CiAgICAgCiAgICAjaW5jbHVkZSA8cmVnZXguaD4KICAgICAKICAgIGNvbnN0IGludCBNQVhfTUFUQ0hFUygyMCk7CiAgICAgCiAgICB2b2lkIGVsZW1lbnRzKGNvbnN0IHN0ZDo6c3RyaW5nICZpbnB1dCkKICAgIHsKICAgICAgICByZWdleF90IEVsZW1lbnRSZWdFeDsKICAgICAgICByZWdjb21wKCZFbGVtZW50UmVnRXgsICIoWzAtOV0rKSIsIFJFR19FWFRFTkRFRCk7CiAgICAgICAgCiAgICAgICAgc3RkOjpzdHJpbmcgRWxlbWVudHMoaW5wdXQpOwogICAgICAgIAogICAgICAgIHJlZ21hdGNoX3QgRWxlbWVudE1hdGNoZXNbTUFYX01BVENIRVNdOwogICAgICAgIHdoaWxlICghcmVnZXhlYygmRWxlbWVudFJlZ0V4LCBFbGVtZW50cy5jX3N0cigpLCBNQVhfTUFUQ0hFUywgRWxlbWVudE1hdGNoZXMsIDApKQogICAgICAgIHsKICAgICAgICAgICAgY29uc3QgcmVnbWF0Y2hfdCAmTWF0Y2ggPSBFbGVtZW50TWF0Y2hlc1swXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICgoTWF0Y2gucm1fc28gIT0gLTEpICYmIChNYXRjaC5ybV9lbyAhPSAtMSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIEN1cnJlbnRFbGVtZW50KEVsZW1lbnRzLnN1YnN0cihNYXRjaC5ybV9zbywgTWF0Y2gucm1fZW8gLSBNYXRjaC5ybV9zbykpOwogICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICdcdCcgPDwgQ3VycmVudEVsZW1lbnQgPDwgJ1xuJzsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKEVsZW1lbnRzLnNpemUoKSA+IHN0YXRpY19jYXN0PHNpemVfdD4oTWF0Y2gucm1fZW8pKQogICAgICAgICAgICAgICAgRWxlbWVudHMgPSBFbGVtZW50cy5zdWJzdHIoTWF0Y2gucm1fZW8pOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgRWxlbWVudHMgPSAiIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICAKICAgIHZvaWQgY3ljbGVzKGNvbnN0IHN0ZDo6c3RyaW5nICZpbnB1dCkKICAgIHsKICAgICAgICByZWdleF90IEN5Y2xlUmVnRXg7CiAgICAgICAgcmVnY29tcCgmQ3ljbGVSZWdFeCwgIihbMC05XStbIF0qLFsgXSopKlswLTldKyIsIFJFR19FWFRFTkRFRCk7CiAgICAgICAgCiAgICAgICAgc3RkOjpzdHJpbmcgQ3ljbGVzKGlucHV0KTsKICAgICAgICAKICAgICAgICByZWdtYXRjaF90IEN5Y2xlTWF0Y2hlc1tNQVhfTUFUQ0hFU107CiAgICAgICAgd2hpbGUgKCFyZWdleGVjKCZDeWNsZVJlZ0V4LCBDeWNsZXMuY19zdHIoKSwgTUFYX01BVENIRVMsIEN5Y2xlTWF0Y2hlcywgMCkpCiAgICAgICAgewogICAgICAgICAgICBjb25zdCByZWdtYXRjaF90ICZNYXRjaCA9IEN5Y2xlTWF0Y2hlc1swXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICgoTWF0Y2gucm1fc28gIT0gLTEpICYmIChNYXRjaC5ybV9lbyAhPSAtMSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIEN1cnJlbnRDeWNsZShDeWNsZXMuc3Vic3RyKE1hdGNoLnJtX3NvLCBNYXRjaC5ybV9lbyAtIE1hdGNoLnJtX3NvKSk7CiAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgQ3VycmVudEN5Y2xlIDw8ICdcbic7CiAgICAgICAgICAgICAgICBlbGVtZW50cyhDdXJyZW50Q3ljbGUpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoQ3ljbGVzLnNpemUoKSA+IHN0YXRpY19jYXN0PHNpemVfdD4oTWF0Y2gucm1fZW8pKQogICAgICAgICAgICAgICAgQ3ljbGVzID0gQ3ljbGVzLnN1YnN0cihNYXRjaC5ybV9lbyArIDEpOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgQ3ljbGVzID0gIiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAKICAgICAgICByZWdmcmVlKCZDeWNsZVJlZ0V4KTsKICAgIH0KICAgICAKICAgIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKICAgIHsKICAgICAgICBzdGQ6OnN0cmluZyBpbnB1dCgiKDEsMiw1KSgzLDQpIik7CiAgICAgICAgCiAgICAgICAgc3RkOjpjb3V0IDw8ICJpbnB1dDogIiA8PCBpbnB1dCA8PCAiXG5cbiI7CiAgICAgICAgCiAgICAgICAgY3ljbGVzKGlucHV0KTsKICAgICAgICByZXR1cm4gMDsKICAgIH0=