我在進行列表數組比較以刪除重複項時遇到了一些麻煩。我的陣列由三元值序列組成,如下所示:
{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}
我嘗試使用 while 循環在下標 testequence.sh 的幫助下查找重複項,這是一個 Mathematica 腳本包裝器,用於識別兩個序列是否相同:
{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
這是一個 bash 循環,它將輸入從名為 'input' 的檔案讀取到名為 的陣列中input
,然後循環遍歷該陣列並測試以查看之前是否見過該特定序列;如果還沒有看到,則列印該值。然後,它將該序列旋轉到所有 13 個位置,並將這些值新增至已知旋轉關聯數組。我簡化了數據以展示該方法;您可以使用 shell 循環並根據需要調整輸入或輸出。
#!/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