lots of exercises in java... from https://github.com/exercism/java

Cipher.java 2.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import java.util.Random;
  2. import java.util.stream.IntStream;
  3. public class Cipher {
  4. private static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";
  5. private static final Random random = new Random();
  6. public String key;
  7. public Cipher() {
  8. this.key = IntStream.range(0, 100)
  9. .map(x -> ALPHABET.toCharArray()[random.nextInt(ALPHABET.length())])
  10. .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
  11. .toString();
  12. }
  13. public Cipher(String key) {
  14. if (!isValidKey(key)) {
  15. throw new IllegalArgumentException("Invalid key");
  16. }
  17. this.key = key;
  18. }
  19. private static boolean isValidKey(String key) {
  20. return key.matches("^[a-z]+$");
  21. }
  22. public String getKey() {
  23. return key;
  24. }
  25. public String encode(String plainText) {
  26. StringBuilder ciphertext = new StringBuilder(plainText.length());
  27. for (int index = 0; index < Math.min(plainText.length(), key.length()); index++) {
  28. ciphertext.append(encodeCharacter(plainText, index));
  29. }
  30. return ciphertext.toString();
  31. }
  32. private char encodeCharacter(String plainText, int index) {
  33. int alphabetIdx = ALPHABET.indexOf(plainText.toCharArray()[index]) + ALPHABET.indexOf(key.toCharArray()[index]);
  34. if (alphabetIdx >= ALPHABET.length()) {
  35. alphabetIdx -= ALPHABET.length();
  36. }
  37. return ALPHABET.toCharArray()[alphabetIdx];
  38. }
  39. public String decode(String cipherText) {
  40. StringBuilder plainText = new StringBuilder(cipherText.length());
  41. for (int i = 0; i < cipherText.length(); i++) {
  42. plainText.append(decodeCharacter(cipherText, i));
  43. }
  44. return plainText.toString();
  45. }
  46. private char decodeCharacter(String cipherText, int index) {
  47. int alphabetIdx = ALPHABET.indexOf(cipherText.toCharArray()[index]) - ALPHABET.indexOf(key.toCharArray()[index]);
  48. if (alphabetIdx < 0) {
  49. alphabetIdx += ALPHABET.length();
  50. }
  51. return ALPHABET.toCharArray()[alphabetIdx];
  52. }
  53. }