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