이동된 시퀀스가 ​​있는 중복 항목을 제거하기 위해 시퀀스 배열을 필터링하는 데 문제가 있습니다.

이동된 시퀀스가 ​​있는 중복 항목을 제거하기 위해 시퀀스 배열을 필터링하는 데 문제가 있습니다.

중복 항목을 제거하기 위해 일련의 목록 비교를 수행하는 데 약간의 어려움이 있었습니다. 내 배열은 다음과 같은 삼항 값 시퀀스로 구성됩니다.

{0, 0, 1, 0, 1, 1, 1, 2, 2, 0, 1, 2, 1}  
{0, 0, 2, 0, 2, 2, 2, 1, 1, 0, 2, 1, 2}  
{0, 1, 0, 1, 1, 1, 2, 2, 0, 1, 2, 1, 0}  
{0, 1, 1, 1, 2, 2, 0, 1, 2, 1, 0, 0, 1}  
{0, 1, 2, 1, 0, 0, 1, 0, 1, 1, 1, 2, 2}    
{0, 2, 0, 2, 2, 2, 1, 1, 0, 2, 1, 2, 0}  
{0, 2, 1, 2, 0, 0, 2, 0, 2, 2, 2, 1, 1}  
{0, 2, 2, 2, 1, 1, 0, 2, 1, 2, 0, 0, 2}  
{1, 0, 0, 1, 0, 1, 1, 1, 2, 2, 0, 1, 2}  
{1, 0, 1, 1, 1, 2, 2, 0, 1, 2, 1, 0, 0}  
{1, 0, 2, 1, 2, 0, 0, 2, 0, 2, 2, 2, 1}  
{1, 1, 0, 2, 1, 2, 0, 0, 2, 0, 2, 2, 2}  
{1, 1, 1, 2, 2, 0, 1, 2, 1, 0, 0, 1, 0}  
{1, 1, 2, 2, 0, 1, 2, 1, 0, 0, 1, 0, 1}  
{1, 2, 0, 0, 2, 0, 2, 2, 2, 1, 1, 0, 2}  
{1, 2, 1, 0, 0, 1, 0, 1, 1, 1, 2, 2, 0}  
{1, 2, 2, 0, 1, 2, 1, 0, 0, 1, 0, 1, 1}  
{2, 0, 0, 2, 0, 2, 2, 2, 1, 1, 0, 2, 1}

두 시퀀스가 ​​동일한지 식별하기 위한 Mathematica 스크립트 래퍼인 첨자 testequence.sh의 도움으로 while 루프를 사용하여 중복 항목을 찾으려고 했습니다.

{0, 0, 1, 0, 1, 1, 1, 2, 2, 0, 1, 2, 1}  
{0, 1, 0, 1, 1, 1, 2, 2, 0, 1, 2, 1, 0}

이 둘은 왼쪽으로 이동해도 동일합니다. 이 경우 내 첨자는 1을 반환하고 첨자는 다음과 같이 사용됩니다.

./testsequence.sh "`echo ${foundsequence[0]}`" "`echo ${foundsequence[1]}`"

while 루프를 사용한 첫 번째 시도는 첫 번째 시퀀스만 다른 시퀀스와 비교하여 중복 항목의 절반만 제거했습니다.

좋은 결과는 다음과 같아야 합니다.

{0, 0, 1, 0, 1, 1, 1, 2, 2, 0, 1, 2, 1}  
{0, 0, 2, 0, 2, 2, 2, 1, 1, 0, 2, 1, 2}  

이는 목록에서 유일한 두 개의 고유한 시퀀스이기 때문입니다.

배열의 시퀀스는 고정된 길이가 아니라는 점에 유의하세요. 길이는 2에서 121까지 다양할 수 있으며 그 이상일 수도 있습니다. 그래서 배열의 두 행을 비교하기 위해 첨자를 유지하고 싶습니다.

답변1

다음은 'input'이라는 파일의 입력을 이라는 배열로 읽은 다음 input해당 배열을 반복하고 해당 특정 시퀀스가 ​​이전에 본 적이 있는지 테스트하는 bash 루프입니다. 본 적이 없으면 값을 인쇄합니다. 그런 다음 해당 시퀀스를 13개 위치 모두에서 회전하여 해당 값을 알려진 회전 연관 배열에 추가합니다. 방법을 보여주기 위해 데이터를 단순화했습니다. 쉘 루프를 사용하여 필요에 따라 입력 또는 출력을 조정할 수 있습니다.

#!/usr/bin/env bash
readarray -t input < input
declare -A rotations
for((i=0; i < ${#input[*]}; i++))
do
  x=${input[i]}
  [[ ${rotations[$x]:-0} -eq 0 ]] && printf "%s\n" "$x"
  for((r=0; r < 13; r++))
  do
    new=${x:r}${x:0:r}
    rotations[$new]=1
  done
done

샘플 입력 데이터(질문에서 복사한 다음 단순화함):

0010111220121
0020222110212
0101112201210
0111220121001
0121001011122
0202221102120
0212002022211
0222110212002
1001011122012
1011122012100
1021200202221
1102120020222
1112201210010
1122012100101
1200202221102
1210010111220
1220121001011
2002022211021

샘플 출력:

0010111220121
0020222110212

관련 정보