我正在制作一个魔方打乱生成器,并且转弯不能并排,否则就没用。我试图阻止它执行以下操作:
显示相同的字符串两次,即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
从参数中选择下一步。