考虑一个包含四个唯一数字(1,2,3,4)的三行输入文件,这样每行表示一个数字相对于另一个数字的位置。
例如,在下面的输入集中,4在2旁边,2在3旁边,1在4旁边。
42
23
14因此,考虑到一个脚本将如何将所有四个数字组合成一种能够保持每个数字已知关系的方式?
换句话说,有两个答案1423或3241,但如何以编程的方式得出这个答案呢?
发布于 2018-04-05 08:17:37
强求运气的野蛮人:
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。
然后我们开始跟踪数字和测试,如果第一个数字的最后一个数字与下一个数字的第一个数字匹配,并相应地对第二个和第三个数字进行测试。
如果是这样的话,我们就会发出成功的信息。对于调试,失败消息比无声的没完没了的循环更好。
对于较长的数字链,系统排列可能更好地测试,检查以下两个数字的函数,这可以通过索引或更好的循环将是合适的。
发布于 2018-04-05 09:05:35
不太明智或有效率,但有趣(至少对我来说) :-)
这将使用GNU并行回显所有排列。
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
3241https://stackoverflow.com/questions/49666445
复制相似问题