Skip to content

Commit c42f240

Browse files
authored
Solve 'Scramblies' kata (#3)
1 parent f0279cd commit c42f240

File tree

3 files changed

+90
-0
lines changed

3 files changed

+90
-0
lines changed

include/scramblies/scramble.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
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

src/scramblies/scramble.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
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+
}

test/scramblies/scramble_test.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
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+
};

0 commit comments

Comments
 (0)