File tree Expand file tree Collapse file tree 3 files changed +90
-0
lines changed Expand file tree Collapse file tree 3 files changed +90
-0
lines changed Original file line number Diff line number Diff line change 1+ #ifndef CPP_KATAS_SCRAMBLE_H
2+ #define CPP_KATAS_SCRAMBLE_H
3+
4+ #include < string>
5+
6+ bool scramble (const std::string& s1, const std::string& s2);
7+
8+ #endif // CPP_KATAS_SCRAMBLE_H
Original file line number Diff line number Diff line change 1+ #include < string>
2+ #include < unordered_map>
3+ #include < algorithm>
4+
5+ /*
6+ * https://www.codewars.com/kata/55c04b4cc56a697bb0000048/train/cpp
7+ */
8+
9+ class Scramblies {
10+ private:
11+ const std::unordered_map<char , int > _counts;
12+
13+ explicit Scramblies (std::unordered_map<char , int > counts) : _counts(std::move(counts)) {}
14+
15+ public:
16+ [[nodiscard]] Scramblies increaseAll (const std::string &s) const ;
17+
18+ [[nodiscard]] Scramblies decreaseAll (const std::string &s) const ;
19+
20+ [[nodiscard]] bool allNonNegative () const ;
21+
22+ static Scramblies empty () {
23+ return Scramblies (std::unordered_map<char , int >(0 ));
24+ }
25+ };
26+
27+ bool scramble (const std::string &s1, const std::string &s2) {
28+ return Scramblies::empty ()
29+ .increaseAll (s1)
30+ .decreaseAll (s2)
31+ .allNonNegative ();
32+ }
33+
34+ Scramblies Scramblies::increaseAll (const std::string &s) const {
35+ std::unordered_map<char , int > counts = this ->_counts ;
36+
37+ for (const char c: s) {
38+ int count = counts[c];
39+ counts[c] = count + 1 ;
40+ }
41+
42+ return Scramblies (counts);
43+ }
44+
45+ Scramblies Scramblies::decreaseAll (const std::string &s) const {
46+ std::unordered_map<char , int > counts = this ->_counts ;
47+
48+ for (const char c: s) {
49+ int count = counts[c];
50+ counts[c] = count - 1 ;
51+ }
52+
53+ return Scramblies (counts);
54+ }
55+
56+ bool Scramblies::allNonNegative () const {
57+ return std::all_of (
58+ this ->_counts .begin (),
59+ this ->_counts .end (),
60+ [&](const std::pair<const char , int > &item) {
61+ return item.second >= 0 ;
62+ });
63+ }
Original file line number Diff line number Diff line change 1+ #include < igloo/igloo_alt.h>
2+ #include " scramblies/scramble.h"
3+
4+ using namespace igloo ;
5+
6+ Describe (Scramble) {
7+ It (BasicTests) {
8+ Assert::That (scramble (" rkqodlw" , " world" ), Equals (true ));
9+ Assert::That (scramble (" cedewaraaossoqqyt" , " codewars" ), Equals (true ));
10+ Assert::That (scramble (" katas" , " steak" ), Equals (false ));
11+ Assert::That (scramble (" scriptjavx" , " javascript" ), Equals (false ));
12+ Assert::That (scramble (" scriptingjava" , " javascript" ), Equals (true ));
13+ Assert::That (scramble (" scriptsjava" , " javascript" ), Equals (true ));
14+ Assert::That (scramble (" javscripts" , " javascript" ), Equals (false ));
15+ Assert::That (scramble (" aabbcamaomsccdd" , " commas" ), Equals (true ));
16+ Assert::That (scramble (" commas" , " commas" ), Equals (true ));
17+ Assert::That (scramble (" sammoc" , " commas" ), Equals (true ));
18+ }
19+ };
You can’t perform that action at this time.
0 commit comments