/
ch-1.pl
55 lines (51 loc) · 1.31 KB
/
ch-1.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/usr/bin/perl ;
use strict ;
use warnings ;
use POSIX qw ( floor ) ;
sub toBinary {
my $num = shift ;
my @nums ;
while ( $num != 0 ) {
my $remainder = $num % 2 ;
push @nums, $remainder ;
$num = floor ( $num / 2 ) ;
}
return reverse @nums ;
}
sub countChars {
my $string = shift ;
my $searched = shift ;
return scalar ( grep { $_ eq $searched } split ( // , $string ) ) ;
}
sub myFlip {
my $string = shift ;
my $len = length $string ;
for my $i ( 0..$len - 1) {
if ( substr( $string , $i , 1 ) eq "1" ) {
substr( $string , $i , 1 ) = "0" ;
}
else {
substr( $string , $i , 1 ) = "1" ;
}
}
return $string ;
}
my @flippedArrs ;
my @digits = toBinary ( $ARGV[0] ) ;
my $len = scalar @digits ;
my $binary = join ( '' , @digits ) ;
for my $l (0 .. $len - 1 ) {
for my $r ( $l .. $len - 1 ) {
my $flipped = substr( $binary , 0 , $l ) .
myFlip( substr( $binary , $l , $r - $l ) ) .
substr ( $binary, $r ) ;
push @flippedArrs, [ $l , $r , countChars( $flipped , "1" ) ] ;
}
}
my @sorted = sort { ${$b}[2] <=> ${$a}[2] } @flippedArrs ;
print ("L " . $sorted[0][0] . " , R " . $sorted[0][1] . "\n" ) ;
my $i = 1 ;
while ( $sorted[ $i ][ 2 ] == $sorted[ 0 ][ 2 ] ) {
print ("L " . $sorted[$i][0] . " , R " . $sorted[$i][1] . "\n") ;
$i++ ;
}