#include <iostream>
#include <string>
#include <cctype>
#include <vector>
typedef std::vector<std::string> DType;
DType MakeVector() {
return { "snake_case","ODAI00_99_TEST","x_0_x","UpperCamelCase" };
}
int SelectChar(int Ch) {
if (std::isdigit(Ch)) {
return 1;//number
}
if (std::isalpha(Ch)) {//alphabet
return 2;//upper
}
return 0;//graph
}
DType Split(const std::string& D){
std::string S;
DType R;
int St = SelectChar(D.front());
bool F = true;
for(std::size_t i=0;i<D.size();i++){
int V = SelectChar(D[i]);
if (St == V) {
if (F) {
S += std::toupper(D[i]);
F = false;
}
else {
S += std::tolower(D[i]);
}
}
else {
St = V;
R.push_back(S);
S.clear();
i--;
F = true;
}
}
if (S.size()) R.push_back(S);
return R;
}
std::string MakeHoge(const std::string& S) {
DType D = Split(S);
std::string R;
for (std::size_t i = 0; i < D.size(); i++) {
if (D[i][0] == '_') {
if (static_cast<long long int>(i) - 1 >= 0) {
if (!std::isdigit(D[i - 1].back())) { continue; }
if (static_cast<long long int>(i) + 1 < D.size() && std::isdigit(D[i + 1].front())) { R += '_'; }
}
continue;
}
R += D[i];
}
return R;
}
int main() {
DType D = MakeVector();
for (auto& o : D) {
auto R = MakeHoge(o);
std::cout << o << " => " << R << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y2N0eXBlPgojaW5jbHVkZSA8dmVjdG9yPgoKdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRFR5cGU7CgpEVHlwZSBNYWtlVmVjdG9yKCkgewoJcmV0dXJuIHsgInNuYWtlX2Nhc2UiLCJPREFJMDBfOTlfVEVTVCIsInhfMF94IiwiVXBwZXJDYW1lbENhc2UiIH07Cn0KaW50IFNlbGVjdENoYXIoaW50IENoKSB7CglpZiAoc3RkOjppc2RpZ2l0KENoKSkgewoJCXJldHVybiAxOy8vbnVtYmVyCgl9CglpZiAoc3RkOjppc2FscGhhKENoKSkgey8vYWxwaGFiZXQKCQlyZXR1cm4gMjsvL3VwcGVyCgl9CgoJcmV0dXJuIDA7Ly9ncmFwaAp9CkRUeXBlIFNwbGl0KGNvbnN0IHN0ZDo6c3RyaW5nJiBEKXsKCXN0ZDo6c3RyaW5nIFM7CglEVHlwZSBSOwoJaW50IFN0ID0gU2VsZWN0Q2hhcihELmZyb250KCkpOwoJYm9vbCBGID0gdHJ1ZTsKCWZvcihzdGQ6OnNpemVfdCBpPTA7aTxELnNpemUoKTtpKyspewoJCWludCBWID0gU2VsZWN0Q2hhcihEW2ldKTsKCQlpZiAoU3QgPT0gVikgewoJCQlpZiAoRikgewoJCQkJUyArPSBzdGQ6OnRvdXBwZXIoRFtpXSk7CgkJCQlGID0gZmFsc2U7CgkJCX0KCQkJZWxzZSB7CgkJCQlTICs9IHN0ZDo6dG9sb3dlcihEW2ldKTsJCgoJCQl9CgkJfQoJCWVsc2UgewoJCQlTdCA9IFY7CgkJCVIucHVzaF9iYWNrKFMpOwoJCQlTLmNsZWFyKCk7CgkJCWktLTsKCQkJRiA9IHRydWU7CgkJfQoJfQoJaWYgKFMuc2l6ZSgpKSBSLnB1c2hfYmFjayhTKTsKCXJldHVybiBSOwp9CgpzdGQ6OnN0cmluZyBNYWtlSG9nZShjb25zdCBzdGQ6OnN0cmluZyYgUykgewoJRFR5cGUgRCA9IFNwbGl0KFMpOwoJc3RkOjpzdHJpbmcgUjsKCglmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgRC5zaXplKCk7IGkrKykgewoJCWlmIChEW2ldWzBdID09ICdfJykgewoJCQlpZiAoc3RhdGljX2Nhc3Q8bG9uZyBsb25nIGludD4oaSkgLSAxID49IDApIHsKCQkJCWlmICghc3RkOjppc2RpZ2l0KERbaSAtIDFdLmJhY2soKSkpIHsgY29udGludWU7IH0KCQkJCWlmIChzdGF0aWNfY2FzdDxsb25nIGxvbmcgaW50PihpKSArIDEgPCBELnNpemUoKSAmJiBzdGQ6OmlzZGlnaXQoRFtpICsgMV0uZnJvbnQoKSkpIHsgUiArPSAnXyc7IH0JCgkJCX0KCQkJY29udGludWU7CgkJfQkKCQlSICs9IERbaV07Cgl9CglyZXR1cm4gUjsKfQppbnQgbWFpbigpIHsKCURUeXBlIEQgPSBNYWtlVmVjdG9yKCk7CgkKCWZvciAoYXV0byYgbyA6IEQpIHsKCQlhdXRvIFIgPSBNYWtlSG9nZShvKTsKCQlzdGQ6OmNvdXQgPDwgbyA8PCAiID0+ICIgPDwgUiA8PCBzdGQ6OmVuZGw7Cgl9CgoJcmV0dXJuIDA7Cn0=