#include <vector>
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int ConvertString2Int(const string& str)
{
stringstream ss(str);
int x;
if (! (ss >> x))
{
cerr << "Error converting " << str << " to integer" << endl;
abort();
}
return x;
}
vector<string> SplitStringToArray(const string& str, char splitter)
{
vector<string> tokens;
stringstream ss(str);
string temp;
while (getline(ss, temp, splitter)) // split into new "lines" based on character
{
tokens.push_back(temp);
}
return tokens;
}
vector<int> ParseData(const string& data)
{
vector<string> tokens = SplitStringToArray(data, ',');
vector<int> result;
for (vector<string>::const_iterator it = tokens.begin(), end_it = tokens.end(); it != end_it; ++it)
{
const string& token = *it;
vector<string> range = SplitStringToArray(token, '-');
if (range.size() == 1)
{
result.push_back(ConvertString2Int(range[0]));
}
else if (range.size() == 2)
{
int start = ConvertString2Int(range[0]);
int stop = ConvertString2Int(range[1]);
for (int i = start; i <= stop; i++)
{
result.push_back(i);
}
}
else
{
cerr << "Error parsing token " << token << endl;
abort();
}
}
return result;
}
int main()
{
vector<int> result = ParseData("1-5,10,12,15-16,25-35,67,69,99-105");
for (vector<int>::const_iterator it = result.begin(), end_it = result.end(); it != end_it; ++it)
{
cout << *it << " ";
}
cout << endl;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxpb3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBDb252ZXJ0U3RyaW5nMkludChjb25zdCBzdHJpbmcmIHN0cikKewoJc3RyaW5nc3RyZWFtIHNzKHN0cik7CglpbnQgeDsKCWlmICghIChzcyA+PiB4KSkKCXsKCQljZXJyIDw8ICJFcnJvciBjb252ZXJ0aW5nICIgPDwgc3RyIDw8ICIgdG8gaW50ZWdlciIgPDwgZW5kbDsKCQlhYm9ydCgpOwoJfQoJcmV0dXJuIHg7Cn0KCnZlY3RvcjxzdHJpbmc+IFNwbGl0U3RyaW5nVG9BcnJheShjb25zdCBzdHJpbmcmIHN0ciwgY2hhciBzcGxpdHRlcikKewoJdmVjdG9yPHN0cmluZz4gdG9rZW5zOwoJc3RyaW5nc3RyZWFtIHNzKHN0cik7CglzdHJpbmcgdGVtcDsKCXdoaWxlIChnZXRsaW5lKHNzLCB0ZW1wLCBzcGxpdHRlcikpIC8vIHNwbGl0IGludG8gbmV3ICJsaW5lcyIgYmFzZWQgb24gY2hhcmFjdGVyCgl7CgkJdG9rZW5zLnB1c2hfYmFjayh0ZW1wKTsKCX0KCXJldHVybiB0b2tlbnM7Cn0KCnZlY3RvcjxpbnQ+IFBhcnNlRGF0YShjb25zdCBzdHJpbmcmIGRhdGEpCnsKCXZlY3RvcjxzdHJpbmc+IHRva2VucyA9IFNwbGl0U3RyaW5nVG9BcnJheShkYXRhLCAnLCcpOwoKCXZlY3RvcjxpbnQ+IHJlc3VsdDsKCWZvciAodmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdG9rZW5zLmJlZ2luKCksIGVuZF9pdCA9IHRva2Vucy5lbmQoKTsgaXQgIT0gZW5kX2l0OyArK2l0KQoJewoJCWNvbnN0IHN0cmluZyYgdG9rZW4gPSAqaXQ7CgkJdmVjdG9yPHN0cmluZz4gcmFuZ2UgPSBTcGxpdFN0cmluZ1RvQXJyYXkodG9rZW4sICctJyk7CgkJaWYgKHJhbmdlLnNpemUoKSA9PSAxKQoJCXsKCQkJcmVzdWx0LnB1c2hfYmFjayhDb252ZXJ0U3RyaW5nMkludChyYW5nZVswXSkpOwoJCX0KCQllbHNlIGlmIChyYW5nZS5zaXplKCkgPT0gMikKCQl7CgkJCWludCBzdGFydCA9IENvbnZlcnRTdHJpbmcySW50KHJhbmdlWzBdKTsKCQkJaW50IHN0b3AgPSBDb252ZXJ0U3RyaW5nMkludChyYW5nZVsxXSk7CgkJCWZvciAoaW50IGkgPSBzdGFydDsgaSA8PSBzdG9wOyBpKyspCgkJCXsKCQkJCXJlc3VsdC5wdXNoX2JhY2soaSk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJY2VyciA8PCAiRXJyb3IgcGFyc2luZyB0b2tlbiAiIDw8IHRva2VuIDw8IGVuZGw7CgkJCWFib3J0KCk7CgkJfQoJfQoJCglyZXR1cm4gcmVzdWx0Owp9CgppbnQgbWFpbigpCnsKCXZlY3RvcjxpbnQ+IHJlc3VsdCA9IFBhcnNlRGF0YSgiMS01LDEwLDEyLDE1LTE2LDI1LTM1LDY3LDY5LDk5LTEwNSIpOwoJZm9yICh2ZWN0b3I8aW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZXN1bHQuYmVnaW4oKSwgZW5kX2l0ID0gcmVzdWx0LmVuZCgpOyBpdCAhPSBlbmRfaXQ7ICsraXQpCgl7CgkJY291dCA8PCAqaXQgPDwgIiAiOwoJfQoJY291dCA8PCBlbmRsOwp9Cgo=