How to Encrypt Words in Java


The challenge

You want to create secret messages which must be deciphered.

Here are the conditions:

  1. Your message is a string containing space separated words.
  2. You need to encrypt each word in the message using the following rules:
    • The first letter must be converted to its ASCII code.
    • The second letter must be switched with the last letter
  3. Keepin’ it simple: There are no special characters in the input.

Examples:

EncryptWords.encryptThis("Hello") => "72olle"
EncryptWords.encryptThis("good") => "103doo"
EncryptWords.encryptThis("hello world") => "104olle 119drlo"

The solution in Java code

Option 1:

import java.util.Arrays;
import java.util.Iterator;

public class EncryptWords {
    public static String encryptThis(String text) {
        if (text.length()==0) return "";

        String[] words = text.split(" ");

        StringBuilder sb = new StringBuilder();

        for (Iterator<String> it = Arrays.stream(words).iterator(); it.hasNext(); ) {
            String word = it.next();
            StringBuilder nw = new StringBuilder();

            //first char
            nw.append((int)word.charAt(0));

            if (word.length()>1) {
                //last char
                nw.append(word.charAt(word.length() - 1));

                //rest of word
                if (word.length()>=3) nw.append(word.substring(2, word.length() - 1));

                //second char
                if (word.length()>2) nw.append(word.charAt(1));
            }

            //add to main word
            sb.append(nw).append(" ");
        }
        return sb.toString().trim();
    }
}

Option 2:

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

public class EncryptWords {
    public static String encryptThis(String text) {
        return Arrays.stream(text.split(" "))
                .map(w->w.length()>2?(int)w.charAt(0)+w.substring(w.length()-1)+w.substring(2, w.length()-1)+w.substring(1,2):
                    w.length()>1?(int)w.charAt(0)+w.substring(1):
                    w.length()==1?(int)w.charAt(0)+"":"")
                .collect(Collectors.joining(" "));
    }
}

Option 3:

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

public class EncryptWords {
    public static String encryptThis(String text) {

        return text.length() == 0 ? text : Arrays.stream(text.split(" "))
                .map(s -> "" + (int) s.charAt(0)
                        + (s.length() > 2 ? s.charAt(s.length() - 1)
                        + s.substring(2, s.length() - 1)
                        + s.charAt(1) : s.substring(1)))
                .collect(Collectors.joining(" "));
    }
}

Test cases to validate our solution

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

public class EncryptWordsTest {
    @Test
    public void exampleTests() {
        assertEquals("", EncryptWords.encryptThis(""));
        assertEquals("65 119esi 111dl 111lw 108dvei 105n 97n 111ka", EncryptWords.encryptThis("A wise old owl lived in an oak"));
        assertEquals("84eh 109ero 104e 115wa 116eh 108sse 104e 115eokp", EncryptWords.encryptThis("The more he saw the less he spoke"));
        assertEquals("84eh 108sse 104e 115eokp 116eh 109ero 104e 104dare", EncryptWords.encryptThis("The less he spoke the more he heard"));
        assertEquals("87yh 99na 119e 110to 97ll 98e 108eki 116tah 119esi 111dl 98dri", EncryptWords.encryptThis("Why can we not all be like that wise old bird"));
        assertEquals("84kanh 121uo 80roti 102ro 97ll 121ruo 104ple", EncryptWords.encryptThis("Thank you Piotr for all your help"));
    }
}