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

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

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

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

Posted feedbacks - Perl

そうか!お題には「 重複する要素を取り除く」としか書いてない(笑
ということで順序は壊れるし効率もわるいけど。。。
こんなのもあり?
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
sub eraseDuplicate(@)
{
	$_ = join(' ', sort(@_));
	s/([^ ]+ )\1+//g;
	return split(' ');
}

my @sample = (3, 1, 4, 1, 5, 9, 2, 6, 5);

print '入力:[' . join(', ', @sample) . "]\n";
@sample = &eraseDuplicate( @sample );
print '出力:[' . join(', ', @sample) . "]\n";

exit 0;

一手間かけて順序保持するように修正~
だけど、文字列(単語)の重複含めて排除するでもない限りは
使い物にならないかなと(笑
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
sub eraseDuplicate(@)
{
    my @out;
    my $a = ' ' . join(' ', sort(@_)) . ' ';
    $a =~ s/([^ ]+ )\1+//g;
    foreach my $b ( @_ )
    {
        push(@out, $1) if( $a =~ m/ ($b) / );
    }
    return @out;
}

無理やりワンライナーでやってみた
指定はなかったが一応配列の順番も保障。
1
2
3
4
5
my @array = (3, 1, 4, 1, 5, 9, 2, 6, 5);

my @array2 = do { my %hash; grep { $hash{$_} == 1 } map { $hash{$_}++; $_; } @array };

print join ', ', @array2;

fbisさん惜しい!uniqは

sub uniq{ my %u; grep {!$u{$_}++} @_}

というidiomがすでにあるのです。

Dan the Perl Monger

1
2
% perl -le 'print do{my %u; grep {\!$u{$_}++} @ARGV}' 1 2 1 2 3 1 2 3 4
1234

Index

Feed

Other

Link

Pathtraq

loading...