The weekly challenge 384 - Task 2: Special Binary Substrings
1 #!/usr/bin/env perl
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 use v5.36;
51
52 special_binary_substrings("0101");
53 special_binary_substrings("000111");
54 special_binary_substrings("000011");
55 special_binary_substrings("10011100");
56 special_binary_substrings("00000");
57
58 sub special_binary_substrings($binary) {
59 say "Input: \"$binary\"";
60 my @result = ();
61 my $seen = {};
62 my $len = length($binary);
63 foreach my $start (0..$len-1) {
64 foreach my $length (1..$len-$start) {
65 my $str = substr($binary, $start, $length);
66 next if $seen->{$str};
67 if(is_special($str)) {
68 push @result, $str;
69 $seen->{$str} = 1;
70 }
71 }
72 }
73 say "Output: (" . join(", ", map {"\"$_\""} @result) . ")";
74 }
75
76 sub is_special($binary) {
77 return 0 if length($binary) % 2;
78 my $left = substr($binary, 0, length($binary)/2);
79 my $right = substr($binary, length($binary)/2, length($binary)/2);
80 if($left =~ m/^0+$/) {
81 return 1 if $right =~ m/^1+$/;
82 } elsif ($left =~ m/^1+$/) {
83 return 1 if $right =~ m/^0+$/;
84 }
85 return 0;
86 }