challenge 重複する要素を取り除く

与えられたリストxsの中から、 2回以上出現するものを全部取り除いてください。

サンプル入力
[3, 1, 4, 1, 5, 9, 2, 6, 5]
サンプル出力
[3, 4, 9, 2, 6]

これはアレイのuniqの派生問題です。 リストとかアレイという言葉は言語によってまちまちの意味で使われているので、 「配列のようなもの」という漠然とした意味にとって構いません。

Posted feedbacks - awk

ナイーブな実装。
% awk -f remove_multiples_1.awk
3 14 15 92 65 35 89 79 32 38 46 26 43 38 32 79
3 14 15 92 65 35 89 46 26 43 
cat lion tiger lion
cat tiger 
1  2  1  0
2 0 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
	xs_size = split($0,xs)
	remove_multiples(xs,xs_size)
	for (i=1;i<=result_size;i++) printf result[i] " " ; printf "\n"
}

function remove_multiples(xs,xs_size, i) # 結果は result[], result_size へ
{
	delete occurrence
	for (i=1;i<=xs_size;i++) occurrence[xs[i]]++

	delete result
	result_size = 0
	for (i=1;i<=xs_size;i++)
		if (occurrence[xs[i]] == 1) result[++result_size] = xs[i]
}

配列を使わずにremove_multiples_1.awkと(ほぼ)同じ動作をする版。
% awk -f remove_multiples_2.awk
3 14 15 92 65 35 89 79 32 38 46 26 43 38 32 79
3 14 15 92 65 35 89 46 26 43 
cat lion tiger lion
cat tiger 
1  2  1  0
2  0
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
	orig = $0
	while (match(orig,/[^ ]+/)) {
		item = substr(orig,RSTART,RLENGTH)
		if (occurence[item]++ > 0) gsub(item " *","")
		orig = substr(orig,RSTART+RLENGTH)
	}
	print
	delete occurence
}

Index

Feed

Other

Link

Pathtraq

loading...