Task1
We do the conversion according to the given base:
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More tests => 5;
my $i = 0;
my %val = map {$_ => $i++} 0..9,'A'..'Z','a'..'z','+','/';
sub reverse_base{
my ($num,$base) = @_;
my $res = 0;
for(my $n = 1; length $num; $n *= $base) {
$res += $n * $val{substr $num,-1,1,''}
}
$res
}
is reverse_base('101010',2),42,'Example 1';
is reverse_base('EEADEE',16),15642094,'Example 2';
is reverse_base('755',8),493,'Example 3';
is reverse_base('1BRJB',36),2228519,'Example 4';
is reverse_base('7MyqL',64),123456789,'Example 5';
done_testing();
Task2
We find if the two rationals are equal:
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More tests => 5;
sub rational_numbers{
my ($rat1,$rat2) = @_;
my @rats;
foreach my $r($rat1,$rat2) {
$r .= '.' if -1 == index $r,'.';
$r =~ /([-+]?\d+)\.(\d*)(?:\((\d+)\))?$/;
my ($int,$prefix,$repeated) = @{^CAPTURE};
$repeated //= '';
$repeated = $1 if $repeated =~ /^(.+?)\1+$/;
while(length $repeated &&
substr($repeated,-1,1) eq substr $prefix,-1,1) {
substr $repeated,0,0,substr $prefix,-1,1,'';
substr $repeated,-1,1,'';
if('9' eq $repeated) {
$repeated = '';
if(length $prefix) {
if($prefix =~ /9$/) {
$prefix =~ s/9+$//;
if(length $prefix) {
++$prefix
} else {
++$int
}
} else {
++$prefix
}
} else {
++$int
}
last
}
}
$repeated = '' if '0' eq $repeated;
$prefix = '' if '' eq $repeated && '0' eq $prefix;
push @rats,"$int|$prefix|$repeated"
}
return $rats[0] eq $rats[1]
}
is rational_numbers('0.(12)','0.(121)'),'','Example 1';
is rational_numbers('0.1(23)','0.12(32)'),1, 'Example 2';
is rational_numbers('0.1(234)','0.12(342)'),1,'Example 3';
is rational_numbers('12.99(99)','13.'),1,'Example 4';
is rational_numbers('0.(123)','0.1(231)'),1,'Example 5';
done_testing();
No comments:
Post a Comment