RosettaCodeData/Task/State-name-puzzle/C++/state-name-puzzle.cpp

100 lines
2.8 KiB
C++
Raw Permalink Normal View History

2015-11-18 06:14:39 +00:00
#include <algorithm>
#include <iostream>
2016-12-05 22:15:40 +01:00
#include <string>
#include <array>
#include <vector>
2015-11-18 06:14:39 +00:00
2016-12-05 22:15:40 +01:00
template<typename T>
T unique(T&& src)
2015-11-18 06:14:39 +00:00
{
2016-12-05 22:15:40 +01:00
T retval(std::move(src));
std::sort(retval.begin(), retval.end(), std::less<typename T::value_type>());
retval.erase(std::unique(retval.begin(), retval.end()), retval.end());
return retval;
2015-11-18 06:14:39 +00:00
}
#define USE_FAKES 1
2016-12-05 22:15:40 +01:00
auto states = unique(std::vector<std::string>({
2015-11-18 06:14:39 +00:00
#if USE_FAKES
2016-12-05 22:15:40 +01:00
"Slender Dragon", "Abalamara",
2015-11-18 06:14:39 +00:00
#endif
2016-12-05 22:15:40 +01:00
"Alabama", "Alaska", "Arizona", "Arkansas",
"California", "Colorado", "Connecticut",
"Delaware",
"Florida", "Georgia", "Hawaii",
"Idaho", "Illinois", "Indiana", "Iowa",
"Kansas", "Kentucky", "Louisiana",
"Maine", "Maryland", "Massachusetts", "Michigan",
"Minnesota", "Mississippi", "Missouri", "Montana",
"Nebraska", "Nevada", "New Hampshire", "New Jersey",
"New Mexico", "New York", "North Carolina", "North Dakota",
"Ohio", "Oklahoma", "Oregon",
"Pennsylvania", "Rhode Island",
"South Carolina", "South Dakota", "Tennessee", "Texas",
"Utah", "Vermont", "Virginia",
"Washington", "West Virginia", "Wisconsin", "Wyoming"
2015-11-18 06:14:39 +00:00
}));
2016-12-05 22:15:40 +01:00
struct counted_pair
2015-11-18 06:14:39 +00:00
{
2016-12-05 22:15:40 +01:00
std::string name;
std::array<int, 26> count{};
2015-11-18 06:14:39 +00:00
2016-12-05 22:15:40 +01:00
void count_characters(const std::string& s)
{
for (auto&& c : s) {
if (c >= 'a' && c <= 'z') count[c - 'a']++;
if (c >= 'A' && c <= 'Z') count[c - 'A']++;
}
}
2015-11-18 06:14:39 +00:00
2016-12-05 22:15:40 +01:00
counted_pair(const std::string& s1, const std::string& s2)
: name(s1 + " + " + s2)
{
count_characters(s1);
count_characters(s2);
}
2015-11-18 06:14:39 +00:00
};
2016-12-05 22:15:40 +01:00
bool operator<(const counted_pair& lhs, const counted_pair& rhs)
2015-11-18 06:14:39 +00:00
{
2016-12-05 22:15:40 +01:00
auto lhs_size = lhs.name.size();
auto rhs_size = rhs.name.size();
return lhs_size == rhs_size
? std::lexicographical_compare(lhs.count.begin(),
lhs.count.end(),
rhs.count.begin(),
rhs.count.end())
: lhs_size < rhs_size;
2015-11-18 06:14:39 +00:00
}
2016-12-05 22:15:40 +01:00
bool operator==(const counted_pair& lhs, const counted_pair& rhs)
2015-11-18 06:14:39 +00:00
{
2016-12-05 22:15:40 +01:00
return lhs.name.size() == rhs.name.size() && lhs.count == rhs.count;
2015-11-18 06:14:39 +00:00
}
2016-12-05 22:15:40 +01:00
int main()
2015-11-18 06:14:39 +00:00
{
2016-12-05 22:15:40 +01:00
const int n_states = states.size();
2015-11-18 06:14:39 +00:00
2016-12-05 22:15:40 +01:00
std::vector<counted_pair> pairs;
for (int i = 0; i < n_states; i++) {
for (int j = 0; j < i; j++) {
pairs.emplace_back(counted_pair(states[i], states[j]));
}
}
std::sort(pairs.begin(), pairs.end());
2015-11-18 06:14:39 +00:00
2016-12-05 22:15:40 +01:00
auto start = pairs.begin();
while (true) {
auto match = std::adjacent_find(start, pairs.end());
if (match == pairs.end()) {
break;
}
auto next = match + 1;
std::cout << match->name << " => " << next->name << "\n";
start = next;
}
2015-11-18 06:14:39 +00:00
}