DEV Community

Simon Green
Simon Green

Posted on

Weekly Challenge 088

Challenge

TASK #1 › Array of Product

Task

You are given an array of positive integers @N.

Write a script to return an array @M where $M[i] is the product of all elements of @N except the index $N[i].

My solution

This is relatively straight forward. I calculate the product of all the numbers using List::Util's product function. For those that follow my posts, I tend to use only CPAN modules that are in core, like List::Util.

I then use the map function to loop over the numbers, diving the product by the number to give the solution.

Examples

» ./ch-1.pl 5 2 1 4 3
24, 60, 120, 30, 40

» ./ch-1.pl 2 1 4 3
12, 24, 6, 8
Enter fullscreen mode Exit fullscreen mode

TASK #2 › Spiral Matrix

Task

You are given m x n matrix of positive integers.

Write a script to print spiral matrix as list.

My solution

Initially I was quite stumped about the way to solve it. I was thinking I'd need some sort of counter to know how many values I would need to take and in which direction. After an hour of thinking about it (while watching the television), I figured out a reasonably clean solution. It will be interesting to see what other Team PWC members come up with.

It can be broken down to the following steps.

  1. Parse the input into an array of arrays, check that all rows are even.
  2. Create an array @used that is the same size as the input array.
  3. Have an array @directions that map the x & y movements. For example [1, 0] means to move down.
  4. Starting at the top left moving right add the value at that position to the @solutions array, and mark that position as used.
  5. If the next position is out of bounds of the array or is a value that has been used, switch directions. Continue this pattern until the @solutions array is completed.
  6. Output the values to the screen.

Examples

» ./ch-2.pl "1 2 3" "4 5 6" "7 8 9"
1, 2, 3, 6, 9, 8, 7, 4, 5

» ./ch-2.pl "1 2 3 4" "5 6 7 8" "9 10 11 12" "13 14 15 16"
1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10
Enter fullscreen mode Exit fullscreen mode

Top comments (0)