in reply to Print max count of repeated consecutive numbers in an array

G'day vkk05,

"... looking for any alternative solution/logic ..."

The code in &get_max_count below provides a far less involved solution.

Testing your algorithm with a single, ideal datum is never a good idea. I've used Test::More to show a common way of testing multiple items. You can simply add more test data to @tests; nothing else in the code needs to be changed.

#!/usr/bin/env perl use strict; use warnings; use constant UNDEF => "\0"; use Test::More; my @tests = ( [qw{2 2 2 3 3 4 4}], [qw{2 2 3 3 4 4 2 2 2}], [qw{2 2 2 3 3 4 4 2 2}], [qw{2 2 2 3 3 4 4 4 5 6 6}], [qw{2 2 6 6 6 3 3 4 4 4 5}], [qw{2 2 3 3 4 4}, ('') x 3], [('') x 3, qw{2 2 3 3 4 4}], [('') x 2, qw{2 2 3 3 4 4}, ('') x 3], [qw{2 2 3 3 4 4}, (undef) x 3], [(undef) x 3, qw{2 2 3 3 4 4}], [(undef) x 2, qw{2 2 3 3 4 4}, (undef) x 3], [(undef) x 2, ('') x 2, qw{2 2 3 3 4 4}, ('') x 2, (undef) x 3], ); plan tests => 0+@tests; ok(get_max_count($_) == 3) for @tests; sub get_max_count { my ($data) = @_; my ($inst, $key, %consec, $last); for (@$data) { $_ = UNDEF unless defined; $last = "$_:$_" unless 0+keys(%consec); if ($_ ne $last) { $key = join '-', $_, ++$inst; $last = $_; } ++$consec{$key}; } return (sort { $b <=> $a } values %consec)[0]; }

Output:

1..12 ok 1 ok 2 ok 3 ok 4 ok 5 ok 6 ok 7 ok 8 ok 9 ok 10 ok 11 ok 12

— Ken