同じ文字列が配列の隣接位置に表示されないようにするにはどうすればよいですか?

同じ文字列が配列の隣接位置に表示されないようにするにはどうすればよいですか?

ルービックスキューブスクランブルジェネレータを作成していますが、回転が並んでいないか役に立ちません。次の作業を避けたいと思います。
同じ文字列を 2 回表示すること、つまりR2 R2
同じ型の文字列を 2 回表示すること、つまり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パラメータから次のステップを選択するために使用されます。

関連情報