fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <string>
  5. #include <algorithm>
  6.  
  7. // Liste der bekannten Substrings
  8. const std::map<int, std::vector<std::string>> mTeilstrings = {
  9. {1, {"[8A]", "[UKE]"}},
  10. {2, {"[Dings da]", "[DingsBums]"}},
  11. {3, {"[GF]", "[MOD]", "[MOD3]", "[MOD6]"}},
  12. {4, {"[Weiss]", "[Rot]", "[Orange-Blau]"}}
  13. };
  14.  
  15.  
  16. auto parse_line(std::string line,
  17. const std::map<int, std::vector<std::string>> &substring_groups)
  18. {
  19. std::vector<std::pair<std::string, int>> result;
  20. for (auto const& kv : substring_groups)
  21. {
  22. for (auto const &substring: kv.second)
  23. {
  24. std::string::size_type pos = 0;
  25. while ((pos = line.find(substring, pos)) != std::string::npos)
  26. {
  27. result.push_back(std::make_pair(substring, kv.first));
  28. pos += substring.length();
  29. }
  30. }
  31. }
  32. return result;
  33. }
  34.  
  35. std::string reconstitute_line(std::vector<std::pair<std::string, int>> const& substring_pairs)
  36. {
  37. std::string result;
  38. int last_group;
  39. if (not substring_pairs.empty())
  40. {
  41. last_group = substring_pairs[0].second;
  42. result = substring_pairs[0].first;
  43. }
  44. for (std::size_t i = 1; i < substring_pairs.size(); ++i)
  45. {
  46. int current_group = substring_pairs[i].second;
  47. if (current_group == last_group)
  48. return "Zeile enthält illegale Doppelungen";
  49. result += substring_pairs[i].first;
  50. }
  51. return result;
  52. }
  53.  
  54. int main()
  55. {
  56. for(std::string line; std::getline(std::cin, line);)
  57. {
  58. auto substring_pairs = parse_line(line, mTeilstrings);
  59. std::sort(substring_pairs.begin(), substring_pairs.end(),
  60. [](auto left_pair, auto right_pair){return left_pair.second > right_pair.second;});
  61. std::string sorted_line = reconstitute_line(substring_pairs);
  62. std::cout << "Zeile \"" << line << "\" wird sortiert zu \"" << sorted_line << "\"\n";
  63. }
  64. }
Success #stdin #stdout 0.01s 5300KB
stdin
[8A][Dings da][Orange-Blau]
[MOD][Weiss][UKE]
[GF][MOD3][Dings da]
[MOD][Black][UKE]
[GF][MOD3][Dings da][GF][MOD3][Dings da]
stdout
Zeile "[8A][Dings da][Orange-Blau]" wird sortiert zu "[Orange-Blau][Dings da][8A]"
Zeile "[MOD][Weiss][UKE]" wird sortiert zu "[Weiss][MOD][UKE]"
Zeile "[GF][MOD3][Dings da]" wird sortiert zu "Zeile enthält illegale Doppelungen"
Zeile "[MOD][Black][UKE]" wird sortiert zu "[MOD][UKE]"
Zeile "[GF][MOD3][Dings da][GF][MOD3][Dings da]" wird sortiert zu "Zeile enthält illegale Doppelungen"