동일한 문자열이 배열의 인접한 위치에 나타나지 않도록 하는 방법은 무엇입니까?

동일한 문자열이 배열의 인접한 위치에 나타나지 않도록 하는 방법은 무엇입니까?

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

관련 정보