Skip to content

Commit dc5bbcd

Browse files
authored
Merge branch 'master' into infix_to_prefix_new_algo
2 parents 9a0e344 + de22158 commit dc5bbcd

File tree

4 files changed

+180
-0
lines changed

4 files changed

+180
-0
lines changed

DIRECTORY.md

+3
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
* [RSA](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/ciphers/RSA.java)
5353
* [SimpleSubCipher](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/ciphers/SimpleSubCipher.java)
5454
* [Vigenere](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/ciphers/Vigenere.java)
55+
* [XORCipher](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/ciphers/XORCipher.java)
5556
* conversions
5657
* [AffineConverter](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/AffineConverter.java)
5758
* [AnyBaseToAnyBase](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/AnyBaseToAnyBase.java)
@@ -620,6 +621,7 @@
620621
* [RSATest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/RSATest.java)
621622
* [SimpleSubCipherTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/SimpleSubCipherTest.java)
622623
* [VigenereTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/VigenereTest.java)
624+
* [XORCipherTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/XORCipherTest.java)
623625
* conversions
624626
* [AnyBaseToDecimalTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/conversions/AnyBaseToDecimalTest.java)
625627
* [BinaryToDecimalTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/conversions/BinaryToDecimalTest.java)
@@ -724,6 +726,7 @@
724726
* [ZigzagTraversalTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/trees/ZigzagTraversalTest.java)
725727
* divideandconquer
726728
* [BinaryExponentiationTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/divideandconquer/BinaryExponentiationTest.java)
729+
* [SkylineAlgorithmTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/divideandconquer/SkylineAlgorithmTest.java)
727730
* [StrassenMatrixMultiplicationTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/divideandconquer/StrassenMatrixMultiplicationTest.java)
728731
* dynamicprogramming
729732
* [BoardPathTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/BoardPathTest.java)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.thealgorithms.ciphers;
2+
3+
import java.nio.charset.Charset;
4+
import java.nio.charset.StandardCharsets;
5+
import java.util.HexFormat;
6+
7+
/**
8+
* A simple implementation of XOR cipher that, given a key, allows to encrypt and decrypt a plaintext.
9+
*
10+
* @author <a href="https://github.com/lcsjunior">lcsjunior</a>
11+
*
12+
*/
13+
public final class XORCipher {
14+
15+
private static final Charset CS_DEFAULT = StandardCharsets.UTF_8;
16+
17+
private XORCipher() {
18+
}
19+
20+
public static byte[] xor(final byte[] inputBytes, final byte[] keyBytes) {
21+
byte[] outputBytes = new byte[inputBytes.length];
22+
for (int i = 0; i < inputBytes.length; ++i) {
23+
outputBytes[i] = (byte) (inputBytes[i] ^ keyBytes[i % keyBytes.length]);
24+
}
25+
return outputBytes;
26+
}
27+
28+
public static String encrypt(final String plainText, final String key) {
29+
byte[] plainTextBytes = plainText.getBytes(CS_DEFAULT);
30+
byte[] keyBytes = key.getBytes(CS_DEFAULT);
31+
byte[] xorResult = xor(plainTextBytes, keyBytes);
32+
return HexFormat.of().formatHex(xorResult);
33+
}
34+
35+
public static String decrypt(final String cipherText, final String key) {
36+
byte[] cipherBytes = HexFormat.of().parseHex(cipherText);
37+
byte[] keyBytes = key.getBytes(CS_DEFAULT);
38+
byte[] xorResult = xor(cipherBytes, keyBytes);
39+
return new String(xorResult, CS_DEFAULT);
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.thealgorithms.ciphers;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
class XORCipherTest {
8+
9+
@Test
10+
void xorEncryptTest() {
11+
// given
12+
String plaintext = "My t&xt th@t will be ençrypted...";
13+
String key = "My ç&cret key!";
14+
15+
// when
16+
String cipherText = XORCipher.encrypt(plaintext, key);
17+
18+
// then
19+
assertEquals("000000b7815e1752111c601f450e48211500a1c206061ca6d35212150d4429570eed", cipherText);
20+
}
21+
22+
@Test
23+
void xorDecryptTest() {
24+
// given
25+
String cipherText = "000000b7815e1752111c601f450e48211500a1c206061ca6d35212150d4429570eed";
26+
String key = "My ç&cret key!";
27+
28+
// when
29+
String plainText = XORCipher.decrypt(cipherText, key);
30+
31+
// then
32+
assertEquals("My t&xt th@t will be ençrypted...", plainText);
33+
}
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package com.thealgorithms.divideandconquer;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.util.ArrayList;
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
8+
9+
public class SkylineAlgorithmTest {
10+
11+
private SkylineAlgorithm skylineAlgorithm;
12+
13+
@BeforeEach
14+
public void setUp() {
15+
skylineAlgorithm = new SkylineAlgorithm();
16+
}
17+
18+
@Test
19+
public void testProduceSubSkyLinesSinglePoint() {
20+
// Test with a single point
21+
ArrayList<SkylineAlgorithm.Point> points = new ArrayList<>();
22+
points.add(new SkylineAlgorithm.Point(1, 10));
23+
24+
ArrayList<SkylineAlgorithm.Point> result = skylineAlgorithm.produceSubSkyLines(points);
25+
26+
assertEquals(1, result.size());
27+
assertEquals(1, result.get(0).getX());
28+
assertEquals(10, result.get(0).getY());
29+
}
30+
31+
@Test
32+
public void testProduceSubSkyLinesTwoPoints() {
33+
// Test with two points, one dominated by the other
34+
ArrayList<SkylineAlgorithm.Point> points = new ArrayList<>();
35+
points.add(new SkylineAlgorithm.Point(1, 10));
36+
points.add(new SkylineAlgorithm.Point(1, 5));
37+
38+
ArrayList<SkylineAlgorithm.Point> result = skylineAlgorithm.produceSubSkyLines(points);
39+
40+
assertEquals(1, result.size());
41+
assertEquals(1, result.get(0).getX());
42+
assertEquals(5, result.get(0).getY());
43+
}
44+
45+
@Test
46+
public void testProduceSubSkyLinesMultiplePoints() {
47+
// Test with more than two points
48+
ArrayList<SkylineAlgorithm.Point> points = new ArrayList<>();
49+
points.add(new SkylineAlgorithm.Point(1, 10));
50+
points.add(new SkylineAlgorithm.Point(2, 15));
51+
points.add(new SkylineAlgorithm.Point(3, 5));
52+
points.add(new SkylineAlgorithm.Point(4, 20));
53+
54+
ArrayList<SkylineAlgorithm.Point> result = skylineAlgorithm.produceSubSkyLines(points);
55+
56+
assertEquals(2, result.size());
57+
58+
// Assert the correct points in skyline
59+
assertEquals(1, result.get(0).getX());
60+
assertEquals(10, result.get(0).getY());
61+
assertEquals(3, result.get(1).getX());
62+
assertEquals(5, result.get(1).getY());
63+
}
64+
65+
@Test
66+
public void testProduceFinalSkyLine() {
67+
// Test merging two skylines
68+
ArrayList<SkylineAlgorithm.Point> left = new ArrayList<>();
69+
left.add(new SkylineAlgorithm.Point(1, 10));
70+
left.add(new SkylineAlgorithm.Point(2, 5));
71+
72+
ArrayList<SkylineAlgorithm.Point> right = new ArrayList<>();
73+
right.add(new SkylineAlgorithm.Point(3, 8));
74+
right.add(new SkylineAlgorithm.Point(4, 3));
75+
76+
ArrayList<SkylineAlgorithm.Point> result = skylineAlgorithm.produceFinalSkyLine(left, right);
77+
78+
assertEquals(3, result.size());
79+
80+
// Assert the correct points in the final skyline
81+
assertEquals(1, result.get(0).getX());
82+
assertEquals(10, result.get(0).getY());
83+
assertEquals(2, result.get(1).getX());
84+
assertEquals(5, result.get(1).getY());
85+
assertEquals(4, result.get(2).getX());
86+
assertEquals(3, result.get(2).getY());
87+
}
88+
89+
@Test
90+
public void testXComparator() {
91+
// Test the XComparator used for sorting the points
92+
SkylineAlgorithm.XComparator comparator = new SkylineAlgorithm().new XComparator();
93+
94+
SkylineAlgorithm.Point p1 = new SkylineAlgorithm.Point(1, 10);
95+
SkylineAlgorithm.Point p2 = new SkylineAlgorithm.Point(2, 5);
96+
97+
// Check if the XComparator sorts points by their x-value
98+
assertEquals(-1, comparator.compare(p1, p2)); // p1.x < p2.x
99+
assertEquals(1, comparator.compare(p2, p1)); // p2.x > p1.x
100+
assertEquals(0, comparator.compare(p1, new SkylineAlgorithm.Point(1, 15))); // p1.x == p2.x
101+
}
102+
}

0 commit comments

Comments
 (0)