我正在编写一个小的bash脚本,我正在尝试测试一个新生成的单词已经在所有以前创建的单词的列表中。
这就是我现在正在使用的:
dict=("word1"... "word21") #there would be 21 words in here
prev_guesses=()
guess_creator() {
guess=""
for i in {1..5} ;
do
guess_num=$( shuf -i 0-21 -n 1 )
guess+="${dict[$guess_num]}"
done
# using recursion to take another guess
if [ $guess (is in) $prev_guesses] ; then
guess_creator
else
prev_guess+=($guess)
fi
}
我也不确定递归是否在bash中如此工作。如果没有,我在这里问如何实际“破解”这段代码。想法是让这个函数每次运行时不断输出一个唯一的字符串,这样我以后可以在脚本中使用它。
我有三个问题:
如何将guess
与列表prev_guesses
进行比较并获得true
或false
输出
如何将猜测的字符串附加到列表prev_guesses
(我刚检查过它,它只是将字符串连接在一起,我需要一个像prev_guesses=("guess1" "guess2"...)
这样的列表 - 我可能已经解决了这个问题最后的编辑。
guess_creator
中的这种递归是否有效?
答案 0 :(得分:1)
在阵列的bash中没有类似的东西(Socowi关于使用关联数组的想法更好),你必须再次遍历列表,或者尝试使用grep或者东西
引用数组的所有元素,需要语法${prev_guesses[*]}
所以你可以连接像
这样的东西prev_guesses=(${prev_guesses[*]} $guess)
你的话语中的空格会使它变得更加复杂
那是艰难的方式。如果你想避免重复猜测,最好在你拍摄时从阵列中取出每个猜测,这样你就无法重复猜测。
更容易使用shuf命令来做所有事情
guess=($( shuf -e ${dict[*]} -n 5))
改变你的话并采取前五个
答案 1 :(得分:1)
由于您只对以下列中的单词感兴趣吗?«但不按条目顺序排列,您可以使用关联数组(也称为字典或哈希映射)存储你的话。检查条目是否在这样的地图中非常快(时间复杂度 O (1)):
declare -A oldGuesses=([word1]= [word2]= [word3]=)
if [[ "${oldGuesses[$guess]+1}" ]]; then
echo "$guess was already taken"
else
echo "$guess was not taken yet"
fi
您可以使用
向dict
添加条目
dict["newEntry"]=
不要担心空的右手边。地图通常用于存储键值对。这里我们只使用密钥([]
内写的东西)。
你提到你想要暴力破解,而且这个名单可以增长到4M条目。我建议不要使用bash,但更多的是反对存储所有猜测(无论你使用的语言是什么)。
相反,以有序的方式列举所有可能的猜测:
您想要创建五个连接词的猜测吗? 只需创建五个for循环:
for w1 in "${dict[@]}"; do
for w2 in "${dict[@]}"; do
for w3 in "${dict[@]}"; do
for w4 in "${dict[@]}"; do
for w5 in "${dict[@]}"; do
guess="$w1$w2$w3$w4$w5"
# do something with your guess here
done
done
done
done
done
这种方法对旧方法的好处: