用于基于已知数字关系创建四字符串的脚本

时间:2018-04-04 22:00:59

标签: bash shell

考虑一个包含四个唯一数字(1,2,3,4)的三行输入文件,这样每行代表一个数字相对于另一个数字的位置。

例如,在下面的输入集中,4紧挨着2,2紧挨着3,1紧挨着4。

42
23
14

所以考虑到脚本如何组装所有四个数字,以便保持每个数字的已知关系?

换句话说,有两个答案1423或3241,但如何以编程方式到达?

2 个答案:

答案 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。

然后我们采取以下数字并测试,如果第一个数字的最后一个数字匹配下一个数字的第一个数字,并相应地匹配第二个和第三个数字。

如果是这样,我们打破成功的消息。对于调试,失败消息优于无声无限循环。

对于更长的数字链,系统排列可能更好地测试和检查以下两个数字的函数,这可以通过索引调用或更好地循环是合适的。