http://www.perlmonks.org?node_id=1188043


in reply to Trudging along the learning perl path.

You like puzzles. Programming in general is about solving puzzles. Perl is full of puzzles. The code you posted is puzzling. Puzzles are supposed to be fun. If you're having fun, keep at it. If you're not, go find another puzzle.

In any case, here is my stab at your hash-less puzzle:

perl -lwe '@a=(29,24,0,24,24,12,0,10,10,19,17,15,13,1,12,12,24);@x[@a] +=();print $#x and delete $x[-1] while @x' 29 24 19 17 15 13 12 10 1 0

Replies are listed 'Best First'.
Re^2: Trudging along the learning perl path.
by vrk (Chaplain) on Apr 18, 2017 at 13:05 UTC

    That's cheating a bit, because it only works with arrays of nonnegative integers. The OP version works with any numeric elements (<=> comparison). Interesting angle nonetheless.

    The hashless solution doesn't actually need any sorting. The following is a brute force filter, which maintains the input order of elements:

    use v5.14; use warnings; sub uniq { my @u; for my $x (@_) { next if grep { $x == $_ } @u; push @u, $x; } return @u; } say join ', ', uniq(29,24,0,24,24,12,0,10,10,19,17,15,13,1,12,12,24);

    It's of course asymptotically slower than sorting (O(n**2) vs O(n*log(n))), but if the input happens to be mostly duplicates, it will be faster in practice.