リストの配列を比較して重複を削除するのに苦労しました。私の配列は、次のような 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