我正在做一些黑客排名问题,我无法弄清楚挑战细节中的加密方法是什么,here is the challenge.
摘自挑战:
通过在列中显示字符,插入空格,然后显示下一列并插入空格等来获取编码消息。例如,上述矩形的编码消息是:
imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau
没有提及角色如何更改为挑战提供的输出示例...
我理解这个问题的所有要素。对我来说问题是:在网格中存储文本之后,没有关于字母如何加密的挑战的细节。
也许我对加密技术非常不熟悉,如果我更精通,我可以从示例输出中识别出一些简单的加密模式。
我在这里缺少什么?
答案 0 :(得分:1)
请像这样阅读(连接标记的字母):
i
m tgdvs f
e arwer m
a yoogo a
n ouuio n
t nnlvt w
t tddes a
o hghn s
s eoau
然后回到开头,从每个单词中取出第二个字母,依此类推。
IfManWas
MeantToS ...
答案 1 :(得分:0)
问题中描述的方法是删除空格并打孔。然后计算行和列,并创建一个多维多维矩阵。遍历将字符存储在矩阵中的字符串。然后反转矩阵并创建最终字符串。
static String encryption(String s) {
String S = s.replace(" ", "");
int L = S.length();
int tryRow = (int) Math.floor(Math.sqrt(L));
int row;
int col = (int) Math.ceil(Math.sqrt(L));
if (tryRow * col < L) {
row = tryRow + 1;
} else {
row = tryRow;
}
char[][] matrix = IntStream.range(0, L).collect(
() -> new char[row][col],
(acc, i) -> {
int r = i / col;
int c = i - (r * col);
acc[r][c] = S.charAt(i);
},
(a, b) -> {
});
char[][] temp = new char[col][row];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
temp[j][i] = matrix[i][j];
}
}
return Arrays.stream(temp)
.map(arr -> String.valueOf(arr).trim())
.collect(Collectors.joining(" "));
}