Task1
Simple base conversion:
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More tests => 5;
sub base_n{
my ($num,$base) = @_;
my @chars = ('0'..'9','A'..'Z','a'..'z','+','/');
my @digits;
if($num == 0){
@digits = (0);
} else {
while($num > 0){
unshift @digits,$num % $base;
$num = int($num / $base)
}
}
join '',map{$chars[$_]} @digits
}
is base_n(42,2),'101010','Example 1';
is base_n(15642094,16),'EEADEE','Example 2';
is base_n(493,8),'755','Example 3';
is base_n(2228519,36),'1BRJB','Example 4';
is base_n(123456789,64),'7MyqL','Example 5';
done_testing();
Task2
We enumerate each candidate and find ones which have equal length and same number of zeros and ones:
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More tests => 5;
sub special_binary_substrings {
my ($b) = @_;
my @m;
foreach my $pos(0..length($b)-1){
foreach my $len(2..length($b) - $pos) {
my $sub = substr($b,$pos,$len);
next unless $sub =~ /^(0+1+|1+0+)$/;
my ($f,$s) = $sub =~ /^(0+)(1+)$/
? ($1,$2)
: $sub =~ /^(1+)(0+)$/;
push @m, $sub if length($f) == length($s);
}
}
\@m;
}
is_deeply special_binary_substrings('0101'),
['01','10','01'],'Example 1';
is_deeply special_binary_substrings('000111'),
['000111','0011','01'],'Example 2';
is_deeply special_binary_substrings('000011'),
['0011','01'],'Example 3';
is_deeply special_binary_substrings('10011100'),
['10','0011','01','1100','10'],'Example 4';
is_deeply special_binary_substrings('00000'),[],'Example 5';
done_testing();