Skip to content

Commit

Permalink
Add CaesarCipher task solution
Browse files Browse the repository at this point in the history
  • Loading branch information
andrei-punko committed Dec 26, 2024
1 parent 62511e6 commit 71a92d1
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 0 deletions.
78 changes: 78 additions & 0 deletions src/main/java/by/andd3dfx/string/CaesarCipher.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package by.andd3dfx.string;

import java.util.Arrays;
import java.util.stream.Collectors;

/**
* <pre>
* Расшифровка методом Цезаря
*
* Вы разрабатываете программу для расшифровки текстовых сообщений, зашифрованных методом Цезаря.
* Этот метод подразумевает сдвиг каждой буквы текста на фиксированное количество позиций в алфавите.
* Например, при сдвиге на 3 позиции буква А становится Г, а Я становится В. Соответственно, при расшифровке
* нужно двигаться в обратном порядке.
* Ваша задача — написать функцию, которая принимает на вход зашифрованную по методу Цезаря строку текста и
* целое число (сдвиг), и возвращает расшифрованную версию. Алфавит уже задан в прекоде.
*
* Формат ввода:
* Входные данные состоят из двух строк: первая строка содержит произвольный зашифрованный текст
* (только строчные буквы русского алфавита и пробелы), вторая строка содержит целое число — величину сдвига (1 ≤ x ≤ 32).
* Формат вывода
* Выходные данные должны состоять из одной строки, содержащей расшифрованный текст. Пробел расшифровывать не нужно.
*
* Пример 1:
* Входные данные:
* бвгдеё
* 1
*
* Выходные данные:
* абвгде
*
* Пример 2:
* Входные данные:
* дщх ёзтхсх счжшфхл
* 7
*
* Выходные данные:
* это яблоко красное
* </pre>
*/
public class CaesarCipher {

// Русский алфавит
private static final String ALPHABET = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";

public String encode(String text, int shift) {
var words = text.split(" ");
return Arrays.stream(words)
.map(word -> encodeWord(word, shift))
.collect(Collectors.joining(" "));
}

private String encodeWord(String text, int shift) {
var chars = text.toCharArray();
for (var i = 0; i < chars.length; i++) {
var targetIndex = ALPHABET.indexOf(chars[i]) + shift;
targetIndex %= ALPHABET.length();
chars[i] = ALPHABET.charAt(targetIndex);
}
return new String(chars);
}

public String decode(String encryptedText, int shift) {
var words = encryptedText.split(" ");
return Arrays.stream(words)
.map(word -> decodeWord(word, shift))
.collect(Collectors.joining(" "));
}

private String decodeWord(String encryptedText, int shift) {
var chars = encryptedText.toCharArray();
for (var i = 0; i < chars.length; i++) {
var targetIndex = ALPHABET.indexOf(chars[i]) - shift + ALPHABET.length();
targetIndex %= ALPHABET.length();
chars[i] = ALPHABET.charAt(targetIndex);
}
return new String(chars);
}
}
28 changes: 28 additions & 0 deletions src/test/java/by/andd3dfx/string/CaesarCipherTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package by.andd3dfx.string;

import org.junit.Before;
import org.junit.Test;

import static org.assertj.core.api.Assertions.assertThat;

public class CaesarCipherTest {

private CaesarCipher caesarCipher;

@Before
public void setUp() throws Exception {
caesarCipher = new CaesarCipher();
}

@Test
public void encode() {
assertThat(caesarCipher.encode("абвгде", 1)).isEqualTo("бвгдеё");
assertThat(caesarCipher.encode("это яблоко красное", 7)).isEqualTo("дщх ёзтхсх счжшфхл");
}

@Test
public void decode() {
assertThat(caesarCipher.decode("бвгдеё", 1)).isEqualTo("абвгде");
assertThat(caesarCipher.decode("дщх ёзтхсх счжшфхл", 7)).isEqualTo("это яблоко красное");
}
}

0 comments on commit 71a92d1

Please sign in to comment.