シフトされたシーケンスの重複を削除するためにシーケンス配列をフィルタリングする際の問題

シフトされたシーケンスの重複を削除するためにシーケンス配列をフィルタリングする際の問題

リストの配列を比較して重複を削除するのに苦労しました。私の配列は、次のような 3 進値のシーケンスで構成されています。

{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 スクリプト ラッパーであるサブスクリプト testsequence.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

関連情報