From b0cfb6a506c8f23a3fcda3eb076ec86ec578c94a Mon Sep 17 00:00:00 2001 From: Damir Emirzakov Date: Mon, 6 Oct 2025 22:59:35 -0400 Subject: [PATCH 01/17] Start project01 --- src/main/java/com/javarush/emirzakov/Runner.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/com/javarush/emirzakov/Runner.java diff --git a/src/main/java/com/javarush/emirzakov/Runner.java b/src/main/java/com/javarush/emirzakov/Runner.java new file mode 100644 index 0000000..948aa04 --- /dev/null +++ b/src/main/java/com/javarush/emirzakov/Runner.java @@ -0,0 +1,7 @@ +package com.javarush.emirzakov; + +public class Runner { + public static void main(String[] args) { + + } +} From 2ebabc6b7bcfeeea53827b50c3c64619b9704bd2 Mon Sep 17 00:00:00 2001 From: Damir Emirzakov Date: Sat, 11 Oct 2025 16:58:05 -0400 Subject: [PATCH 02/17] ADD Alphabet class --- .../javarush/emirzakov/service/Alphabet.java | 27 +++++++++++++++++++ .../emirzakov/service/CryptoAction.java | 5 ++++ 2 files changed, 32 insertions(+) create mode 100644 src/main/java/com/javarush/emirzakov/service/Alphabet.java create mode 100644 src/main/java/com/javarush/emirzakov/service/CryptoAction.java diff --git a/src/main/java/com/javarush/emirzakov/service/Alphabet.java b/src/main/java/com/javarush/emirzakov/service/Alphabet.java new file mode 100644 index 0000000..8aa82ef --- /dev/null +++ b/src/main/java/com/javarush/emirzakov/service/Alphabet.java @@ -0,0 +1,27 @@ +package com.javarush.emirzakov.service; + +public class Alphabet { + + public static final char[] ALPHABET = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', + 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' '}; + + int getCharIndex(char c) { + for (int i = 0; i < ALPHABET.length; i++) { + if (Character.toLowerCase(ALPHABET[i]) == Character.toLowerCase(c)) { + return i; + } + } + return -1; + } + + char getCharByIndex(int index) { + int i = index % ALPHABET.length; + if (i < 0) i += ALPHABET.length; + return ALPHABET[i]; + } + +} + +//создать объект +// если символа нет в массиве - пропускать +// игнорировать размер букв \ No newline at end of file diff --git a/src/main/java/com/javarush/emirzakov/service/CryptoAction.java b/src/main/java/com/javarush/emirzakov/service/CryptoAction.java new file mode 100644 index 0000000..8b1a324 --- /dev/null +++ b/src/main/java/com/javarush/emirzakov/service/CryptoAction.java @@ -0,0 +1,5 @@ +package com.javarush.emirzakov.service; + +abstract class CryptoAction { + +} From 7994e422bbb4a3f29778e06ff4f58f694bf84899 Mon Sep 17 00:00:00 2001 From: Damir Emirzakov Date: Sat, 11 Oct 2025 17:19:34 -0400 Subject: [PATCH 03/17] ADD abstaract CryptoAction class --- .../com/javarush/emirzakov/service/CryptoAction.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/javarush/emirzakov/service/CryptoAction.java b/src/main/java/com/javarush/emirzakov/service/CryptoAction.java index 8b1a324..8c76b5b 100644 --- a/src/main/java/com/javarush/emirzakov/service/CryptoAction.java +++ b/src/main/java/com/javarush/emirzakov/service/CryptoAction.java @@ -1,5 +1,14 @@ package com.javarush.emirzakov.service; -abstract class CryptoAction { +public abstract class CryptoAction { + protected Alphabet alphabet = new Alphabet(); + + protected char shiftChar(char c, int key) { + int index = alphabet.getCharIndex(c); + if (index == -1) return c; + return alphabet.getCharByIndex(index + key); + } + + public abstract String execute(String text, int key); } From 66ce5c28385cceac02f9613f0c423f188aa687e3 Mon Sep 17 00:00:00 2001 From: Damir Emirzakov Date: Sat, 11 Oct 2025 21:13:47 -0400 Subject: [PATCH 04/17] ADD EncryptAction class --- .../emirzakov/{service => model}/Alphabet.java | 6 +++--- .../javarush/emirzakov/service/CryptoAction.java | 2 ++ .../javarush/emirzakov/service/EncryptAction.java | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) rename src/main/java/com/javarush/emirzakov/{service => model}/Alphabet.java (85%) create mode 100644 src/main/java/com/javarush/emirzakov/service/EncryptAction.java diff --git a/src/main/java/com/javarush/emirzakov/service/Alphabet.java b/src/main/java/com/javarush/emirzakov/model/Alphabet.java similarity index 85% rename from src/main/java/com/javarush/emirzakov/service/Alphabet.java rename to src/main/java/com/javarush/emirzakov/model/Alphabet.java index 8aa82ef..e3a45d4 100644 --- a/src/main/java/com/javarush/emirzakov/service/Alphabet.java +++ b/src/main/java/com/javarush/emirzakov/model/Alphabet.java @@ -1,11 +1,11 @@ -package com.javarush.emirzakov.service; +package com.javarush.emirzakov.model; public class Alphabet { public static final char[] ALPHABET = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' '}; - int getCharIndex(char c) { + public int getCharIndex(char c) { for (int i = 0; i < ALPHABET.length; i++) { if (Character.toLowerCase(ALPHABET[i]) == Character.toLowerCase(c)) { return i; @@ -14,7 +14,7 @@ int getCharIndex(char c) { return -1; } - char getCharByIndex(int index) { + public char getCharByIndex(int index) { int i = index % ALPHABET.length; if (i < 0) i += ALPHABET.length; return ALPHABET[i]; diff --git a/src/main/java/com/javarush/emirzakov/service/CryptoAction.java b/src/main/java/com/javarush/emirzakov/service/CryptoAction.java index 8c76b5b..d5260b5 100644 --- a/src/main/java/com/javarush/emirzakov/service/CryptoAction.java +++ b/src/main/java/com/javarush/emirzakov/service/CryptoAction.java @@ -1,5 +1,7 @@ package com.javarush.emirzakov.service; +import com.javarush.emirzakov.model.Alphabet; + public abstract class CryptoAction { protected Alphabet alphabet = new Alphabet(); diff --git a/src/main/java/com/javarush/emirzakov/service/EncryptAction.java b/src/main/java/com/javarush/emirzakov/service/EncryptAction.java new file mode 100644 index 0000000..a44f64e --- /dev/null +++ b/src/main/java/com/javarush/emirzakov/service/EncryptAction.java @@ -0,0 +1,14 @@ +package com.javarush.emirzakov.service; + +public class EncryptAction extends CryptoAction { + + @Override + public String execute(String text, int key) { + StringBuilder result = new StringBuilder(); + for (int i = 0; i < text.length(); i++) { + char ch = text.charAt(i); + result.append(shiftChar(ch, key)); + } + return result.toString(); + } +} From 921e585a2b6698090b82d685b5523c9428de5220 Mon Sep 17 00:00:00 2001 From: Damir Emirzakov Date: Sat, 11 Oct 2025 21:23:20 -0400 Subject: [PATCH 05/17] ADD DecryptAction class --- .../javarush/emirzakov/service/DecryptAction.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/com/javarush/emirzakov/service/DecryptAction.java diff --git a/src/main/java/com/javarush/emirzakov/service/DecryptAction.java b/src/main/java/com/javarush/emirzakov/service/DecryptAction.java new file mode 100644 index 0000000..6fa112e --- /dev/null +++ b/src/main/java/com/javarush/emirzakov/service/DecryptAction.java @@ -0,0 +1,14 @@ +package com.javarush.emirzakov.service; + +public class DecryptAction extends CryptoAction { + + @Override + public String execute(String text, int key) { + StringBuilder result = new StringBuilder(); + for (int i = 0; i < text.length(); i++) { + char ch = text.charAt(i); + result.append(shiftChar(ch, -key)); + } + return result.toString(); + } +} From 913c7132e53aa612ae1b401306cf8bd56245180a Mon Sep 17 00:00:00 2001 From: Damir Emirzakov Date: Mon, 13 Oct 2025 17:31:47 -0400 Subject: [PATCH 06/17] feat: add FileReaderService class for reading text from file --- .../com/javarush/emirzakov/main/java/FileReaderService.java | 4 ++++ .../java/com/javarush/emirzakov/{ => main/java}/Runner.java | 0 2 files changed, 4 insertions(+) create mode 100644 src/main/java/com/javarush/emirzakov/main/java/FileReaderService.java rename src/main/java/com/javarush/emirzakov/{ => main/java}/Runner.java (100%) diff --git a/src/main/java/com/javarush/emirzakov/main/java/FileReaderService.java b/src/main/java/com/javarush/emirzakov/main/java/FileReaderService.java new file mode 100644 index 0000000..c099991 --- /dev/null +++ b/src/main/java/com/javarush/emirzakov/main/java/FileReaderService.java @@ -0,0 +1,4 @@ +package com.javarush.emirzakov.main.java; + +public class FileReaderService { +} diff --git a/src/main/java/com/javarush/emirzakov/Runner.java b/src/main/java/com/javarush/emirzakov/main/java/Runner.java similarity index 100% rename from src/main/java/com/javarush/emirzakov/Runner.java rename to src/main/java/com/javarush/emirzakov/main/java/Runner.java From 0abdd647ab1d488039b6254ae32e2bca8c07d160 Mon Sep 17 00:00:00 2001 From: Damir Emirzakov Date: Mon, 13 Oct 2025 17:51:48 -0400 Subject: [PATCH 07/17] feat: ADD FileReaderService, Runner --- .../main/java/FileReaderService.java | 13 ++++ .../javarush/emirzakov/main/java/Runner.java | 64 ++++++++++++++++++- .../javarush/emirzakov/model/Alphabet.java | 1 - 3 files changed, 76 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/javarush/emirzakov/main/java/FileReaderService.java b/src/main/java/com/javarush/emirzakov/main/java/FileReaderService.java index c099991..8c631ba 100644 --- a/src/main/java/com/javarush/emirzakov/main/java/FileReaderService.java +++ b/src/main/java/com/javarush/emirzakov/main/java/FileReaderService.java @@ -1,4 +1,17 @@ package com.javarush.emirzakov.main.java; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + public class FileReaderService { + + public String readFromFile(String path) { + try { + return Files.readString(Path.of(path)); + } catch (IOException e) { + System.out.println("Error reading file: " + e.getMessage()); + return ""; + } + } } diff --git a/src/main/java/com/javarush/emirzakov/main/java/Runner.java b/src/main/java/com/javarush/emirzakov/main/java/Runner.java index 948aa04..ec04c16 100644 --- a/src/main/java/com/javarush/emirzakov/main/java/Runner.java +++ b/src/main/java/com/javarush/emirzakov/main/java/Runner.java @@ -1,7 +1,69 @@ -package com.javarush.emirzakov; +package com.javarush.emirzakov.main.java; + + +import com.javarush.emirzakov.service.DecryptAction; +import com.javarush.emirzakov.service.EncryptAction; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Scanner; public class Runner { public static void main(String[] args) { + FileReaderService fileReader = new FileReaderService(); + + try (Scanner scanner = new Scanner(System.in)) { + System.out.println("Enter text directly, or specify a file path: "); + String input = scanner.nextLine(); + + String text; + Path path = Path.of(input); + if (Files.exists(path) && Files.isRegularFile(path)) { + System.out.println("File has been found and read!"); + text = fileReader.readFromFile(input); + } else { + text = input; + System.out.println("Using input text directly"); + } + System.out.println(""" + Choose action: + 1 - Encrypt + 2 - Decrypt + """); + int choice = readInt(scanner, "Enter choice: "); + String message = "Enter key (integer): "; + String result = null; + + switch (choice) { + case 1 -> { + int key = readInt(scanner, message); + EncryptAction encryptAction = new EncryptAction(); + result = encryptAction.execute(text, key); + } + case 2 -> { + int key = readInt(scanner, message); + DecryptAction decryptAction = new DecryptAction(); + result = decryptAction.execute(text, key); + } + default -> System.out.println("Unknown action. Exiting."); + } + if (result != null) { + System.out.println("Result:"); + System.out.println(result); + } + } + } + + private static int readInt(Scanner scanner, String prompt) { + while (true){ + System.out.println(prompt); + String line = scanner.nextLine().trim(); + try{ + return Integer.parseInt(line); + } catch (NumberFormatException e){ + System.out.println("Please enter valid inger."); + } + } } } diff --git a/src/main/java/com/javarush/emirzakov/model/Alphabet.java b/src/main/java/com/javarush/emirzakov/model/Alphabet.java index e3a45d4..e8d9503 100644 --- a/src/main/java/com/javarush/emirzakov/model/Alphabet.java +++ b/src/main/java/com/javarush/emirzakov/model/Alphabet.java @@ -1,5 +1,4 @@ package com.javarush.emirzakov.model; - public class Alphabet { public static final char[] ALPHABET = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', From 67e356f50e183844f9727ab0cf2d7b7f35761416 Mon Sep 17 00:00:00 2001 From: Damir Emirzakov Date: Tue, 14 Oct 2025 00:43:44 -0400 Subject: [PATCH 08/17] feat: add FileWriterService to save file --- .../main/java/FileWriterService.java | 16 +++++++++ .../javarush/emirzakov/main/java/Runner.java | 33 ++++++++++++------- .../javarush/emirzakov/model/Alphabet.java | 8 ++--- .../emirzakov/service/CryptoAction.java | 2 +- 4 files changed, 40 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/javarush/emirzakov/main/java/FileWriterService.java diff --git a/src/main/java/com/javarush/emirzakov/main/java/FileWriterService.java b/src/main/java/com/javarush/emirzakov/main/java/FileWriterService.java new file mode 100644 index 0000000..3b857f0 --- /dev/null +++ b/src/main/java/com/javarush/emirzakov/main/java/FileWriterService.java @@ -0,0 +1,16 @@ +package com.javarush.emirzakov.main.java; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +public class FileWriterService { + public void writeFile(String path, CharSequence content) { + try { + Files.writeString(Path.of(path), content); + System.out.println("Files successfully written to: " + path); + } catch (IOException e) { + System.out.println("Error writing to file: " + e.getMessage()); + } + } +} diff --git a/src/main/java/com/javarush/emirzakov/main/java/Runner.java b/src/main/java/com/javarush/emirzakov/main/java/Runner.java index ec04c16..5556b76 100644 --- a/src/main/java/com/javarush/emirzakov/main/java/Runner.java +++ b/src/main/java/com/javarush/emirzakov/main/java/Runner.java @@ -26,11 +26,10 @@ public static void main(String[] args) { text = input; System.out.println("Using input text directly"); } - System.out.println(""" - Choose action: - 1 - Encrypt - 2 - Decrypt - """); + System.out.println("\nChoose action: "); + System.out.println("1 - Encrypt"); + System.out.println("2 - Decrypt"); + int choice = readInt(scanner, "Enter choice: "); String message = "Enter key (integer): "; String result = null; @@ -51,19 +50,29 @@ public static void main(String[] args) { if (result != null) { System.out.println("Result:"); System.out.println(result); + + System.out.println("\nDo you want to save the result to a file? (y/n)"); + String answer = scanner.nextLine().trim().toLowerCase(); + if (answer.equals("y")) { + System.out.println("Enter path to file: "); + String filePath = scanner.nextLine().trim(); + + FileWriterService fileWriter = new FileWriterService(); + fileWriter.writeFile(filePath, result); + } } } } private static int readInt(Scanner scanner, String prompt) { - while (true){ + while (true) { System.out.println(prompt); String line = scanner.nextLine().trim(); - try{ - return Integer.parseInt(line); - } catch (NumberFormatException e){ - System.out.println("Please enter valid inger."); - } + try { + return Integer.parseInt(line); + } catch (NumberFormatException e) { + System.out.println("Please enter valid integer."); + } } } -} +} \ No newline at end of file diff --git a/src/main/java/com/javarush/emirzakov/model/Alphabet.java b/src/main/java/com/javarush/emirzakov/model/Alphabet.java index e8d9503..214438c 100644 --- a/src/main/java/com/javarush/emirzakov/model/Alphabet.java +++ b/src/main/java/com/javarush/emirzakov/model/Alphabet.java @@ -2,7 +2,7 @@ public class Alphabet { public static final char[] ALPHABET = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', - 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' '}; + 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; public int getCharIndex(char c) { for (int i = 0; i < ALPHABET.length; i++) { @@ -19,8 +19,4 @@ public char getCharByIndex(int index) { return ALPHABET[i]; } -} - -//создать объект -// если символа нет в массиве - пропускать -// игнорировать размер букв \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/java/com/javarush/emirzakov/service/CryptoAction.java b/src/main/java/com/javarush/emirzakov/service/CryptoAction.java index d5260b5..7a90386 100644 --- a/src/main/java/com/javarush/emirzakov/service/CryptoAction.java +++ b/src/main/java/com/javarush/emirzakov/service/CryptoAction.java @@ -8,7 +8,7 @@ public abstract class CryptoAction { protected char shiftChar(char c, int key) { int index = alphabet.getCharIndex(c); - if (index == -1) return c; + if (index == -1 || c == ' ') return c; return alphabet.getCharByIndex(index + key); } From 64ab11b57d86faf69cc86caa10df74f797ff84e8 Mon Sep 17 00:00:00 2001 From: Damir Emirzakov Date: Tue, 14 Oct 2025 16:29:45 -0400 Subject: [PATCH 09/17] feat: add StopWords class to detect language. --- .../javarush/emirzakov/model/StopWords.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/com/javarush/emirzakov/model/StopWords.java diff --git a/src/main/java/com/javarush/emirzakov/model/StopWords.java b/src/main/java/com/javarush/emirzakov/model/StopWords.java new file mode 100644 index 0000000..17e19e2 --- /dev/null +++ b/src/main/java/com/javarush/emirzakov/model/StopWords.java @@ -0,0 +1,19 @@ +package com.javarush.emirzakov.model; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public final class StopWords { + public static final Set RUSSIAN = new HashSet<>(Arrays.asList( + "и", "в", "на", "не", "что", "как", "я", "он", "она", "но", "с", + "за", "по", "то", "этот", "это", "для", "вы", "мы", "они" + )); + public static final Set ENGLISH = new HashSet<>(Arrays.asList( + "and", "the", "in", "of", "to", "a", "is", "it", "by", "for", + "on", "that", "this", "with", "as", "you", "I", "we", "he", "she" + )); + private StopWords(){ + + } +} From 594b73d5ce5f53d70bfe684aa2b783bd8e7b450d Mon Sep 17 00:00:00 2001 From: Damir Emirzakov Date: Tue, 14 Oct 2025 22:58:04 -0400 Subject: [PATCH 10/17] feat: add TextUtils class regex service --- .../javarush/emirzakov/service/TextUtils.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/com/javarush/emirzakov/service/TextUtils.java diff --git a/src/main/java/com/javarush/emirzakov/service/TextUtils.java b/src/main/java/com/javarush/emirzakov/service/TextUtils.java new file mode 100644 index 0000000..760c11f --- /dev/null +++ b/src/main/java/com/javarush/emirzakov/service/TextUtils.java @@ -0,0 +1,27 @@ +package com.javarush.emirzakov.service; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class TextUtils { + private static final Pattern WORD_PATTERN = Pattern.compile("\\b[а-яёА-ЯЁa-zA-Z']+\\b"); + + public static String normalize(String input) { + if (input == null) return ""; + String lower = input.toLowerCase(); + return lower.replaceAll("\\s+", " ").trim(); + } + + public static List tokenize(String normalizedText) { + List tokens = new ArrayList<>(); + if (normalizedText == null || normalizedText.isEmpty()) return tokens; + + Matcher matcher = WORD_PATTERN.matcher(normalizedText); + while (matcher.find()) { + tokens.add(matcher.group()); + } + return tokens; + } +} From 451fbdb853065ece800f7e46f546747f011740e4 Mon Sep 17 00:00:00 2001 From: Damir Emirzakov Date: Sat, 18 Oct 2025 01:25:49 -0400 Subject: [PATCH 11/17] feat: add BruteForce class --- .../javarush/emirzakov/main/java/Runner.java | 24 ++++++ .../javarush/emirzakov/model/Alphabet.java | 4 + .../emirzakov/service/BruteForceAction.java | 73 +++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 src/main/java/com/javarush/emirzakov/service/BruteForceAction.java diff --git a/src/main/java/com/javarush/emirzakov/main/java/Runner.java b/src/main/java/com/javarush/emirzakov/main/java/Runner.java index 5556b76..c99903e 100644 --- a/src/main/java/com/javarush/emirzakov/main/java/Runner.java +++ b/src/main/java/com/javarush/emirzakov/main/java/Runner.java @@ -1,11 +1,14 @@ package com.javarush.emirzakov.main.java; +import com.javarush.emirzakov.service.BruteForceAction; import com.javarush.emirzakov.service.DecryptAction; import com.javarush.emirzakov.service.EncryptAction; +import com.javarush.emirzakov.service.TextUtils; import java.nio.file.Files; import java.nio.file.Path; +import java.util.List; import java.util.Scanner; public class Runner { @@ -26,9 +29,17 @@ public static void main(String[] args) { text = input; System.out.println("Using input text directly"); } + String normalized = TextUtils.normalize(text); + List tokens = TextUtils.tokenize(normalized); + + System.out.println("Normalized text: " + normalized); + //System.out.println("Tokens: " + tokens); + + System.out.println("\nChoose action: "); System.out.println("1 - Encrypt"); System.out.println("2 - Decrypt"); + System.out.println("3 - Brute Force (try to find key automatically)"); int choice = readInt(scanner, "Enter choice: "); String message = "Enter key (integer): "; @@ -45,6 +56,19 @@ public static void main(String[] args) { DecryptAction decryptAction = new DecryptAction(); result = decryptAction.execute(text, key); } + case 3 -> { + BruteForceAction bf = new BruteForceAction(); + BruteForceAction.Result best = bf.findBestByStopWords(text); + + if (best != null) { + System.out.println("\n Brute-force result:"); + System.out.println("Key: " + best.key + " Score: " + best.score); + System.out.println("Candidate text:\n" + best.text); + result = best.text; + } else { + System.out.println("No likely candidate found by brute force."); + } + } default -> System.out.println("Unknown action. Exiting."); } if (result != null) { diff --git a/src/main/java/com/javarush/emirzakov/model/Alphabet.java b/src/main/java/com/javarush/emirzakov/model/Alphabet.java index 214438c..70bfc38 100644 --- a/src/main/java/com/javarush/emirzakov/model/Alphabet.java +++ b/src/main/java/com/javarush/emirzakov/model/Alphabet.java @@ -4,6 +4,10 @@ public class Alphabet { public static final char[] ALPHABET = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; + public int length() { + return ALPHABET.length; + } + public int getCharIndex(char c) { for (int i = 0; i < ALPHABET.length; i++) { if (Character.toLowerCase(ALPHABET[i]) == Character.toLowerCase(c)) { diff --git a/src/main/java/com/javarush/emirzakov/service/BruteForceAction.java b/src/main/java/com/javarush/emirzakov/service/BruteForceAction.java new file mode 100644 index 0000000..8bbb42d --- /dev/null +++ b/src/main/java/com/javarush/emirzakov/service/BruteForceAction.java @@ -0,0 +1,73 @@ +package com.javarush.emirzakov.service; + +import com.javarush.emirzakov.model.Alphabet; +import com.javarush.emirzakov.model.StopWords; + +import java.util.List; +import java.util.Set; + +public class BruteForceAction { + + public static class Result { + public final int key; + public final String text; + public final int score; + + public Result(int key, String text, int score) { + this.key = key; + this.text = text; + this.score = score; + } + } + + public Result findBestByStopWords(String cipherText) { + if (cipherText == null || cipherText.isBlank()) return null; + + DecryptAction decryptAction = new DecryptAction(); + Alphabet alphabet = new Alphabet(); + int N = alphabet.length(); + + int bestScore = -1; + Result best = null; + + for (int k = 0; k < N; k++) { + String candidate = decryptAction.execute(cipherText, k); + String sample = shortenForAnalysis(candidate, 1000); + String norm = TextUtils.normalize(sample); + List tokens = TextUtils.tokenize(norm); + + int rusMatches = countStopWords(tokens, StopWords.RUSSIAN); + int engMatches = countStopWords(tokens, StopWords.ENGLISH); + int matches = Math.max(rusMatches, engMatches); + + if (matches > bestScore) { + bestScore = matches; + best = new Result(k, candidate, matches); + // System.out.println("k=" + k + " rus=" + rusMatches + " eng=" + engMatches + " -> score=" + matches); + + } + } + return best; + } + + private String shortenForAnalysis(String text, int maxLen) { + if (text == null) return ""; + if (text.length() <= maxLen) return text; + + int cutIndex = text.lastIndexOf(' ', maxLen); + if (cutIndex == -1) { + cutIndex = maxLen; + } + return text.substring(0, cutIndex).trim(); + } + + private int countStopWords(List tokens, Set stopSet) { + if (tokens == null || tokens.isEmpty() || stopSet == null || stopSet.isEmpty()) return 0; + int count = 0; + for (String t : tokens) { + if (stopSet.contains(t)) count++; + } + return count; + } + +} From e284934b79547cc46cf762a0a687d2b2998c1fc9 Mon Sep 17 00:00:00 2001 From: Damir Emirzakov Date: Sat, 18 Oct 2025 01:48:06 -0400 Subject: [PATCH 12/17] feat: add input.txt --- src/main/java/com/javarush/emirzakov/input.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/main/java/com/javarush/emirzakov/input.txt diff --git a/src/main/java/com/javarush/emirzakov/input.txt b/src/main/java/com/javarush/emirzakov/input.txt new file mode 100644 index 0000000..b6b9f44 --- /dev/null +++ b/src/main/java/com/javarush/emirzakov/input.txt @@ -0,0 +1,2 @@ +The portal to 1958 was not, Jake decided, a portal in the way you'd think of a physical hole. It was more like a tear in the fabric of time, a wound that had never really healed. He stepped through it and into a world that was both familiar and strange, a world where everything felt just a little bit wrong. The air was cleaner, the sky was a deeper blue, and the cars looked like they were from a museum. He was an anomaly, a man out of time, and he knew that any wrong move could have catastrophic consequences. He had to be careful. He had to be precise. His mission was too important. +Jake stepped out of the portal and into the mundane world of 1958. The year 1958 seemed to be a bit of a blur for Jake. He remembered it for some reason. For some reason, 1958 seemed to hold a particular fascination for him, perhaps because it was the year of his birth. As he stood there, taking it all in, he felt a profound sense of loneliness wash over him. He was a stranger in a strange land, a man who had left his own time to enter a time that was not his own. He was an anachronism, a relic of the future in a world that was still living in the past. He had to be careful. He had to be precise. He had to be careful not to make any wrong moves. He had to be careful not to make any wrong moves, lest the fabric of time tear even more, and the future, his future, come crashing down around him. He had to be careful. He had to be careful, lest the future, his future, come crashing down around him. He had to be careful. He had to be careful, lest the future, his future, come crashing down around him. He had to be careful. He had to be careful, lest the future, his future, come crashing down around him. He had to be careful. He had to be careful, lest the future, his future, come crashing down around him. \ No newline at end of file From 883584a5dc59d70bfb5d0c563964b5d780053712 Mon Sep 17 00:00:00 2001 From: Damir Emirzakov Date: Mon, 20 Oct 2025 01:21:55 -0400 Subject: [PATCH 13/17] Keep capital letters in shiftChar Also added case 3 (Brute Force decryption) to Runner class for automatic key detection. --- .../java/com/javarush/emirzakov/input.txt | 75 ++++++++++++++++++- .../javarush/emirzakov/main/java/Runner.java | 10 ++- .../emirzakov/service/CryptoAction.java | 14 +++- .../emirzakov/service/DecryptAction.java | 4 +- .../javarush/emirzakov/service/TextUtils.java | 7 +- 5 files changed, 99 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/javarush/emirzakov/input.txt b/src/main/java/com/javarush/emirzakov/input.txt index b6b9f44..af538e9 100644 --- a/src/main/java/com/javarush/emirzakov/input.txt +++ b/src/main/java/com/javarush/emirzakov/input.txt @@ -1,2 +1,73 @@ -The portal to 1958 was not, Jake decided, a portal in the way you'd think of a physical hole. It was more like a tear in the fabric of time, a wound that had never really healed. He stepped through it and into a world that was both familiar and strange, a world where everything felt just a little bit wrong. The air was cleaner, the sky was a deeper blue, and the cars looked like they were from a museum. He was an anomaly, a man out of time, and he knew that any wrong move could have catastrophic consequences. He had to be careful. He had to be precise. His mission was too important. -Jake stepped out of the portal and into the mundane world of 1958. The year 1958 seemed to be a bit of a blur for Jake. He remembered it for some reason. For some reason, 1958 seemed to hold a particular fascination for him, perhaps because it was the year of his birth. As he stood there, taking it all in, he felt a profound sense of loneliness wash over him. He was a stranger in a strange land, a man who had left his own time to enter a time that was not his own. He was an anachronism, a relic of the future in a world that was still living in the past. He had to be careful. He had to be precise. He had to be careful not to make any wrong moves. He had to be careful not to make any wrong moves, lest the fabric of time tear even more, and the future, his future, come crashing down around him. He had to be careful. He had to be careful, lest the future, his future, come crashing down around him. He had to be careful. He had to be careful, lest the future, his future, come crashing down around him. He had to be careful. He had to be careful, lest the future, his future, come crashing down around him. He had to be careful. He had to be careful, lest the future, his future, come crashing down around him. \ No newline at end of file +When Al Templeton called me on the seventh of June 2011, and told me to come down to the diner, he sounded like a man who was gargling with nails. +He also sounded like he was about to cry. +Since Al was the toughest man I had ever known (my old man included), this was scary. +"What's wrong?" I asked. +"Are you sick?" +"Just get here, Jake. +Please." +He hung up. +I went. +He’d given me a job when I needed one, washing dishes and helping him short-order. +I owed him. +Besides, I was worried. +I hadn't seen him in... +when? +Mid-May, I guess. +That was when he'd put the CLOSED FOR REPAIRS sign on the door of the fat-boy diner. +When I asked him what repairs, he’d been vague. +The sign was still on the door, but the door was unlocked. +I went in. +The place was dark and hot. +The shades were pulled. +"Al?" +"In the booth," he whispered. +I walked past the counter, and my footsteps echoed in the empty room. +He was in the back booth, the one we called the Office. +He was sitting in the shadows. +"Al, what's going on? +You look..." +I stopped. +Because he didn't look. +Not like Al. +The Al Templeton I knew was a big man, six-two and at least two-thirty, most of it gut. +He was hearty. +He was loud. +The man in the booth was a scarecrow. +His cheeks were hollows. +His eyes were huge and staring. +His hair, which had been graying, was now almost entirely white, and it was thin, wispy. +He was wearing one of his endless supply of flannel shirts, and it hung on him like a tent. +He must have lost sixty pounds. +"Jesus, Al," I said. +"What happened to you? +Cancer?" +He nodded. +"Lung. +Stage four. +They found it when I... +when I came back." +"Came back? +From where? +Florida? +I thought you were just closing for repairs." +"I lied," he said, and his voice was a dry rasp. +"I haven't been in Florida, Jake. +I've been in 1958." +I stared at him. +He stared back. +His eyes were perfectly steady. +He meant it. +"You're insane," I said. +"No. +I'm dying. +And I need you to listen to me. +I need you to listen to me very, very carefully. +Because I’m going to tell you something that will change your life. +And maybe change the world." +He pointed toward the pantry. +"It started in there. +In the back. +There's a... +a bubble. +A rabbit-hole. +And it goes to the past." \ No newline at end of file diff --git a/src/main/java/com/javarush/emirzakov/main/java/Runner.java b/src/main/java/com/javarush/emirzakov/main/java/Runner.java index c99903e..65b6a97 100644 --- a/src/main/java/com/javarush/emirzakov/main/java/Runner.java +++ b/src/main/java/com/javarush/emirzakov/main/java/Runner.java @@ -92,10 +92,18 @@ private static int readInt(Scanner scanner, String prompt) { while (true) { System.out.println(prompt); String line = scanner.nextLine().trim(); + if (line.isEmpty()) { + System.out.println("Please enter 1, 2, or 3, then press Enter."); + continue; + } + if (!line.matches("\\d+")) { + System.out.println("Please enter a valid integer."); + continue; + } try { return Integer.parseInt(line); } catch (NumberFormatException e) { - System.out.println("Please enter valid integer."); + System.out.println("Number too large. Try again."); } } } diff --git a/src/main/java/com/javarush/emirzakov/service/CryptoAction.java b/src/main/java/com/javarush/emirzakov/service/CryptoAction.java index 7a90386..d7220c6 100644 --- a/src/main/java/com/javarush/emirzakov/service/CryptoAction.java +++ b/src/main/java/com/javarush/emirzakov/service/CryptoAction.java @@ -7,9 +7,17 @@ public abstract class CryptoAction { protected Alphabet alphabet = new Alphabet(); protected char shiftChar(char c, int key) { - int index = alphabet.getCharIndex(c); - if (index == -1 || c == ' ') return c; - return alphabet.getCharByIndex(index + key); + if (!Character.isLetter(c)) return c; + boolean isUpper = Character.isUpperCase(c); + + char lower = Character.toLowerCase(c); + int index = alphabet.getCharIndex(lower); + if (index == -1) { + return c; + } + char shifted = alphabet.getCharByIndex(index + key); + if (isUpper) return Character.toUpperCase(shifted); + return shifted; } public abstract String execute(String text, int key); diff --git a/src/main/java/com/javarush/emirzakov/service/DecryptAction.java b/src/main/java/com/javarush/emirzakov/service/DecryptAction.java index 6fa112e..1195cd5 100644 --- a/src/main/java/com/javarush/emirzakov/service/DecryptAction.java +++ b/src/main/java/com/javarush/emirzakov/service/DecryptAction.java @@ -9,6 +9,8 @@ public String execute(String text, int key) { char ch = text.charAt(i); result.append(shiftChar(ch, -key)); } - return result.toString(); + String s = result.toString(); + s = s.replaceAll("(?<=[.!?])\\s+", System.lineSeparator()); + return s; } } diff --git a/src/main/java/com/javarush/emirzakov/service/TextUtils.java b/src/main/java/com/javarush/emirzakov/service/TextUtils.java index 760c11f..b68407b 100644 --- a/src/main/java/com/javarush/emirzakov/service/TextUtils.java +++ b/src/main/java/com/javarush/emirzakov/service/TextUtils.java @@ -8,10 +8,9 @@ public class TextUtils { private static final Pattern WORD_PATTERN = Pattern.compile("\\b[а-яёА-ЯЁa-zA-Z']+\\b"); - public static String normalize(String input) { - if (input == null) return ""; - String lower = input.toLowerCase(); - return lower.replaceAll("\\s+", " ").trim(); + public static String normalize(String text) { + if (text == null) return ""; + return text.replaceAll("\\s+", " ").trim(); } public static List tokenize(String normalizedText) { From 5e42d9f6e53f8318384ee964007167fb1673828b Mon Sep 17 00:00:00 2001 From: Damir Emirzakov Date: Mon, 20 Oct 2025 16:50:25 -0400 Subject: [PATCH 14/17] fix runner class --- .../javarush/emirzakov/{main/java => io}/FileReaderService.java | 2 +- .../javarush/emirzakov/{main/java => io}/FileWriterService.java | 2 +- src/main/java/com/javarush/emirzakov/main/java/Runner.java | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) rename src/main/java/com/javarush/emirzakov/{main/java => io}/FileReaderService.java (90%) rename src/main/java/com/javarush/emirzakov/{main/java => io}/FileWriterService.java (91%) diff --git a/src/main/java/com/javarush/emirzakov/main/java/FileReaderService.java b/src/main/java/com/javarush/emirzakov/io/FileReaderService.java similarity index 90% rename from src/main/java/com/javarush/emirzakov/main/java/FileReaderService.java rename to src/main/java/com/javarush/emirzakov/io/FileReaderService.java index 8c631ba..6001d1c 100644 --- a/src/main/java/com/javarush/emirzakov/main/java/FileReaderService.java +++ b/src/main/java/com/javarush/emirzakov/io/FileReaderService.java @@ -1,4 +1,4 @@ -package com.javarush.emirzakov.main.java; +package com.javarush.emirzakov.io; import java.io.IOException; import java.nio.file.Files; diff --git a/src/main/java/com/javarush/emirzakov/main/java/FileWriterService.java b/src/main/java/com/javarush/emirzakov/io/FileWriterService.java similarity index 91% rename from src/main/java/com/javarush/emirzakov/main/java/FileWriterService.java rename to src/main/java/com/javarush/emirzakov/io/FileWriterService.java index 3b857f0..7dfde30 100644 --- a/src/main/java/com/javarush/emirzakov/main/java/FileWriterService.java +++ b/src/main/java/com/javarush/emirzakov/io/FileWriterService.java @@ -1,4 +1,4 @@ -package com.javarush.emirzakov.main.java; +package com.javarush.emirzakov.io; import java.io.IOException; import java.nio.file.Files; diff --git a/src/main/java/com/javarush/emirzakov/main/java/Runner.java b/src/main/java/com/javarush/emirzakov/main/java/Runner.java index 65b6a97..8101d54 100644 --- a/src/main/java/com/javarush/emirzakov/main/java/Runner.java +++ b/src/main/java/com/javarush/emirzakov/main/java/Runner.java @@ -1,6 +1,8 @@ package com.javarush.emirzakov.main.java; +import com.javarush.emirzakov.io.FileReaderService; +import com.javarush.emirzakov.io.FileWriterService; import com.javarush.emirzakov.service.BruteForceAction; import com.javarush.emirzakov.service.DecryptAction; import com.javarush.emirzakov.service.EncryptAction; From 846a2f9baa315e9eeb3a42a42a0550e1aaf4a859 Mon Sep 17 00:00:00 2001 From: Damir Emirzakov Date: Mon, 20 Oct 2025 17:18:56 -0400 Subject: [PATCH 15/17] Finalize CryptoAnalyzer project: add user interaction --- .../java/com/javarush/emirzakov/main/java/Runner.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/javarush/emirzakov/main/java/Runner.java b/src/main/java/com/javarush/emirzakov/main/java/Runner.java index 8101d54..746df14 100644 --- a/src/main/java/com/javarush/emirzakov/main/java/Runner.java +++ b/src/main/java/com/javarush/emirzakov/main/java/Runner.java @@ -34,7 +34,8 @@ public static void main(String[] args) { String normalized = TextUtils.normalize(text); List tokens = TextUtils.tokenize(normalized); - System.out.println("Normalized text: " + normalized); + System.out.println("Normalized text: "); + System.out.println(normalized.substring(0, Math.min(300, normalized.length())) + "..."); //System.out.println("Tokens: " + tokens); @@ -43,7 +44,7 @@ public static void main(String[] args) { System.out.println("2 - Decrypt"); System.out.println("3 - Brute Force (try to find key automatically)"); - int choice = readInt(scanner, "Enter choice: "); + int choice = readInt(scanner, "Enter choice (1-3): "); String message = "Enter key (integer): "; String result = null; @@ -74,7 +75,7 @@ public static void main(String[] args) { default -> System.out.println("Unknown action. Exiting."); } if (result != null) { - System.out.println("Result:"); + System.out.println("\n=== Result ==="); System.out.println(result); System.out.println("\nDo you want to save the result to a file? (y/n)"); @@ -85,6 +86,7 @@ public static void main(String[] args) { FileWriterService fileWriter = new FileWriterService(); fileWriter.writeFile(filePath, result); + //System.out.println("Result saved to " + filePath); } } } From 85d4ae20255675b944c47b4d674f79c005b22132 Mon Sep 17 00:00:00 2001 From: Damir Emirzakov Date: Mon, 20 Oct 2025 22:24:06 -0400 Subject: [PATCH 16/17] Final commit: improved alphabet detection, --- .../javarush/emirzakov/main/java/Runner.java | 3 +-- .../javarush/emirzakov/model/Alphabet.java | 20 +++++++++++++++---- .../emirzakov/service/BruteForceAction.java | 11 +++++----- .../emirzakov/service/CryptoAction.java | 10 +++++----- .../emirzakov/service/DecryptAction.java | 9 +++++---- .../emirzakov/service/EncryptAction.java | 5 ++++- 6 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/javarush/emirzakov/main/java/Runner.java b/src/main/java/com/javarush/emirzakov/main/java/Runner.java index 746df14..bef1a88 100644 --- a/src/main/java/com/javarush/emirzakov/main/java/Runner.java +++ b/src/main/java/com/javarush/emirzakov/main/java/Runner.java @@ -10,7 +10,6 @@ import java.nio.file.Files; import java.nio.file.Path; -import java.util.List; import java.util.Scanner; public class Runner { @@ -32,7 +31,7 @@ public static void main(String[] args) { System.out.println("Using input text directly"); } String normalized = TextUtils.normalize(text); - List tokens = TextUtils.tokenize(normalized); + //List tokens = TextUtils.tokenize(normalized); System.out.println("Normalized text: "); System.out.println(normalized.substring(0, Math.min(300, normalized.length())) + "..."); diff --git a/src/main/java/com/javarush/emirzakov/model/Alphabet.java b/src/main/java/com/javarush/emirzakov/model/Alphabet.java index 70bfc38..2a33c69 100644 --- a/src/main/java/com/javarush/emirzakov/model/Alphabet.java +++ b/src/main/java/com/javarush/emirzakov/model/Alphabet.java @@ -1,11 +1,19 @@ package com.javarush.emirzakov.model; + public class Alphabet { + private final char[] ALPHABET; - public static final char[] ALPHABET = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', - 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; + private static final char[] ENGLISH = "abcdefghijklmnopqrstuvwxyz".toCharArray(); - public int length() { - return ALPHABET.length; + private static final char[] RUSSIAN = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя".toCharArray(); + + + public Alphabet(String text) { + if (text.matches(".*[а-яА-ЯёЁ].*")) { + ALPHABET = RUSSIAN; + } else { + ALPHABET = ENGLISH; + } } public int getCharIndex(char c) { @@ -23,4 +31,8 @@ public char getCharByIndex(int index) { return ALPHABET[i]; } + public int length() { + return ALPHABET.length; + } + } \ No newline at end of file diff --git a/src/main/java/com/javarush/emirzakov/service/BruteForceAction.java b/src/main/java/com/javarush/emirzakov/service/BruteForceAction.java index 8bbb42d..aa7142f 100644 --- a/src/main/java/com/javarush/emirzakov/service/BruteForceAction.java +++ b/src/main/java/com/javarush/emirzakov/service/BruteForceAction.java @@ -24,15 +24,15 @@ public Result findBestByStopWords(String cipherText) { if (cipherText == null || cipherText.isBlank()) return null; DecryptAction decryptAction = new DecryptAction(); - Alphabet alphabet = new Alphabet(); - int N = alphabet.length(); + //Alphabet alphabet = new Alphabet(cipherText); + int N = new Alphabet(cipherText).length(); int bestScore = -1; Result best = null; for (int k = 0; k < N; k++) { String candidate = decryptAction.execute(cipherText, k); - String sample = shortenForAnalysis(candidate, 1000); + String sample = shortenForAnalysis(candidate); String norm = TextUtils.normalize(sample); List tokens = TextUtils.tokenize(norm); @@ -43,14 +43,13 @@ public Result findBestByStopWords(String cipherText) { if (matches > bestScore) { bestScore = matches; best = new Result(k, candidate, matches); - // System.out.println("k=" + k + " rus=" + rusMatches + " eng=" + engMatches + " -> score=" + matches); - } } return best; } - private String shortenForAnalysis(String text, int maxLen) { + private String shortenForAnalysis(String text) { + int maxLen = 1000; if (text == null) return ""; if (text.length() <= maxLen) return text; diff --git a/src/main/java/com/javarush/emirzakov/service/CryptoAction.java b/src/main/java/com/javarush/emirzakov/service/CryptoAction.java index d7220c6..f8347f3 100644 --- a/src/main/java/com/javarush/emirzakov/service/CryptoAction.java +++ b/src/main/java/com/javarush/emirzakov/service/CryptoAction.java @@ -4,20 +4,20 @@ public abstract class CryptoAction { - protected Alphabet alphabet = new Alphabet(); + //protected Alphabet alphabet = new Alphabet(); - protected char shiftChar(char c, int key) { + protected char shiftChar(char c, int key, Alphabet alphabet) { if (!Character.isLetter(c)) return c; - boolean isUpper = Character.isUpperCase(c); + boolean isUpper = Character.isUpperCase(c); char lower = Character.toLowerCase(c); int index = alphabet.getCharIndex(lower); + if (index == -1) { return c; } char shifted = alphabet.getCharByIndex(index + key); - if (isUpper) return Character.toUpperCase(shifted); - return shifted; + return isUpper ? Character.toUpperCase(shifted) : shifted; } public abstract String execute(String text, int key); diff --git a/src/main/java/com/javarush/emirzakov/service/DecryptAction.java b/src/main/java/com/javarush/emirzakov/service/DecryptAction.java index 1195cd5..02992c3 100644 --- a/src/main/java/com/javarush/emirzakov/service/DecryptAction.java +++ b/src/main/java/com/javarush/emirzakov/service/DecryptAction.java @@ -1,16 +1,17 @@ package com.javarush.emirzakov.service; +import com.javarush.emirzakov.model.Alphabet; + public class DecryptAction extends CryptoAction { @Override public String execute(String text, int key) { + Alphabet alphabet = new Alphabet(text); StringBuilder result = new StringBuilder(); for (int i = 0; i < text.length(); i++) { char ch = text.charAt(i); - result.append(shiftChar(ch, -key)); + result.append(shiftChar(ch, -key, alphabet)); } - String s = result.toString(); - s = s.replaceAll("(?<=[.!?])\\s+", System.lineSeparator()); - return s; + return result.toString(); } } diff --git a/src/main/java/com/javarush/emirzakov/service/EncryptAction.java b/src/main/java/com/javarush/emirzakov/service/EncryptAction.java index a44f64e..22d45b3 100644 --- a/src/main/java/com/javarush/emirzakov/service/EncryptAction.java +++ b/src/main/java/com/javarush/emirzakov/service/EncryptAction.java @@ -1,13 +1,16 @@ package com.javarush.emirzakov.service; +import com.javarush.emirzakov.model.Alphabet; + public class EncryptAction extends CryptoAction { @Override public String execute(String text, int key) { + Alphabet alphabet = new Alphabet(text); StringBuilder result = new StringBuilder(); for (int i = 0; i < text.length(); i++) { char ch = text.charAt(i); - result.append(shiftChar(ch, key)); + result.append(shiftChar(ch, key, alphabet)); } return result.toString(); } From c6c1c4aa70651f8bdd9874485313b3ea3bb63d17 Mon Sep 17 00:00:00 2001 From: Damir Emirzakov Date: Sat, 25 Oct 2025 16:08:03 -0400 Subject: [PATCH 17/17] refactor: clean up code and remove comments --- src/main/java/com/javarush/emirzakov/main/java/Runner.java | 3 --- src/main/java/com/javarush/emirzakov/model/StopWords.java | 3 ++- .../java/com/javarush/emirzakov/service/BruteForceAction.java | 1 - src/main/java/com/javarush/emirzakov/service/CryptoAction.java | 2 -- 4 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/javarush/emirzakov/main/java/Runner.java b/src/main/java/com/javarush/emirzakov/main/java/Runner.java index bef1a88..c06dc3c 100644 --- a/src/main/java/com/javarush/emirzakov/main/java/Runner.java +++ b/src/main/java/com/javarush/emirzakov/main/java/Runner.java @@ -31,11 +31,9 @@ public static void main(String[] args) { System.out.println("Using input text directly"); } String normalized = TextUtils.normalize(text); - //List tokens = TextUtils.tokenize(normalized); System.out.println("Normalized text: "); System.out.println(normalized.substring(0, Math.min(300, normalized.length())) + "..."); - //System.out.println("Tokens: " + tokens); System.out.println("\nChoose action: "); @@ -85,7 +83,6 @@ public static void main(String[] args) { FileWriterService fileWriter = new FileWriterService(); fileWriter.writeFile(filePath, result); - //System.out.println("Result saved to " + filePath); } } } diff --git a/src/main/java/com/javarush/emirzakov/model/StopWords.java b/src/main/java/com/javarush/emirzakov/model/StopWords.java index 17e19e2..2ec4535 100644 --- a/src/main/java/com/javarush/emirzakov/model/StopWords.java +++ b/src/main/java/com/javarush/emirzakov/model/StopWords.java @@ -13,7 +13,8 @@ public final class StopWords { "and", "the", "in", "of", "to", "a", "is", "it", "by", "for", "on", "that", "this", "with", "as", "you", "I", "we", "he", "she" )); - private StopWords(){ + + private StopWords() { } } diff --git a/src/main/java/com/javarush/emirzakov/service/BruteForceAction.java b/src/main/java/com/javarush/emirzakov/service/BruteForceAction.java index aa7142f..25bab10 100644 --- a/src/main/java/com/javarush/emirzakov/service/BruteForceAction.java +++ b/src/main/java/com/javarush/emirzakov/service/BruteForceAction.java @@ -24,7 +24,6 @@ public Result findBestByStopWords(String cipherText) { if (cipherText == null || cipherText.isBlank()) return null; DecryptAction decryptAction = new DecryptAction(); - //Alphabet alphabet = new Alphabet(cipherText); int N = new Alphabet(cipherText).length(); int bestScore = -1; diff --git a/src/main/java/com/javarush/emirzakov/service/CryptoAction.java b/src/main/java/com/javarush/emirzakov/service/CryptoAction.java index f8347f3..d75bf18 100644 --- a/src/main/java/com/javarush/emirzakov/service/CryptoAction.java +++ b/src/main/java/com/javarush/emirzakov/service/CryptoAction.java @@ -4,8 +4,6 @@ public abstract class CryptoAction { - //protected Alphabet alphabet = new Alphabet(); - protected char shiftChar(char c, int key, Alphabet alphabet) { if (!Character.isLetter(c)) return c;