The challenge

The most basic encryption method is to map a char to another char by a certain math rule. Because every char has an ASCII value, we can manipulate this value with a simple math expression. For example ‘a’ + 1 would give us ‘b’, because ‘a’ value is 97 and ‘b’ value is 98.

You will need to write a method that does exactly that –

get a string as text and an int as the rule of manipulation, and should return encrypted text. for example:

encrypt(“a”,1) = “b”

Full ascii table is used on our question (256 chars) – so 0-255 are the valid values.

If the value exceeds 255, it should ‘wrap’. ie. if the value is 345 it should wrap to 89.

The solution in Java code

Option 1:

 ``````1 2 3 4 5 6 7 8 `````` ``````public class BasicEncrypt { public String encrypt(String text, int rule) { StringBuilder encryped = new StringBuilder(); for(Character a: text.toCharArray()) encryped.append(Character.toChars((a+rule)%256)) ; return encryped.toString(); } } ``````

Option 2:

 ``````1 2 3 4 5 `````` ``````public class BasicEncrypt { public String encrypt(String text, int rule) { return new String(text.chars().map(i -> (i + rule) % 256).toArray(), 0, text.length()); } } ``````

Option 3:

 ``````1 2 3 4 5 6 7 8 9 `````` ``````import java.util.stream.Collectors; public class BasicEncrypt { public String encrypt(String text, int rule) { StringBuilder result = new StringBuilder(); text.chars().mapToObj(e-> (char) ((e + rule) % 256)).forEach(e->result.append(e)); return result.toString(); } } ``````

Test cases to validate our solution

 `````` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 `````` ``````import org.junit.Test; import static org.junit.Assert.assertEquals; import java.util.Random; public class BasicEncryptTest { @Test public void testDecrypt() throws Exception { BasicEncrypt enc = new BasicEncrypt(); assertEquals("text = '', rule = 1", "", enc.encrypt("", 1)); assertEquals("text = 'a', rule = 1", "b", enc.encrypt("a", 1)); assertEquals("text = 'please encrypt me', rule = 2", "rngcug\"gpet{rv\"og", enc.encrypt("please encrypt me", 2)); } @Test public void randomTests() throws Exception { BasicEncrypt enc = new BasicEncrypt(); String text; int rule; for (int i = 0; i < 50; i++) { Random r = new Random(); text = randomString(r.nextInt(40)); rule = r.nextInt(450); assertEquals("text = " + text +" rule = " + rule, solEncrypt(text,rule), enc.encrypt(text, rule)); } } private String solEncrypt(String text, int rule) { StringBuilder res = new StringBuilder(); for (Character ch : text.toCharArray()) { res.append((char)(ch + rule > 255 ? (ch + rule) % 256 : ch + rule)); } return res.toString(); } private String randomString(int length) { Character startChar = 'a'; Character endChar = 'z'; return new Random().ints(length, startChar, endChar + 1) .mapToObj(i -> (char) i) .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) .toString(); } } ``````