package BinaryGap; use Modern::Perl; # use List::MoreUtils qw(first_index); # codility does not have use List::Util qw(max first); use Data::Dumper; sub solution { # N is an integer within the range [1..2,147,483,647] my ($N) = @_; my $max_gap = 0; # Make sure number is in acceptable range, if not return 0 if (($N < 1) || ($N > '2147483647')) { return $max_gap; } # convert integer to binary my $bin_num = unpack("B*", pack("N", $N)); # convert to array my @bin_array = split('',$bin_num); # find first 1. If there is not one, return for performance my $first_index; for (0 .. $#bin_array) { if ($bin_array[$_] == 1) { $first_index = $_; last; } } return $max_gap unless $first_index; # If there are less than two 1s in the array, return 0 my $ones_total_count = grep { $_ == 1 } @bin_array; if ($ones_total_count < 2) { return $max_gap; } # If there is just one 0 in the array, return 0 my $zeros_total_count = grep { $_ == 0 } @bin_array; if ($zeros_total_count < 2) { return $max_gap; } # Get all 1 indexes my @i = grep { $bin_array[$_] == 1 } 0 .. $#bin_array; my $last_index = $i[$#i]; my $zero_count = 0; for my $index ($first_index .. $last_index) { my $num = $bin_array[$index]; if ($num == 1) { $zero_count = 0; } else { $zero_count++; $max_gap = max($zero_count, $max_gap); } } return $max_gap; } 1; __END__ =pod =encoding utf8 =head1 NAME BinaryGap - Find longest sequence of zeros in binary representation of an integer. If there is none, this returns 0.