I’m not even going to try to come up with something clever to tie this to music; just thinking about the first task makes my brain swim. So I’m tackling the second task first.
Task 2: Submatrix Sum
You are given a NxM
matrix A
of integers.
Write a script to construct a (N-1)x(M-1)
matrix B
having elements that are the sum over the 2x2
submatrices of A
,
b[i,k] = a[i,k] + a[i,k+1] + a[i+1,k] + a[i+1,k+1]
Example 1
Input: $a = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12] ] Output: $b = [ [14, 18, 22], [30, 34, 38] ]
Example 2
Input: $a = [ [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1] ] Output: $b = [ [2, 1, 0], [1, 2, 1], [0, 1, 2] ]
Approach
The approach here is fairly straightforward: accept the input matrix, determine the size M
and N
, then run through the calculations to determine the elements for the sums of the 2×2 submatricies. Jorg Sommrey was even kind enough to give us the formula.
Raku
sub submatrixSum(@a) { # subtract 1 because we're 0-indexed my $M = @a.elems - 1; # rows my $N = @a[0].elems - 1; # columns # we are ASSUMING the matrix is consistent with # each row having the same number of columns my @b; for 0 .. $M - 1 -> $i { for 0 .. $N - 1 -> $k { @b[$i;$k] = @a[$i; $k] + @a[$i; $k+1] + @a[$i+1;$k] + @a[$i+1;$k+1]; } } return @b; }
View the entire Raku script for this task on GitHub.
Perl
sub submatrixSum(@a) { my $M = $#a; # rows my $N = $#{$a[0]}; # columns # we are ASSUMING the matrix is consistent with # each row having the same number of columns my @b; foreach my $i ( 0 .. $M - 1 ) { push @b, []; foreach my $k ( 0 .. $N - 1 ) { $b[$i]->[$k] = $a[$i]->[$k] + $a[$i]->[$k+1] + $a[$i+1]->[$k] + $a[$i+1]->[$k+1]; } } return @b; }
View the entire Perl script for this task on GitHub.
Python
def submatrixSum(a): # subtract 1 because we're 0-indexed M = len(a) - 1 # rows N = len(a[0]) - 1 # columns # we are ASSUMING the matrix is consistent with # each row having the same number of columns b = [] for i in range(M): # range is 0 .. M-1 row = [] for k in range(N): row.append( a[i ][k] + a[i ][k+1] + a[i+1][k] + a[i+1][k+1] ) b.append(row) return b
View the entire Python script for this task on GitHub.
Task 1: Shortest Distance
You are given a string
and a character
in the given string.
Write a script to return an array of integers of size same as length of the given string such that:
distance[i] is the distance from index i to the closest occurrence of the given character in the given string. The distance between two indices i and j is abs(i - j).
Example 1
Input: $str = "loveleetcode", $char = "e" Output: (3,2,1,0,1,0,0,1,2,2,1,0) The character 'e' appears at indices 3, 5, 6, and 11 (0-indexed). The closest occurrence of 'e' for index 0 is at index 3, so the distance is abs(0 - 3) = 3. The closest occurrence of 'e' for index 1 is at index 3, so the distance is abs(1 - 3) = 2. For index 4, there is a tie between the 'e' at index 3 and the 'e' at index 5, but the distance is still the same: abs(4 - 3) == abs(4 - 5) = 1. The closest occurrence of 'e' for index 8 is at index 6, so the distance is abs(8 - 6) = 2.
Example 2
Input: $str = "aaab", $char = "b" Output: (3,2,1,0)
Approach
The approach we should take is pretty much outlined in the description of the example: first generate a list of what indices the target character occurs at, then calculate the closest occurrence based on abs(x - y)
where x
and y
are the positions of the current character and an occurrence of the target character.
Raku
sub shortestDistance($str, $char) { # split the string into an array of characters my @strchar = $str.split('', :skip-empty); # find the positions of the target $char my @pos = (0 .. @strchar.end).grep: { @strchar[$_] eq $char }; my @output; for 0 .. @strchar.end -> $i { # find the distances my @distance = @pos.map: { abs($i - $_) }; # find the minimum distance @output.push( @distance.min ); } return @output; }
View the entire Raku script for this task on GitHub.
Perl
sub shortestDistance($str, $char) { # split the string into an array of characters my @strchar = split(//, $str); # find the positions of the target $char my @pos = grep { $strchar[$_] eq $char } 0 .. $#strchar; my @output; foreach my $i ( 0 .. $#strchar ) { # find the distances my @distance = map { abs($i - $_) } @pos; # find the minimum distance push @output, min(@distance); } return @output; }
View the entire Perl script for this task on GitHub.
Python
def shortestDistance(s, c): # split the string into an array of characters strchar = list(s) # find the positions of the target char pos = [ x for x in range(len(s)) if strchar[x] == c ] output = [] for i in range(len(s)): # find the distances distance = [ abs(i - p) for p in pos ] # find the minimum distance output.append( min(distance) ) return output
View the entire Python script for this task on GitHub.
Here’s all my solutions in GItHub: https://github.com/packy/perlweeklychallenge-club/tree/master/challenge-248/packy-anderson