-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathkeyword_trans_cipher.java
More file actions
153 lines (113 loc) · 3.95 KB
/
keyword_trans_cipher.java
File metadata and controls
153 lines (113 loc) · 3.95 KB
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
//solution to: https://www.hackerrank.com/challenges/keyword-transposition-cipher
public class keyword_trans_cipher {
public static void main(String[] args) throws IOException {
ArrayList<String> output = new ArrayList<String>();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int t = Integer.parseInt(br.readLine()); t > 0; --t) {
String input = br.readLine();
String encrypted = br.readLine();
String keyword = remove_duplicates(input);
String alphabet = get_alphabet(keyword);
String[] rows = splitStringEvery(alphabet, keyword.length());
Hashtable<Character, String> grid = get_table(keyword, rows);
String translated = translate(grid, encrypted);
output.add(translated);
}
for (int i = 0; i < output.size(); i++) {
System.out.println(output.get(i));
}
}
public static String translate(Hashtable<Character, String> grid,
String encrypted) {
Hashtable<Character, Character> dictionary = new Hashtable<Character, Character>();
char replacement = ' ';
StringBuilder translated = new StringBuilder();
StringBuilder rearrange = new StringBuilder();
String alphabet = (get_alphabet(""));
List<Character> tmp = Collections.list(grid.keys());
Collections.sort(tmp);
Iterator<Character> it = tmp.iterator();
char key_value = ' ';
while (it.hasNext()) {
key_value = it.next();
rearrange.append(key_value + grid.get(key_value));
}
for (int j = 0; j < rearrange.length(); j++) {
dictionary.put(rearrange.charAt(j), alphabet.charAt(j));
}
for (int j = 0; j < encrypted.length(); j++) {
if (encrypted.charAt(j) != ' ') {
replacement = dictionary.get(encrypted.charAt(j));
translated.append(replacement);
} else {
translated.append(' ');
}
}
return translated.toString();
}
// create hashtable with each letter from keyword as key and the alphabet as
// values
public static Hashtable<Character, String> get_table(String keyword,
String[] rows) {
Hashtable<Character, String> grid = new Hashtable<Character, String>();
StringBuilder change_alphabet = new StringBuilder();
StringBuilder keylist = new StringBuilder();
for (int i = 0; i < keyword.length(); i++) {
keylist.append(keyword.charAt(i));
change_alphabet.append(" ");
for (int j = 0; j < rows.length; j++) {
if (rows[j].length() > i) {
change_alphabet.append(rows[j].charAt(i));
}
}
}
String keys = keylist.toString();
String[] new_rows = change_alphabet.toString().split("\\s+");
for (int k = 0; k < keys.length(); k++) {
grid.put(keys.charAt(k), new_rows[k + 1]);
}
return grid;
}
public static String[] splitStringEvery(String s, int interval) {
int arrayLength = (int) Math.ceil(((s.length() / (double) interval)));
String[] result = new String[arrayLength];
int j = 0;
int lastIndex = result.length - 1;
for (int i = 0; i < lastIndex; i++) {
result[i] = s.substring(j, j + interval);
j += interval;
} // Add the last bit
result[lastIndex] = s.substring(j);
return result;
}
public static String get_alphabet(String keyword) {
StringBuilder complete_alphabet = new StringBuilder();
StringBuilder key_and_alphabet = new StringBuilder();
for (int i = 65; i < 91; i++) {
complete_alphabet.append((char) i);
}
key_and_alphabet.append(keyword);
key_and_alphabet.append(complete_alphabet);
StringBuffer modify_alpha = new StringBuffer(
remove_duplicates(key_and_alphabet.toString()));
modify_alpha.replace(0, keyword.length(), "");
return modify_alpha.toString();
}
public static String remove_duplicates(String input) {
char[] chars = input.toCharArray();
Set<Character> charSet = new LinkedHashSet<Character>();
for (char c : chars) {
charSet.add(c);
}
StringBuilder key = new StringBuilder();
for (Character character : charSet) {
key.append(character);
}
return key.toString();
}
}