# Weight for weight [5 kyu]
[Weight for weight](https://www.codewars.com/kata/55c6126177c9441a570000cc)
5 kyu
## Solution
```cpp=
/**
*** Author: R-CO
*** E-Mail: daniel1820kobe@gmail.com
*** Date: 2020-08-06
**/
#include <cstdlib>
#include <iostream>
using std::cout;
using std::endl;
#include <regex>
#include <string>
#include <vector>
struct TestCaseStruct {
std::string input;
std::string expected_output;
};
struct Weight {
int transformed_weight;
std::string original_weight;
};
class WeightSort {
public:
static std::string orderWeight(const std::string &strng) {
std::string output;
std::vector<Weight> weight_vector;
const std::regex whitespace_re("\\s+");
std::sregex_token_iterator token_itor(strng.begin(), strng.end(),
whitespace_re, -1);
const std::sregex_token_iterator end;
while (token_itor != end) {
Weight weight;
weight.original_weight = *token_itor++;
weight.transformed_weight = SumOfDigits(weight.original_weight);
weight_vector.push_back(weight);
}
auto CompareOriginalWeight = [](const Weight &v1, const Weight &v2) {
return v1.original_weight < v2.original_weight;
};
std::stable_sort(weight_vector.begin(), weight_vector.end(),
[](const Weight &v1, const Weight &v2) -> bool {
return v1.original_weight < v2.original_weight;
});
std::stable_sort(weight_vector.begin(), weight_vector.end(),
[](const Weight &v1, const Weight &v2) -> bool {
return v1.transformed_weight < v2.transformed_weight;
});
auto itor = weight_vector.begin();
if (itor != weight_vector.end()) {
output += itor->original_weight;
++itor;
}
while (itor != weight_vector.end()) {
output += " " + itor->original_weight;
++itor;
}
return output;
}
private:
static std::vector<std::string> splitTokens(const std::string &strng) {
std::vector<std::string> tokens;
const std::regex whitespace_re("\\s+");
std::sregex_token_iterator token_itor(strng.begin(), strng.end(),
whitespace_re, -1);
const std::sregex_token_iterator end;
while (token_itor != end) {
tokens.push_back(*token_itor++);
}
return tokens;
}
static int SumOfDigits(const std::string &weight) {
int sum = 0;
for (const auto c : weight) {
sum += (c - '0');
}
return sum;
}
};
int main(int argc, char *argv[]) {
/*
It(Fixed_Tests)
{
dotest("103 123 4444 99 2000", "2000 103 123 4444 99");
dotest("2000 10003 1234000 44444444 9999 11 11 22 123", "11 11 2000 10003
22 123 1234000 44444444 9999"); dotest("", ""); dotest("103 123 4444 99 2000
", "2000 103 123 4444 99");
}
*/
TestCaseStruct test_cases[] = {
{"103 123 4444 99 2000", "2000 103 123 4444 99"},
{"2000 10003 1234000 44444444 9999 11 11 22 123",
"11 11 2000 10003 22 123 1234000 44444444 9999"},
{"", ""},
{"103 123 4444 99 2000 ", "2000 103 123 4444 99"}};
WeightSort solution;
for (const auto &test_case : test_cases) {
if (solution.orderWeight(test_case.input) == test_case.expected_output) {
cout << "test case \"" << test_case.input << "\" is pass." << std::endl;
} else {
cout << "test case \"" << test_case.input << "\" is fail." << std::endl;
}
}
return EXIT_SUCCESS;
}
```
## Result

###### tags: `CodeWars` `C++`