Problema al filtrar la matriz de secuencias para eliminar duplicados con secuencias desplazadas

Problema al filtrar la matriz de secuencias para eliminar duplicados con secuencias desplazadas

Tuve algunos problemas para hacer una comparación de listas para eliminar duplicados. Mi matriz se compone de secuencias de valores ternarios como esta:

{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}

Intenté con un bucle while encontrar duplicados con la ayuda de un subíndice testequence.sh que es un contenedor de script de Mathematica para identificar si dos secuencias son iguales:

{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}

Estos dos son iguales con un desplazamiento hacia la izquierda; mi subíndice devuelve 1 en ese caso y el subíndice se usa así:

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

Mi primer intento con el bucle while comparó solo la primera secuencia con otras, eliminando solo la mitad de los duplicados.

El buen resultado debe ser:

{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}  

Ya que son las dos únicas secuencias únicas en la lista.

Tenga en cuenta que las secuencias de la matriz no tienen una longitud fija. Podrían variar de 2 a 121 o incluso más de longitud. Por eso quiero conservar mis subíndices para comparar dos filas de la matriz.

Respuesta1

Aquí hay un bucle bash que lee la entrada de un archivo llamado 'entrada' en una matriz llamada input, luego recorre esa matriz y prueba para ver si esa secuencia en particular se ha visto antes; si no se ha visto imprime el valor. Luego rota esa secuencia a través de las 13 posiciones, agregando esos valores a una matriz asociativa de rotación conocida. Simplifiqué los datos para mostrar el método; puede tomar el bucle de shell y ajustar la entrada o salida según sea necesario.

#!/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

Datos de entrada de muestra (copiados de la Pregunta, luego simplificados):

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

Salida de muestra:

0010111220121
0020222110212

información relacionada