如何确保相同的字符串不会出现在数组中相邻的位置?

如何确保相同的字符串不会出现在数组中相邻的位置?

我正在制作一个魔方打乱生成器,并且转弯不能并排,否则就没用。我试图阻止它执行以下操作:
显示相同的字符串两次,即R2 R2
显示相同类型的字符串两次,即R2 R
显示它旁边的字符串的逆,即R Ri

这是代码:

    #!/bin/bash
turns=( R Ri 
    L Li
    U Ui 
    D Di
    F Fi
    B Bi
    R2 L2 
    U2 D2
    F2 B2

)
for ((i=1; i<=$1; i++))
do {
     turnArray[$i]=${turns[$((RANDOM%18))]}
}
done
echo ${turnArray[*]}

我希望结果如下的一个示例:
脚本生成:D2 B Bi Bi Ri Fi R2 D Li U F2 Ri R2 R2 F2
*s 围绕需要更改的内容:D2 *B Bi Bi* Ri Fi R2 D Li U F2 Ri *R2 R2* F2

(如果您想知道,i轮流中的小写字母表示“反转”。)

答案1

#!/bin/bash

turns=(R Ri L Li U Ui D Di F Fi B Bi R2 L2 U2 D2 F2 B2)

declare -A possible
for i in ${turns[@]}; do
        possible[$i]=$(printf "%s\n" "${turns[@]}" | grep -v ${i:0:1})
done

next=${turns[*]}
for ((i=0; i<$1; i++)); do
        j=$(shuf -n 1 -e $next)
        turnArray[$i]=$j
        next=${possible[$j]}
done

echo ${turnArray[*]}
  • 预先计算关联数组中下一个可能的移动possible
  • 用于shuf从参数中选择下一步。

相关内容