Skip to content

Commit 932d6ee

Browse files
committed
Add algorithms/strings/caesar_cipher
Signed-off-by: André B. M. Gomes <bmg.andre@gmail.com>
1 parent 75ea00b commit 932d6ee

File tree

6 files changed

+120
-0
lines changed

6 files changed

+120
-0
lines changed

hackerrank-cpp.kdev4

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[Project]
2+
CreatedFrom=CMakeLists.txt
3+
Manager=KDevCMakeManager
4+
Name=hackerrank-cpp

src/algorithms/strings/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
project_add_all_folders()
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
hackerrank_challenge_solution(caesar_cipher.cpp caesar_cipher.h)
2+
hackerrank_challenge_test(caesar_cipher_test.cpp)
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#include "caesar_cipher.h"
2+
#include <iostream>
3+
#include <string>
4+
#include <sstream>
5+
#include <algorithm>
6+
7+
using hackerrank::bmgandre::algorithms::strings::caesar_cipher;
8+
9+
std::string caesar_cipher::solve(std::string input, unsigned char rotate)
10+
{
11+
std::stringstream str_stream;
12+
13+
auto rotate_letter = [rotate](unsigned char letter, unsigned char min, unsigned char max)
14+
{
15+
auto rotate_key = rotate % (max - min + 1);
16+
if (letter + rotate_key > max)
17+
{
18+
return (min - 1 + ((letter + rotate_key) % max));
19+
}
20+
else
21+
{
22+
return (letter + rotate_key);
23+
}
24+
};
25+
26+
for (auto const letter : input)
27+
{
28+
if (letter >= 'a' && letter <= 'z')
29+
{
30+
str_stream << static_cast<char>(rotate_letter(letter, 'a', 'z'));
31+
}
32+
else if (letter >= 'A' && letter <= 'Z')
33+
{
34+
str_stream << static_cast<char>(rotate_letter(letter, 'A', 'Z'));
35+
}
36+
else
37+
{
38+
str_stream << letter;
39+
}
40+
}
41+
42+
return str_stream.str();
43+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#ifndef CAESAR_CIPHER_H
2+
#define CAESAR_CIPHER_H
3+
4+
#include <string>
5+
6+
namespace hackerrank {
7+
namespace bmgandre {
8+
namespace algorithms {
9+
namespace strings {
10+
11+
class caesar_cipher
12+
{
13+
public:
14+
static std::string solve(std::string input, unsigned char rotate_key);
15+
};
16+
17+
} // namespace algorithms
18+
} // namespace strings
19+
} // namespace bmgandre
20+
} // namespace hackerrank
21+
22+
#endif // CAESAR_CIPHER_H
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include <hackerrank_gtest.h>
2+
#include "caesar_cipher.h"
3+
#include <string>
4+
5+
namespace hackerrank {
6+
namespace bmgandre {
7+
namespace algorithms {
8+
namespace strings {
9+
10+
using caesar_cipher_test = hackerrank::bmgandre::tests::hackerrank_gtest;
11+
12+
TEST_F(caesar_cipher_test, test_case_alphabet) {
13+
auto encripted_string = caesar_cipher::solve("abcdefghijklmnopqrstuvwxyz", 2);
14+
15+
ASSERT_EQ(encripted_string, "cdefghijklmnopqrstuvwxyzab");
16+
}
17+
18+
TEST_F(caesar_cipher_test, test_case_symbols) {
19+
using namespace std::string_literals;
20+
auto input = "1234567890-_=+'`'[]{}~^/;?.><,\\|\""s;
21+
22+
auto encripted_string = caesar_cipher::solve(input, 2);
23+
24+
ASSERT_EQ(encripted_string, input);
25+
}
26+
27+
TEST_F(caesar_cipher_test, test_case_2) {
28+
auto encripted_string = caesar_cipher::solve("www.abc.xy", 87);
29+
30+
ASSERT_EQ(encripted_string, "fff.jkl.gh");
31+
}
32+
33+
TEST_F(caesar_cipher_test, test_case_5) {
34+
auto encripted_string = caesar_cipher::solve("middle-Outz", 2);
35+
36+
ASSERT_EQ(encripted_string, "okffng-Qwvb");
37+
}
38+
39+
TEST_F(caesar_cipher_test, test_case_11) {
40+
auto encripted_string = caesar_cipher::solve("Always-Look-on-the-Bright-Side-of-Life", 5);
41+
42+
ASSERT_EQ(encripted_string, "Fqbfdx-Qttp-ts-ymj-Gwnlmy-Xnij-tk-Qnkj");
43+
}
44+
45+
} // namespace algorithms
46+
} // namespace strings
47+
} // namespace bmgandre
48+
} // namespace hackerrank

0 commit comments

Comments
 (0)