PKU 1520 Scramble Sort

  • 標準ライブラリと関数オブジェクトの使い方の練習問題として調度良いと思う
  • データサイズの記述がないが、適当にやっても大丈夫だと思った
const string toLower(const string& s) {
	string result;
	for (string::const_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it) {
		result += tolower(*it);
	}
	return result;
}

bool compair(const string& lh, const string& rh) {
	return toLower(lh) > toLower(rh);
}

int main() {
	string line;
	while (getline(cin, line) && line != ".") {
		istringstream iss(line);
		vector<bool> isNumber;
		string word;
		vector<int> numbers;
		vector<string> words;
		while (iss >> word) {
			word.erase(word.size() - 1);

			int value;
			if (istringstream(word) >> value) {
				numbers.push_back(value);
				isNumber.push_back(true);

			} else {
				words.push_back(word);
				isNumber.push_back(false);
			}
		}

		sort(numbers.begin(), numbers.end(), greater<int>());
		sort(words.begin(), words.end(), compair);

		for (vector<bool>::iterator it = isNumber.begin(), itEnd = isNumber.end(); it != itEnd; ++it) {
			if (it != isNumber.begin()) {
				cout << ", ";
			}

			if (*it) {
				cout << numbers.back();
				numbers.pop_back();

			} else {
				cout << words.back();
				words.pop_back();
			}
		}

		cout << "." << endl;
	}
}