考虑一个包含四个唯一数字(1,2,3,4)的三行输入文件,这样每行代表一个数字相对于另一个数字的位置。
例如,在下面的输入集中,4紧挨着2,2紧挨着3,1紧挨着4。
42
23
14
所以考虑到脚本如何组装所有四个数字,以便保持每个数字的已知关系?
换句话说,有两个答案1423或3241,但如何以编程方式到达?
答案 0 :(得分:1)
不是很明智或有效,但有趣(至少对我来说): - )
这将使用 GNU Parallel :
回显所有排列parallel echo {1}{2}{3}{4} ::: {1..4} ::: {1..4} ::: {1..4} ::: {1..4}
最后添加一些grepping
:
parallel echo {1}{2}{3}{4} ::: {1..4} ::: {1..4} ::: {1..4} ::: {1..4} | grep -E "42|24" | grep -E "23|32" | grep -E "14|41"
<强>输出强>
1423
3241
答案 1 :(得分:0)
蛮力强迫运气:
for (( ; ; ))
do
res=($(echo "42
23
14" | shuf))
if ((${res[0]}%10 == ${res[1]}/10 && ${res[1]}%10 == ${res[2]}/10))
then
echo "success: ${res[@]}"
break
fi
echo "fail: ${res[@]}"
done
fail: 42 14 23
fail: 42 23 14
fail: 42 14 23
success: 14 42 23
对于3个数字,这种方法是可以接受的。
Shuf将输入行混洗并用数字填充数组res。
然后我们采取以下数字并测试,如果第一个数字的最后一个数字匹配下一个数字的第一个数字,并相应地匹配第二个和第三个数字。
如果是这样,我们打破成功的消息。对于调试,失败消息优于无声无限循环。
对于更长的数字链,系统排列可能更好地测试和检查以下两个数字的函数,这可以通过索引调用或更好地循环是合适的。