The Weekly Challenge - 373

TASK #2: List Division

You are given a list and a non-negative integer.

Write a script to divide the given list into given non-negative integer equal parts. Return -1 if the integer is more than the size of the list.


#!/usr/bin/perl
use strict;
use warnings;

...the real complexity was the formatting :-)

sub list_division {
    my ($n, @list) = @_;

    return -1 if $n > @list || $n <= 0;

    my $d = int(@list / $n);
    my $r = @list % $n;

    my @groups;

    for my $i (0 .. $n - 1) {

        my $size = $d + ($i < $r);

        push @groups, '(' . join(',', splice(@list, 0, $size)) . ')';
    }

    return '(' . join(', ', @groups) . ')';
}

my @list;
my $n;

# Example 1
@list = (1,2,3,4,5,6);
$n = 3;
print list_division($n, @list), "\n"; # Output: ((1,2), (3,4), (5,6))

# Example 2
@list = (1,2,3,4,5);
$n = 2;
print list_division($n, @list), "\n"; # Output: ((1,2,3), (4,5))

# Example 3
@list = (1,2,3);
$n = 2;
print list_division($n, @list), "\n"; # Output: ((1,2), (3))

# Example 4
@list = (1,2,3,4,5,6,7,8,9,10);
$n = 5;
print list_division($n, @list), "\n"; # Output: ((1,2), (3,4), (5,6), (7,8), (9,10))

# Example 5
@list = (1,2,3);
$n = 4;
print list_division($n, @list), "\n"; # Output: -1

# Example 6
@list = (72,57,89,55,36,84,10,95,99,35);
$n = 7;
print list_division($n, @list), "\n"; # Output: ((72,57), (89,55), (36,84), (10), (95), (99), (35))