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
56
57
58
|
#!/usr/bin/perl
use warnings;
sub nflip2(\@\@) {
local (*p0arr,*saarr) = @_;
my $nftot=0;
for my $l (0.. $#p0arr) {
$nftot += ($p0arr[$l] != $saarr[$l]);
}
return $nftot;
}
sub nflip($\@) {
local ($p0,*sa) = @_;
my @p0arr = split("",$p0);
my $nftot=0;
for my $t (@sa){
my @saarr = split("",$t);
$nftot += nflip2(@p0arr,@saarr);
}
return $nftot;
}
sub doit($$) {
my ($B,$S) = @_;
print "\n$B,$S\n";
my @sa=unpack("(a$S)*",$B);
my @ba=map {nflip( $_,@sa)} @sa;
my $low=$S * @ba;
my $lidx=0;
for my $t (0 .. $#ba) {
if ($low> $ba[$t]){
$low= $ba[$t];
$lidx=$t;
}
}
print "Output: $ba[$lidx]\n";
print "Reference: $lidx: $sa[$lidx]\n";
print "Binary Substrings:\n";
my @p0arr = split("",$sa[$lidx]);
for my $t (@sa) {
my @saarr = split("",$t);
my $nftot = nflip2(@p0arr,@saarr);
print "\"$t\": $nftot flips";
print " tot make it \"$sa[$lidx]\"" if ($nftot);
print "\n";
}
}
$B = "101100101"; $S = 3;
doit($B,$S);
$B = "10110111"; $S = 4;
doit($B,$S);
|