# The Weekly Challenge - 252 (January 15th 2024)

## Task #1: Special numbers

You are given an array of integers, @ints.

Write a script to find the sum of the squares of all special elements of the given array.

An element $int[i] of @ints is called special if i divides n, i.e. n % i == 0. Where n is the length of the given array. Also the array is 1-indexed for the task.

**Example 1**

Input: 1,2,3,4 Output: 21

**Example 2**

Input: 2,7,1,19,18,3 Output: 63

## Solutions

We write three solutions this week. The first in pure Perl, the second using the library `Math::Prime::Util`

to do the “heavy lifting”, the third adds in `List::Util`

.

In the pure perl version we loop through each index and IF the index is a divisor we add the square to the running total. Note we use `||`

to replace `unless`

within a postfix `for`

. Could use a `grep`

to do the filtering but it’s slower.

The library version, replaces the filtering with retrieving the divisors using `Math::Prime::Util`

. This greatly speeds up the code for larger lists.

I looked at `List::Util`

‘s `sum0`

– but because of the need for a `map`

and function calls, just using an single variable to total the

values runs about 25% faster. I’ve always wondered why with many of the functions in `Util::List`

why `sum0`

, `prod`

can’t take a call-back like `map`

to improve performance in these cases.

#### 252_1_special_numbers.pl - perl

`sub special_numbers {`

my $t=0;

(@_%$_) || ($t+=$_[$_-1]**2) for 1..@_;

$t

}

use Math::Prime::util qw(divisors);

sub special_numbers_prime {

my $t=0;

$t+=$_[$_-1]**2 divisors @_;

$t

}

use List::Util qw(sum0);

sub special_numbers_prime_list_util {

sum0 map { $_[$_-1]**2 } divisors @_

}

## Task #2: Unique Sum Zero

You are given an integer, $n.

Write a script to find an array containing $n unique integers such that they add up to zero.

**Example 1**

Input: 1 Output: 0

**Example 2**

Input: 2 Output: -1, 1

**Example 3**

Input: 3 Output: 0, -1, 1

**Example 4**

Input: 5 Output: -7, 0, 1, 2, 4

## Solution

Rarely is task 2 easier to code than task 1 – but in this case it is.

We note that for even `n`

we can just choose a list containing -i & i.

We note that for one `n`

we can just do the same and add a 0.

#### 252_2_unique_sum_zero.pl - perl

`sub unique_sum_zero {`

($_[0]%2) ? (0) : (), map { -$_,$_ } 1 .. $_[0]/2

}

## About The Weekly Challenge

The weekly challenge was set up Mohammad Anwar approximately 5 years ago - each Monday two problems are set for the "team" to solve.

These are posted at: