1520:Scramble Sort

keyword

ソート 標準入力 区切り文字 C++

概要

文字列と数の混合の配列が与えられる。文字列と数の位置関係はそのままに文字列と数をそれぞれソートする問題。数値が出現した番号を覚えておけばソートするだけ。入力が,で区切られるので区切り文字を使うとちょっと楽だけどsubstrで済ませた。そのせいかコードが冗長になっているので何とかしたい。

bool isDigit(string s){
    if(s[0]=='-') return isDigit(s.substr(1));
    EACH(s,it)if( '0'> *it || '9' < *it ) return false;
    return true;
}

string toLower(string s){
    int i;
    REP(i,SZ(s))if('A'<=s[i] && s[i]<='Z') s[i] = s[i] - 'A' + 'a';
    return s;
}

int main(){
    vector<bool> isDig;
    vector<int> ns;
    vector< pair<string, string> > ss;
    string s;
    int nc, sc, i;
    while(1){
        ns.clear();
        ss.clear();
        isDig.clear();
        nc = 0;
        sc = 0;
        while(1){
            cin >> s;
            if(s==".") break;
            if(isDigit(s.substr(0,SZ(s)-1))){
                isDig.PB(true);
                ns.PB(atoi(s.substr(0,SZ(s)-1).c_str()));
            }
            else{
                isDig.PB(false);
                ss.PB(MP(toLower(s.substr(0,SZ(s)-1)), s.substr(0,SZ(s)-1)));
            }
            if(*s.rbegin() == '.')break;
        }
        if(isDig.empty()) break;
        sort(ALL(ns));
        sort(ALL(ss));
        REP(i,SZ(isDig)){
            if(isDig[i]) printf("%d",ns[nc++]);
            else printf("%s",ss[sc++].second.c_str());
            if(i==SZ(isDig)-1) printf(".\n");
            else printf(", ");
        }
    }
    return 0;
}