【发布时间】:2019-02-19 07:55:32
【问题描述】:
有一个夺旗挑战
我有两个文件;一个有这样的乱码,大约有 550 个条目
dnaoyt
cinuertdso
bda
haey
tolpap
...
第二个文件是一个包含大约 9,000 个条目的字典
radar
ccd
gcc
fcc
historical
...
目标是找到正确的、未加扰的单词版本,该版本包含在字典文件中。
我的方法是对第一个文件中第一个单词的字符进行排序,然后查找第二个文件中的第一个单词是否具有相同的长度。如果是这样,那么也对其进行排序并进行比较。
这是我功能齐全的 bash 脚本,但速度很慢。
#!/bin/bash
while IFS="" read -r p || [ -n "$p" ]
do
var=0
ro=$(echo $p | perl -F -lane 'print sort @F')
len_ro=${#ro}
while IFS="" read -r o || [ -n "$o" ]
do
ro2=$(echo $o | perl -F -lane 'print sort @ F')
len_ro2=${#ro2}
let "var+=1"
if [ $len_ro == $len_ro2 ]; then
if [ $ro == $ro2 ]; then
echo $o >> new.txt
echo $var >> whichline.txt
fi
fi
done < dictionary.txt
done < scrambled-words.txt
我也尝试将所有字符转换为 ASCII 整数并对每个单词求和,但在比较时我意识到不同字符模式的总和可能具有相同的总和。
[编辑] 对于记录: - 字典中没有字谜 - 要获得标志,您需要将未加扰的单词导出为一个 blob,然后用它制作一个 SHA-Hash(这就是标志) - 链接到想要文件的人的 ctf https://challenges.reply.com/tamtamy/user/login.action
【问题讨论】:
-
它有效吗?速度的最佳改进是用另一种语言来做,比如 Perl(整个事情),Python,......它的运行速度比 bash 快 MUCH 因为一旦解释它就不会创建一堆 shell跑步。可能还有其他更有效的算法,但这种语言变化会产生巨大的影响。
-
除了语言选择之外,对于
scrambled-words.txt的每一行,您处理完整的dictionary.txt文件。你的问题可能更适合Code Review - 不过请确保它是on topic。 -
有两件事立即脱颖而出:(1) 嵌套循环意味着您正在重新阅读
dictionary.txt的全部内容,以了解scrambled-words.txt中的每个单词。如果你很聪明,你只需要读一次字典。避免任何嵌套循环。 (2) 你调用perl550×9900 次,效率非常低。您实际上应该最多只需要每个文件调用一次。要么用 perl 编写整个脚本,要么如果你坚持使用 bash,请避免调用 perl。 -
另外,你会得到错误的字谜匹配:你输入的单词“listen”会显示为匹配“silent”,因为它们都排序为“eilnst”。
-
你能把这两个文件提供给我们吗?
标签: bash perl string-comparison scramble