移動したシーケンスの重複項目を削除するためにシーケンス配列をフィルタリングする問題

移動したシーケンスの重複項目を削除するためにシーケンス配列をフィルタリングする問題

重複した項目を削除するためにリスト配列比較を実行する際に問題があります。私の配列は、次の一連の三項値で構成されています。

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

2つのシーケンスが同じかどうかを識別する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}

これら2つは同じで、左に移動しました。この場合、下付き文字は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つのユニークなシーケンスであるためです。

配列のシーケンスは固定長ではありません。長さは 2 から 121 以上であってもよい。そのため、配列の2行を比較するために添え字を保持したいと思います。

答え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

関連情報