이동된 시퀀스의 중복 항목을 제거하기 위해 시퀀스 배열을 필터링하는 문제

이동된 시퀀스의 중복 항목을 제거하기 위해 시퀀스 배열을 필터링하는 문제

중복 항목을 제거하기 위해 목록 배열 비교를 수행하는 데 문제가 있습니다. 내 배열은 다음과 같은 일련의 삼항 값으로 구성됩니다.

{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 스크립트 래퍼인 subscript 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

관련 정보