루빅스 큐브 스크램블 생성기를 만들고 있는데 회전이 나란히 있을 수 없거나 쓸모가 없습니다. 다음 작업을 방지하려고 합니다.
동일한 문자열을 두 번 표시하는 것, 즉 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
매개변수에서 다음 단계를 선택하는 데 사용됩니다 .